HashMap和HashTable
- hashMap是数组+链表结构
- 底层数组+链表实现,可以存储null键和null值,线程不安全
- 初始size为16,扩容:newsize = oldsize*2,size一定为2的n次幂
- 扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入(临界插入式线程不安全
- 计算index方法:index = hash & (tab.length – 1))
- HashTable底层数组+链表
- 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化
- 初始size为11,扩容:newsize = olesize*2+1
- 计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length
- Hashtable和HashMap都实现了Map接口,但是Hashtable的实现是基于Dictionary抽象类的
- ConcurrentHashMap
- 底层采用分段的数组+链表实现,线程安全
ArrayList和LinkedList
一般大家都知道ArrayList和LinkedList的大致区别:
- ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也有previous)
- 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
- 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references)。例如我们可以用ArrayList来存储一系列的String或者Integer。那么ArrayList和LinkedList在性能上有什么差别呢?什么时候应该用ArrayList什么时候又该用LinkedList呢?
String、StringBuffer和StringBuilder
- 长度固定,就算调用 String 的concat 方法,那也是把字符串拼接起来并重新创建一个对象,把拼接后的 String 的值赋给新创建的对象
- StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象,StringBuffer 与 StringBuilder 中的方法和功能完全是等价的。调用StringBuffer 的 append 方法,来改变 StringBuffer 的长度,
- 三者在执行速度方面的比较:StringBuilder > StringBuffer > String
- StringBuffer是线程安全的(StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰)
- 如果要操作少量的数据用 = String 单线程操作字符串缓冲区 下操作大量数据 = StringBuilder 多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
HashMap和TreeMap
HashMap:底层数组+链表实现,可以存储null键和null值,线程不安全
HashMap:适用于在Map中插入、删除和定位元素。
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
Treemap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。