Iterable
可迭代接口,Collection实现了该接口。方法:
remove():
hasNext():
next():
Collection
集合的根接口,有着数学中的集合的基本操作方式,如:(用的集合是ArrayList)
add:添加元素
remove:删除元素
clear:清空
removeAll(b):清除与b集合中的交集(取差集)
addAll(b):添加b集合中的所有元素(类似于取并集,但是不会合并重复选项,可以用Hashset作为主调集合,这样就可以消除相同元素了)
retainAll(b):只保留与b集合中的交集(取交集)
containsAll(b):判断集合中是否包含b集合中的所有元素
isEmpty:判断是否为空
contains:判断是否包含某元素
Collection作为接口提供了基础方法,实现类因为内部业务的不同,在实现功能上有些差别。
Iterator
迭代器,用于集合的迭代。集合都有iterator方法可以生成迭代器,方法next会生成一个新的对象,对其修改,不会修改集合元素的内容,但是可以使用remove删除元素。如果使用迭代器时,调用集合自己修改了本身,则迭代器会报错。
方法就是Iterable的方法,即转为该类后,集合只能正向遍历和删除元素。
Predicate
集合的判断器,用于定义集合元素的判断条件。接口为test;
Stream
专门为集合定义的快速遍历并进行特定操作的类,不需要在专门写函数去实现遍历;
Set
无序集合,与Map集合有很大关系,虽然不属于一个体系,但是Set的类都是以Map为底层实现的,以存储对象为map的key,value统一为Set集合加载时创建的final静态Object类对象。
HashSet
常用的Set类型,使用Hash算法存储数据,判断相等使用hashcode和equals两个方法同时判断,都满足才行。
equals相等,hashcode不同,存放在不同位置,但是可能存在相同的对象,重复存放。
equals不等,hashcode相等,比较麻烦,会放在同一位置然后用链表相链,效率低下。
重写equals时,尽量保证equals和hashcode对比结果一致。
可以加入null元素。
LinkedHashSet
HashSet子类,使用双向链表维护加入顺序。
遍历时由于链表对于顺序的维护,会有较好的性能。遍历顺序总是按照存入顺序。
但插入和删除操作,都会有较差的性能。
允许null值。
TreeSet
采用红黑树结构存储,实现了sortedset接口,总是处于排序状态,自然情况下,根据数值大小排序。
存入的必须是同类对象,因为要比较排序。
重写equals方法时要保证和compareTo方法结果一致。
元素内容被改变后,TreeSet不会改变已排序的顺序,而且会出现无法删除被改动的元素的情况,只有当发生了新的数据被删除或添加时,会重新判断排序。之后可以正常操作。
compareto是唯一的判断标准,要想改变排序方式,可以重写这个函数。
不允许加入null元素。
EnumSet
枚举类专用,以在枚举类中的顺序排序。以位向量的方式存储,空间小,效率高。
不允许加入null元素。
没有构造器,应该通过类方法创建。
Set比较
hashset和treeset常用,hashset性能较好,如果需要保持排序,使用treeset。
enumset性能最好,但只能用于同枚举类中的枚举值。
set都不是线程安全的。
Map
与Collection相对,属于两个分支,没有实现iterable接口,所以也可以说从Iterable开始就已经分道扬镳了,只是,Iterable用于遍历,没有集合的意义。Map也可以先通过keySet()和entrySet()方法,将key或entry集合转为Set集合,再用于遍历。value集合也可以通过values()方法获得。
HashMap
常用Map,通过哈希算法计算key的hashCode。HashMap主要用于判断的是hashcode,其次是equals。
先用hashcode判断位置,相同时,存放在同一位置。如果此时equals不等,会用链表相连(Java8之后,链表大于8个节点后会使用红黑树提高效率)。这会导致查询效率低下。
因为先判断hashcode,所以会出现equals相等的对象存放多个。
所以尽可能保证hashcde与equals的结果对应。
HashTable
已经比较古老的额HashTable了,同样使用equals和hashcode判断。
禁止了使用null作为key和value,如果使用,会抛出NullPointerException一场。
线程安全。
LinkedHashMap
同样使用hashcode和equals决定存储位置。
使用双向链表来维护key的插入次序,与LinkedHashSet一样。
插入和删除操作,性能较差。
遍历按照插入顺序遍历,性能较好。
允许null值。
ConcurrentHashMap
这个与HashMap有着密不可分的关系,他将数据分块(segment),并且继承了ReentrantLock,通过对每个segment加锁,线程安全。
TreeMap
使用红黑树存储,compareTo是唯一的判断标准,所以必须是compareTo和equals保持一致性。
与TreeSet类似,实现了Map接口派生的SortedMap接口。
WeakHashMap
从名字就可以看出来,他和弱引用相关,该map不会提供强引用,如果其中的key值不存在强引用,则会被垃圾回收机制回收,从该map中自动删除。
IdentityHashMap
与HashMap相似,但是该类的判断依据,严格按照key1 == key2进行。
EnumMap
key必须是枚举类的枚举值,而且必须是同一个枚举类的。必须在创建时制定他对应的枚举类。
不允许null做key,但可以做value。
未完待续