Java集合Collection、List、Set区别与详解

Java集合Collection、List、Set区别与详解

Collection


java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。



List、Set的详解


一、List(有序可重复的)

1、List有三个常用的实现类ArrayList,LinkedList,Vector

  • ArrayList集合底层是数组。非线程安全。适合查询,不适合频繁的随机增删元素。
  • ArrayList集合底层默认初始化容量是10,扩大之后的容量是原容量的1.5倍。
  • LinkedList 的底层数据结构是双向链表,链表适合频繁的增删元素,不适合查询操作。
  • Vector集合底层是数组,线程安全。
  • Vector集合底层默认初始化容量是10,扩大之后的容量是原容量的2倍。

2、如果优化ArrayList和Vector?

  • 尽量减少扩容操作,因为扩容需要数组拷贝。数组拷贝很耗内存。
  • 一般推荐在创建集合的时候指定初始化容量。

3、ArrayList 和 LinkedList 的区别

  • ArrrayList底层的数据结构是数组,支持随机访问。
  • LinkedList 的底层数据结构是双向链表,不支持随机访问。
  • 使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

二、Set(无序不可重复)

1、Set常用的有一个实现类HashSet和一个子接口SortedSet

  • HashSet底层实际是一个HashMap,HashMap底层采用的是哈希表数据结构。
  • HashSet其实是HashMap中的key部分。HashSet有什么特点,HashMap中的key应该具有相同的特点。
  • 存储在HashSet集合或者HashMap集合部分的元素,需要同时重写hashCode和equals方法。
  • SortedSet:无序不可重复,但存进去的元素可以按照元素大小顺序自动排列。

2、HashSet 的实现原理

  • HashSet底层由HashMap实现
  • HashSet的值存放于HashMap的key上
  • HashMap的value统一为PRESENT

3、SortedSet集合存储元素为什么可以自动排序?

  • 因为被存储的元素实现了Comparable接口,SUN编写TreeSet集合在添加元素的时候,会调用CompareTo方法完成比较。
  • 单独编写比较器,创建类并实现Comparator接口。(推荐)