Java常用的集合容器:HashTable、HashSet、HashMap、ArrayList、LinkedList的区别

在Java的开发中,我们经常用到HashTable、HashSet、HashMap、ArrayList、LinkedList这些集合容器,但是很少关心他们之间的区别,那么它们之间究竟有什么区别呢?其实网上这方面的文章太多了,我这里也就是记录一下,以备后续自己可查。

1、HashTable

  • 是线程安全的,且是线程同步的,在实现线程同步的时候是不需要手动来实现线程同步的,因此相对效率低。
  • 添加的顺序和保存的顺序是不一致的。
  • 添加的值中是不允许有null值的存在。
  • 底层:HashTable类继承自Dictionary类,实现了三个接口,分别是Map,Cloneable和java.io.Serializable。

2、HashSet

  • 非线程安全的,不是线程同步的。这需要自己实现线程同步:Collections.synchronizedCollection(),方法实现。
  • HashSet不能够存储相同的元素,元素是否相同的判断:重写元素的equals方法。equals方法和hashCode方法必须兼容,如:equals方法判断的是用户的名字name,那么hashCode方法返回的hashcode必须是name。
  • HashSet存储是无序的,保存的顺序与添加的顺序是不一致的,它不是线性结构,而是散列结构,(通过散列表:散列单元指向链表)。因此,HashSet的查询效率相对比较高。
  • 底层:HashSet实现了Set接口,底层也是用的是Hash算法存储数据。而且HashSet内部有HashMap类型的成员变量,方法也调用了HashMap的方法,存储的时候只不过值为null。

3、HashMap

  • 非线程安全,不是线程同步的。
  • 添加顺序和保存的顺序是不一致的。
  • 必须重写key的equals方法和hashCode方法。
  • HashMap的实际容量=容量*因子,默认为16*0.75=12.所以考虑到HashMap的添加的效率问题,根据实际情况来设计它的开始的默认的容量。
  • 添加的值中是允许有null的值存在的。
  • 底层:HashMap实现了Map接口,底层使用的是Hash算法存储数据。HashMap将数据以键值对的方式存储。

4、ArrayList

  • 非线程安全的,不是线程同步的。
  • ArrayList是通过可变大小的数组实现的,允许null在内的所有元素。
  • ArrayList中存放顺序和添加顺序是一致的。并且可重复元素。
  • ArrayList适合通过位子来读取元素。
  • 底层:ArrayList实现了List接口,底层使用的是数组,存储空间上是相邻的,所以查询起来会很方便,效率也会比LinkedList要高。

5、LinkedList

  • 非线程安全的,不是线程同步的。
  • LinkedList是通过双向循环链表来实现的。
  • 存放顺序和添加顺序是一致的。可添加重复元素。
  • 适合链表头尾操作和插入指定位置元素的操作。
  • 底层:实现了List接口,底层使用的是使用双向链表的形式,存储的数据在空间上很可能不相邻,但是他们都有一个引用连在一起,所以增删起来会很方便。

参考:https://blog.csdn.net/liu_zhenglong/article/details/79209465

参考:https://blog.csdn.net/qq_27574367/article/details/88527853

你可能感兴趣的:(Android开发,Java开发)