-
泛型
-
特别的,使用集合时一般使用接口编程,即使用接口多态来实现
-
相关方法
-
大类 Collection ( 接口)
-
boolean add
方法- 添加元素地址
-
void clear
方法- 清空集合
-
boolean contains()
- 是否包含某元素
- 对于引用判断调用要判断是否包含的对象的equals方法
- 要求重写equals方法
-
boolean remove
- 删除元素
- 也是调用equals方法
-
boolean isEmpty()
- 判断是否为空集
-
int size()
- 长度
-
to Array()
- 转换为数组
-
子接口 List
-
add
方法有重载,可以有在指定下标加元素的方法 -
get
根据下标获取元素 (Object) -
indexOf()
lastIndexOf
第一次出现的索引与最后一次出现的索引 -
remove()
删去某下标元素- 遍历时若使用get ,则可以一边遍历一边改
-
set(n, 元素)
将索引为n的改为 元素 -
ArrayList
- 初始长度为10,改为当存入第一个元素时才赋予初始长度10
- 超过十,每加一次元素会扩容1.5倍
- 有传参集合的构造方法
-
-
迭代器
-
使用
Interator it = c. iteraior();
来返回迭代器 -
初始迭代器指向第一个元素之前的位置,
-
使用
while(it.hasNext())
{
Object obj = it.next(); //返回下一个元素,注意这个方法返回值为Object
//可能涉及类型转换
Syetem.out.println(obj); //任意操作
}
- 来迭代遍历集合
- 迭代器自身有remove方法(删除目前返回的元素),用于在迭代时删除元素而不破坏集合结构(使用集合的remove),导致迭代出错
- 迭代器要在集合结构改变完成后再获取,否则异常(这解释了remove的方法出错原因)
-
集合工具类
java.util.Collections
集合工具类-
线程安全
- 使用
Collections.synchronizedList(list);
可将list集合(假设是非线程安全的) 转换为线程安全的,同时有各个集合对应的方法 -
排序
- 使用
Collections.sort()
但是参数必须是List集合,若是Set集合要先转换成List集合(将set作为参数传进List实现类的构造方法) -
-
另一大类Map
- key 与 value 都是Object
-
但是 set (属于Collection)
- HashSet
- 底层实现是map(的key)
- 使用
add
方法时,其实是调用map.put()
将值添加到 key 部分 - 迭代器或foreach遍历
- TreeSet
- 自动排序(树结构存放时排序)
- HashSet
- 常用方法
-
map.put(K key, V value) //加键值对 map.get(Object key) //通过key获取value void clear //清空Map boolean containKey(Obejct Key) //判断是否有Key,与下面方法同调用equals方法 map.containValue(Object value) //判断是否有value boolean isEmpty() //判断是否为空 Set<K> keySet() //获取所有的键 { //用于遍历Map Set<Integer> keys = map.keySet();//返回所有key Iterator<Integer> it = keys.iterator(); //返回迭代器 while(it.hasNext()) { Integer key = it.next(); //一开始指向第一个元素之前的地方 Srring value = map.get(key); //获得value //输出等操作 } } V remove(K key) //删除键值对 int size() // 获取键值对个数 Collection<V> values() //获取所有的value map.entrySet() //返回一个Set<Map.Entry<K, V>> { /* 静态内部类,但是有键值对 用法(遍历Map) */ Set<Map.Entry<Integer, String>> set = map.entrySet(); //遍历Set Iterator<Map.Entry<Integer, String>> it = set.iterator(); while(it.hasNext()) { Map.Entry<Integer, String> entry = it.next(); Integer key = entry.getKey(); //该类实现了相关方法 String value = entry.getValue(); //输出等操作 } } //遍历相关 //使用foreach for(E a: collevtion) //map的遍历要转为set { //操作 }
-
-
HashMap
collapsed:: true- 链表与数组结合体
map.put(k, v)
方法实现-
- 新生成一个node对象
-
- 调用hashCode方法得到hash值,通过Hash算法得出将hash值转换成数组索引
- 此时注意,hash值相同则数组下标一定相同,不同却不一定不同,称为 “哈希碰撞”
-
- 在该位置比较,如果空,就直接加进数组,如果不空,就equals对比找相同k,找不到就新加,找到了就替换 v
-
map.get(k)
方法实现- 类似词典 logseq.order-list-type:: number
- 先用hashCode方法得到hash值,转为数组下标 logseq.order-list-type:: number
- 空就放回NULL logseq.order-list-type:: number
- 不空就逐个equals k, 找到就返回 value,否则NULL logseq.order-list-type:: number
-
初始化容量
- 初始为16
- 默认加载因子 为 0.75
- 数组到0.75就开始扩容(2倍)
-
重写hashCode和equals方法
- 对于自己新建类,要求重写equals方法和hashCode让存放在HashMap时符合需求
- 要求,equals成立,hashCode要相等
- 用IDE生成(一些情况下,equals方法重写完毕时,调用判断是否equals的属性的hashcode一般是相等的 (例如String)
- 这点在HashSet和HashMap都有要求
-
新特性
- JDK8后,当单向链表元素大于8,转换成红黑树,当小于6,再变回单向链表
-
HashTable
- HashMap对于key和value有null(空指针)的处理,可以有一个空指针(key)
- HashTable则不行
-
Properties
- 底层是HashMap
- key与value都是字符串,称为属性类
- 线程安全
-
TreeSet
- 无序,自动排序(升序),等同于TreeMap的key部分
- 底层是TreeMap TreeMap底层是二叉树
- 排序
- 要实现Comparale接口,并提供比较规则(自建类的话)
- Comaprable可以使用泛型 具体实现为
class Saber implements Comparable<Saber>
- 使用时会调用实现的Comparable的comparableTo的方法进行比较
- 通过返回值 >0 , < 0 , =0
- 不灵活,类本身实现接口要求比较方法改动较少
- Comaprable可以使用泛型 具体实现为
- 使用比较器实现(灵活可多个)
- 实现导自
java.util.Comparator
接口,通过return值排序 - 因为该接口时函数式接口,可以用lambda表达式或内部类
- 使用时当成参数传入TreeSet的构造方法
- 实现导自
- 要实现Comparale接口,并提供比较规则(自建类的话)
- 内部实现为自平衡二叉树
- 遍历使用Iterator遍历(iterator每次中序的取出元素)
- 无序,自动排序(升序),等同于TreeMap的key部分
-