Java集合详解

Java集合详解

1.数组和集合的比较

数组不是面向对象的,存在明显的缺陷,集合弥补了数组的缺点,比数组更灵活更实用,而且不同的集合框架类可适用不同场合。如下:

  1. 数组能存放基本数据类型和对象,而集合类存放的都是对象,集合类不能存放基本数据类型。数组和集合存放的对象皆为对象的引用地址。
  2. 数组容易固定无法动态改变,集合类容量动态改变。
  3. 数组无法判断其中实际存有多少元素,length只告诉了数组的容量,而集合的size()可以确切知道元素的个数
  4. 集合有多种实现方式和不同适用场合,不像数组仅采用顺序表方式
  5. 集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性即可实现各种复杂操作,大大提高了软件的开发效率

2.Java集合

Java集合详解_第1张图片
Collection和Map,是集合框架的根接口。

2.1Collection的子接口:

2.1.1List接口

有序,可重复。
实现类:

  1. ArrayList:数组实现,查询快,增删慢,轻量级;(线程不安全)
  2. LinkedList:双向链表实现,增删快,查询慢 (线程不安全)
  3. Vector:数组实现,重量级 (线程安全、已过时)

注:上述所有内容都是转载大佬的,感兴趣的小伙伴可以点击链接查看大佬的博客。参考链接
ArrayList

  1. 底层是Object数组,是一个动态数组,其容量能自动增长。
  2. 是线程不安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类。
  3. 查询速度快(底层是数组可按照索引获得元素),增删速度慢(添加、删除时该元素后面的所有元素都要移动,所以添加/删除数据效率不高)。

想要深入了解ArrayList源码的小伙伴点击链接ArrayList源码分析
LinkedList

  1. 底层是双向循环链表,在此链表上每一个数据节点都由三部分组成:前指针(指向它前一个元素),数据,后指针(指向它后一个元素)。最后一个节点的后指针指向第一个节点的前指针,形成一个循环。
  2. 查询效率低(无法按照索引获得元素,因此查询效率不高),增删效率高(只需要挪动对应的指针)。
  3. 没有固定容量,不需要扩容;
  4. 需要更多的内存,每一个数据节点除了存放数据,还要存放它的前指针,和后指针。

想要深入了解LinkedListt源码的小伙伴点击链接LinkedList源码分析

Map接口

无序, 不可重复,存放键值对。
实现类:

  1. HashMap:底层是数组+链表+红黑树,访问速度快,但遍历顺序却是不确定的。key不能重复,只允许一个为null。value可以重复,允许多个null。线程不安全。
  2. LinkedHashMap:继承HashMap,与HashMap相似,只是它可以保证元素迭代的顺序。
  3. TreeMap:底层红黑树。存储时会根据key来排序,key必须要实现Comparable接口并重写CompareTo()方法。或使用有参构造传一个比较器对象给它。所以不能放入 null。
  4. Hashtable(线程安全,已过时)

HashMap

  1. 底层是数组+链表+红黑树
  2. 它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。
  3. HashMapHashMap的key不能重复,只允许一个为null。value可以重复,允许多个null。
  4. HashMap非线程安全,如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。

想要深入了解HashMap源码的小伙伴点击链接HashMap源码分析

LinkedHashMap

  1. LinkedHashMap继承HashMap,其结构与HashMap相似
  2. 它保证了元素迭代的顺序。该迭代顺序可以是插入顺序或者是访问顺序。

想要深入了解LinkedHashMap源码的小伙伴点击链接:LinkedHashMap源码分析
TreeMap

  1. 通过红黑树实现。
  2. TreeMap存储时会根据key来排序,排序方式可以是默认排序(按key的升序)或者是定制排序。
  3. 添加元素要调用CompareTo()方法和集合中已有的元素进行逐个比较,从而确定新元素在集合中的位置。所以不能放入 null。
  4. 使用无参构造,key必须要实现Comparable接口并重写CompareTo()方法。或使用有参构造传一个比较器对象给它。

Set接口

无序,不可重复。
实现类:

  1. HashSet:基于HashMap实现。用HashMap作为数据存储,无序,线程不安全。元素可以为 NULL。
  2. LinkedHashSet:基于LinkedHashMap实现。继承 HashSet,用LinkedHashMap作为数据存储,保证了元素迭代的顺序,即插入顺序。
  3. TreeSet:基于TreeMap实现,应用方法都一样;值都为new Object();

HashSet

  1. 用HashMap作为数据存储,所有元素都存放在HashMap的key上面,定义一个虚拟的 Object 对象PRESENT 作为 HashMap 的 value 。
  2. HashMap最多只允许一个key为null,所以HashSet的元素可以为 NULL。
  3. HashMap无序,线程不安全,所以HashSet也是无序,线程不安全的。

LinkedHashSet

  1. 基于LinkedHashMap实现。用LinkedHashMap作为数据存储,保证了元素迭代的顺序,即插入顺序。
  2. 继承 HashSet,其内部只定义spliterator()方法。可以直接调用父类HashSet的方法。
  3. LinkedHashSet只能实现插入顺序,不能实现访问顺序。

TreeSet

  1. 基于TreeMap实现,应用方法都一样;值都为new Object();

想要深入了解Set集合的小伙伴点击链接:Set集合

你可能感兴趣的:(java)