目录
java中有哪些集合容器?
java中的集合类主要由Collection和Map这两个接口派生而出。其中Collection接口又派生出三个子接口,分别是List、Set、Queue。所有的java集合类,都是Set、List、Queue、Map这四个接口的实现类,这四个接口将集合分成了四大类。
- List :有序可重复的集合
- Set:无序不可重复的集合
- Queue:代表先进先出的队列
- Map:代表有映射关系(key-value)的集合,key不可重复,value可重复
这些接口拥有众多的实现类,其中最常用的实现类有ArrayList、LinkedList、HashSet、TreeSet、ArrayDeque、HashMap
Java中的容器,线程安全与线程不安全的分别有哪些?
- java.util包下的集合类大多数都是线程不安全的,例如我们常用的ArrayList、LinkedList、HashSet、TreeSet、ArrayDeque、HashMap、TreeMap,这些都是线程不安全的集合类,但是他们的优点是性能好。如果需要使用线程安全的集合类,则可以使用Collections工具类提供的sychronizedXxx方法,将这些集合类包装成线程安全的集合类。
- java.util包下也有线程安全的集合类,例如:Vector、Hashtable。这些集合类都是比较古老的API,虽然实现了线程安全,但是性能很差。所以即使是需要线程安全的集合类,也建议将线程不安全的集合类包装成线程安全的集合类的方式,而不是直接使用这些古老的API。
Map接口有哪些实现类?
Map接口有很多的实现类,其中比较常用的有HashMap、LinkedHashMap、TreeMap
- 对于不需要排序的场景,优先考虑HashMap,因为它是性能最好的Map实现。它的性能好于HashTable,因为它在put时采用分段锁/CAS的加锁机制,而不是像HashTable那样,无论是put还是get都做同步处理。
- 对于需要排序的场景,如果需要按照插入顺序排序则可以使用LinkedHashMap,如果需要按照自然顺序排列甚至是自定义顺序排列,可以选择TreeMap。如果需要线程安全,则可以使用Collections工具类将上述实现类包装成线程安全的Map。
描述一下Map put的过程。
HashMap是最经典的Map实现,下面以它的视角介绍put的过程:
首先介绍一下HashMap:
- 创建对象是将加载因子初始化为0.75
- 第一次添加,需要扩容table容量为16,临界值为12(容量*加载因子)
1、首次扩容
先判断数组是否为空,若数组为空则进行第一次扩容。
2、计算索引
通过hash算法,计算键值对在数组中的索引
3、插入数据
- 如果当前位置元素为空,则直接插入数据;
- 如果当前位置元素非空,且key已经存在,则直接覆盖其Value;
- 如果当前位置元素非空,且key不存在,则将数据链到链表末尾;
- 如果添加时发现容量不够,则需要扩容。
- 若一条链表的长度达到8,并且table数组的大小>=64才会进行树化。【两个条件缺一不可】
4、再次扩容
如果数组中的元素个数超过临界值,则再次进行扩容操作。
ArrayList与LinkedList的区别
- ArrayList基于动态数组,连续内存存储,适合下标访问。扩容机制:因为数组长度固定,超出数组长度存储数据时需要新建数组,然后将老数组拷贝到新数组中,如果不是尾插法还会涉及到元素的移动。使用尾插法并指定初始容量可以极大提升性能,甚至超过LinkedList。
- LinkedList基于链表,可以存储在分散的内存中,适合做数据的插入以及删除操作,不适合查询。遍历LinkedList必须使用Iterator不能使用for循环,因为每次for循环体内通过get(i)取得某一元素时需要对list重新进行遍历,性能消耗极大。
Collection和Collections有什么区别?
- java.util.Collection 是集合类的一个顶级接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在java类库中有很多具体的实现,Collection接口的意义是为各种具体的集合提供最大化的统一操作方式,其直接继承接口有List与Set。
- Collections是集合类的一个工具类,其中提供了大量的静态方法,用于对集合中元素进行排序、搜索以及线程安全等操作。
Iterator与ListIterator有什么区别?
- Iterator可以用来遍历List和Set集合,但是ListIterator只能用来遍历List集合
- Iterator只能向前遍历,ListIterator既可以向前也可以向后遍历
- ListIterator实现了Iterator接口,并包含其他功能,比如:增加元素,替换元素等待