Java集合

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。

 

 

 

 

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值