Java 中的集合

A、java中的集合分为Value(Collection),Key - Value(Map)

存储值又分为 list 和 set。
list 是有序的,可以重复的
set 是无序的,不可以重复的。根据 equals 和 hashcode 判断,也就是说一个对象要存储在set中,必须重写equals 和 hashcode 方法

B、list的实现类:ArrayList、Vector、LinkedList(双向循环链表)

1. 底层数据结构

ArrayList、Vector底层依赖数组,查询效率较高、增删效率较低(Vector 是线程安全的,整体效率比ArrayList 低)
LinkedList底层依赖双向循环链表,增删效率高,查询效率低

2. 存储元素方面

ArrayList、Vector、LinkedList中的元素有序,可重复允许null值

3. 扩容方面

ArrayList 一次扩容1.5倍
Vector 根据增量扩容,增量为0,扩容两倍;否则原容量 + 增量
LinkedList 没有扩容

4. 线程安全方面

ArrayList、LinkedList 线程不安全(如果有多个线程需要同时访问List集合中的元素可以考虑使用Collections将集合包装成线程安全的集合)
Vector 线程安全

C、set 接口实现类:HashSet、LinkedHashSet、TreeSet

HashSet

  1. 不能有相同的元素,可以有一个null元素,存入的元素是无序的
  2. 底层数据结构是哈希表,哈希表就是存储一系列的表,哈希值是由对象的hashCode() 生成
  3. 确保唯一性的两个方法:hashCode() 和 equals() 方法
  4. 非线程安全

LinkedHashSet

  1. 不能有相同的元素,可以有一个null 值,元素严格按照放入的顺序排列
  2. 底层数据结构由哈希表和链表组成
  3. 链表保证了元素的有序即存储和取出一致,哈希表保证了元素的唯一性
  4. 非线程安全

TreeSet

  1. 不能有相同的元素,不可以有null 值,根据元素的自然排序进行排序
  2. 底层的数据结构是红黑树(一种自平衡二叉查找树)
  3. 非线程安全

D、Map的实现类:HashMap、HashTable、TreeMap、LinkedHashMap

HashMap

  • 线程不安全,效率高。允许null 键和null 值

  • 是基于哈希表的Map接口实现。哈希表的作用是用来保证键的唯一性的。

  • 常用实例化方法:

     new HashMap<Object,Object>();
    

HashTable

  • 线程安全,效率低。不允许null 键和null 值

LinkedHashMap

  • 是基于Map接口的哈希表和链接列表实现有序

  • 由哈希表保证键的唯一性

  • 由链表保证键的有序(存储和取出的顺序一致)

  • 常用实例化方法:

    new LinkedHashMap<Object,Object>();
    

TreeMap

  • 是基于红黑树的Map接口的实现

  • 构造方法

    TreeMap();  //使用键的自然顺序构造一个新的、空的数映射
    //构造一个新的、空的树映射,该映射根据给定比较器进行排序
    TreeMap(Comparator<?super K>comparator)
    

HashMap 与 HashTable,HashTable 与 ConcurrentHashMap的区别

  1. HashMap是可以把null 作为Key 或者Value 的,而HashTable 是不可以的
  2. HashMap 是线程不安全的,效率较高。而HashTable是线程安全的,效率较低
  3. ConcurrentHashMap也是线程安全的,就是把一个大的Map,分成若干个小的Map并分别加上锁,因此效率高于HashTable。
posted @ 2020-03-23 00:46  小白yun  阅读(151)  评论(0)    收藏  举报