Java集合

63 阅读2分钟

说下Java中的集合?

image.png

List接口:继承自 Collection 接口,代表有序的、可重复的数据列表

  • 能够根据索引(下标),随机访问元素

常见的实现类:

实现类特点
ArrayList是一个容量可变非线程安全的列表,底层使用数组实现
LinkedList本质上是一个双向链表, 与ArrayList相比,其插入和删除速度更快
Vector底层也是基于数组实现,线程安全,但效率相对较低

Map接口:与 Collection 接口并列,是一个键值对集合,存储键、值和之间的映射

  • key无序,且唯一;value不要求有序,允许重复
  • 检索元素时,只要给出键值对象,就会返回对应的值对象

常见的实现类:

实现类特点
HashMapJDK1.8之前,由数组+链表组成的;JDK1.8 以后,由数组+链表/红黑树组成
LinkedHashMap继承于HashMap,底层仍然采用的是基于拉链式散列结构,即数组+链表/红黑树组成
HashTable由数组+链表组成,HashTable是线程安全的,不允许 null键和null值
TreeMap红黑树(自平衡的排序二叉树)实现,key按自然排序或Comparator排序
ConcurrentHashMap采用 Node数组+链表+红黑树实现,是线程安全的

Set接口:不允许出现重复的元素,是无序的

常见的实现类:

实现类特点
HashSet通过HashMap实现,线程不安全,HashMap的Key为HashSet存储的元素,所有Key都是用相同的Value
LinkedHashSet继承自HashSet,通过LinkedHashMap实现,使用双向链表维护元素插入顺序
TreeSet通过TreeMap实现,添加元素到集合时,按照比较规则将其插入合适的位置,保证插入后的集合仍然有序

数组和集合的区别?

  1. 数组是固定长度的数据结构,一旦创建,长度就无法改变;而集合是动态长度的数据结构,可以根据需要动态增加或减少元素
  2. 数组可以存储基本数据类型和对象;而集合只能存储对象
  3. 数组可以通过索引(下标)直接访问元素;而集合需要通过迭代器或者其他方法访问元素