Java 中的容器 Collection 和 Map

Set中不能有重复元素,通过equals方法判断

HashSet : 为快速查找而设计的Set,存入的元素必须定义hashCode()方法,可以有一个null值

TreeSet :底层为树结构(红黑二叉树),内部有序.存入的元素必须实现comparable接口,不能有null值

LinkedHashSet : 具有HashSet的查找速度,同时按照插入的顺序存储,可以有一个null值

要将自定义的类对象放入Set或者Map时应该考虑是否需要重写其equals()方法和hashCode方法,如还需实现comparable接口,equals方法与compareTo方法结果应该一致

SortedSet : 接口,唯一实现类---TreeSet

常用方法 

comparator() : 返回当前Set的comparator,或者null(表示自然顺序)

first(),last()方法:返回第一个和最后一个元素

SortedSet subSet(fromElement, toElement) 

SortedSet headSet(toElement)

SortedSet tailSet(fromElement)

Queue 队列 (接口)仅有LinkedList 和 PriorityQueue 两个实现

方法 抛出异常 返回特殊值
添加 add offer
移除 remove poll
查看 element peek

其中添加返回Boolean,移除和查看返回元素

PriorityQueue 内部的优先级实现也是通过compareTo实现的

双端队列:LinkedList 可以在队列任意一端添加或删除元素

Map

subMap()只有TreeMap才有

WeakHashMap : 弱键映射,允许释放映射所指向的对象.如果处映射外没有引用指向对象,则该对象可以被回收

ConcurrentHashMap : 线程安全的Map,不涉及同步加锁

IdentityHashMap :使用==代替equals()对键进行比较的三列映射

LinkedHashMap : 默认按照插入顺序存储,可以通过调用构造器LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)

 将顺序变为LRU(Leas-Rencently-Used,最近最少使用),可以用于定期垃圾清理,其中loadFactor为加载因子,表示当前的最大容量,最大容量等于第一个大于initialCapacity

的2的n次方的值乘以加载因子,加载因子越大表示填充越紧密,查找速度会变;而太小的话会浪费空间,默认为0.75;accessOrder为false表示按插入顺序存储,true表示LRU

默认的eqals比较对象的地址,重写equals方法

public boolean equals(Object obj){
     return (obj instanceof X) && ((X)obj).a == this.a;       
}
//其中instanceof既判断了obj是否是X的实例也判断了其是否为null

Map存储原理:内部可以看作一个list<Entry>数组,通过hashCode可以得到key的唯一hash值,通过该值计算处对应数组下标,如果对应下标处值为null则新建一个list<Entry>,然后将该键值对放入list;如果不为null则遍历list查看是否有相同的key(依据equals),如果存在则将对应的oldValue替换成value,否则直接将键值对添加到list

Map中查找元素的过程:首先利用hashCode()计算key的hash值得到数组下标,如果该下标处值为null则返回null,否则取出对应list,遍历查找对应key的键值对,如果找到了返回该键值对的value,否则返回null

散列表中的“槽位”通常称为“桶位”(bucket),为使散列分布均匀,桶的数量通常使用2的整数次方,并且用掩码代替除法

工具类 Collections

实用方法

max(),min() 

reverse(List list) 逆转所有元素的次序

rotate(List list , int distance) 将所有元素向后移动distance个位置,末尾的元素循环到前面来

shuffle(List list ,(Random rand)) 将所有元素顺序打乱可以用指定随即源

sort(List list (Comparator comp)) 按照元素的自然顺序或者提供的顺序排序

swap(List list ,int i ,int j) 交换指定表中位置i和位置j的元素,通常比自己写的代码快!!!!

disjoint(Collection c1,Collection c2) 当两个集合中没有任何元素相同时返回true

frequency(Collection c ,Object o) 返回集合中等于o的元素个数

unmodifiableXXX(? extends XXX) 将容器设置为不可变

快速报错

防止多个进程同时修改一个容器的内容等使容器不稳定的情况,例如在获取到迭代器后又添加元素再进行迭代的情况

原文地址:https://www.cnblogs.com/xiao-ji-xiang/p/9763658.html