常见的数据类型对比

HashMap和HashTable

  1. hashMap是数组+链表结构
  • 底层数组+链表实现,可以存储null键和null值,线程不安全
  • 初始size为16,扩容:newsize = oldsize*2,size一定为2的n次幂
  • 扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入(临界插入式线程不安全
  • 计算index方法:index = hash & (tab.length – 1))
  1. HashTable底层数组+链表
  • 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化
  • 初始size为11,扩容:newsize = olesize*2+1
  • 计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length
  • Hashtable和HashMap都实现了Map接口,但是Hashtable的实现是基于Dictionary抽象类的
  1. ConcurrentHashMap
  • 底层采用分段的数组+链表实现,线程安全

ArrayList和LinkedList

一般大家都知道ArrayList和LinkedList的大致区别:

  1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也有previous)
  2. 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
  3. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
    ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references)。例如我们可以用ArrayList来存储一系列的String或者Integer。那么ArrayList和LinkedList在性能上有什么差别呢?什么时候应该用ArrayList什么时候又该用LinkedList呢?

String、StringBuffer和StringBuilder

  1. 长度固定,就算调用 String 的concat 方法,那也是把字符串拼接起来并重新创建一个对象,把拼接后的 String 的值赋给新创建的对象
  2. StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象,StringBuffer 与 StringBuilder 中的方法和功能完全是等价的。调用StringBuffer 的 append 方法,来改变 StringBuffer 的长度,
  3. 三者在执行速度方面的比较:StringBuilder > StringBuffer > String
  4. StringBuffer是线程安全的(StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰)
  5. 如果要操作少量的数据用 = String 单线程操作字符串缓冲区 下操作大量数据 = StringBuilder 多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

HashMap和TreeMap

HashMap:底层数组+链表实现,可以存储null键和null值,线程不安全
HashMap:适用于在Map中插入、删除和定位元素。
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
Treemap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。

posted @ 2019-10-11 15:01  luck-monkey  阅读(371)  评论(0编辑  收藏  举报