集合常见的问题
一、单列集合框架结构
Collection接口:单列集合,用来存储一个一个的对象
1、概念:
List和Set是继承Collection的两个子接口,其中List接口存储有序的可重复的数据,Set接口存储无序的不可重复的数据
- List接口:ArrayList,LinkedList,Vector
- Set接口:HashSet、LinkedHashSet,TreeSet
2、使用:
集合Collection中存储的如果是自定义类的对象,需要自定义类重写equals()方法。
- List:equals()方法
- Set:HashSet、LinkedHashSet需要重写equals()、hashCode()方法;TreeSet不需要重写方法,但是需要存储的对象实现Comparable接口,在此基础上使用compareTo方法实现排序或重写Comparator方法定制排序
3、ArrayList,LinkedList,Vector三者的异同
ArrayList线程不安全,效率更高,底层是Object[]数组存储,扩容一次扩1.5倍;Vector是线程安全的,效率低,扩容一次扩两倍
LinkedList插入删除操作效率高,只要把前后节点断开即可操作,ArrayList则需要一个一个往前往后挪位置
4、HashSet简介
HashSet在初始化时,实际上是创建了一个HashMap对象
HashSet本质是在HashMap基础上,利用HashMap的key不能重复的原理,把所有的value指向同一个Object对象,LinkedHashSet作为HashSet的子类,不同点在于可以按照添加的顺序遍历,遍历性能更佳。
5、TreeSet简介
TreeSet在初始化时,也是创建了一个TreeMap对象,因此可以照添加对象的指定属性,进行排序
二、双列集合框架结构
Map接口:双列数据,存储key-value对的数据,类似函数:y=f(x)。其中key和Entry是Set存储,而value是Collection存储。
1、HashMap简介
HashMap是Map的主要实现类,线程不安全,效率高。HashMap的实现原理:
- HashMap在第一次调用put时,底层创建长度为16的Node[]数组
- 先调用所在类的hashCode()计算key的哈希值,得到对应的Entry在数组中的存放位置,该位置为空,则添加成功;
- 该位置不为空,则比较key和以及存在的数据的哈希值,如果都不相同,则添加成功;
- 如果key的哈希值和以及存在的数据哈希值相同,继续调用key所在类的equals方法比较,如果返回不相同返回false,则添加成功;
- 如果返回true相同,则替换该key的value为新的value
HashMap扩容机制:
- 在不断的添加过程中,会涉及到扩容问题,当超出临界值(且要存放的位置非空)时,扩容。默认扩容为原来容量的2倍,并将原来的数据复制过来。
- 数组长度变为原来的2倍,表现在二进制上就是多了一个高位参与数组下标确定。此时,一个元素通过hash转换坐标的方法计算后,恰好出现一个现象:最高位是0则坐标不变,最高位是1则迁移到对应到“原位置+原数组长度”的位置。
HashMap底层典型属性的属性的说明:
- DEFAULT_INITIAL_CAPACITY : HashMap的默认容量,16
- DEFAULT_LOAD_FACTOR:HashMap的默认加载因子:0.75
- threshold:扩容的临界值,=容量*填充因子:16 * 0.75 => 12
- TREEIFY_THRESHOLD:Bucket中链表长度大于该默认值,转化为红黑树:8
- MIN_TREEIFY_CAPACITY:桶中的Node被树化时最小的hash表容量:64
HashMap如果要实现Value排序,只需要把map.entrySet()传入ArrayList的构造器里,然后调用Collections.Sort方法,传入list和自定义的比较器,然后遍历list即可
2、LinkedHashMap简介
LinkedHashMap的底层结构是HashMap,因为LinkedHashMap继承于HashMap,区别在于:
LinkedHashMap内部提供了Entry,继承于HashMap中的Node。
在遍历元素时,是按照元素添加的顺序实现遍历的,原因是底层添加了一对指针,指向前一个和后一个元素,因此遍历频繁的话,执行效率高于HashMap
3、TreeMap简介
TreeMap按照添加的key-value进行排序,底层是红黑树
4、Hashtable简介
线程安全,效率低,不能存储null的key和value。是单锁,基本上不用。
currentHashMap,也是线程安全的,是分段锁,直接用table保存数据,锁的粒度更小,减少并发冲突的概率
5、Properties简介
是Hashtable的子类常用来处理配置文件,key和value都是String类型
三、Collections
Collections是操作Collection和map的一个工具类,类似数组里的Arrays工具类
常用方法:
reverse(List):反转 List 中元素的顺序
shuffle(List):对 List 集合元素进行随机排序
sort(List):根据元素的自然顺序对指定 List 集合元素升序排序
sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换
Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
Object min(Collection):根据元素的自然顺序,返回给定集合中的最小元素
Object min(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最小元素
int frequency(Collection,Object):返回指定集合中指定元素的出现次数
void copy(List dest,List src):将src中的内容复制到dest中
boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所旧值