欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaSE 集合

程序员文章站 2022-07-04 16:01:50
...

一、集合概述

  • 集合实际上就是一个容器,一个对象,可以容纳多个数据、多个对象
    但集合不能直接存储基本类型数据,也不能直接存储Java对象,集合存储的是Java对象的内存地址(或者说是引用)
  • 在Java中每一个不同的集合,底层会对应不同的数据结构,往不同的数据结构中存储元素,相当于把数据放到了不同的数据结构中(即不同的数据结构,数据存储方式不同)
  • 所有的集合类和集合接口都在 java.util 包下

二、集合继承结构图

  • 在Java中集合分为两大类:
  1. 单个方式存储元素(Collection)
    这一类集合中超级父接口:java.util.Collection;
  2. 键值对<K,V>的方式存储元素(Map)
    这一类集合中超级父接口:java.util.Map;
  • 引用图片:
    JavaSE 集合
    JavaSE 集合
    JavaSE 集合

三、Collection

1. Iterable

  • 所有集合元素都是可迭代的,可遍历的,Iterable有一个Iterator()方法,返回一个Iterator对象

2. Collection

  • 继承自Iterable(is a),可调用Iterable里的Iterator()方法实现集合的迭代(遍历),所有集合继承Iterable的含义是,所有的集合都是可迭代的

3. Iterator

  • 与Collection是关联关系(has a)
  • 迭代器,包含hasNext()、next()、remove()方法

4. List

  • 继承自Collection(is a)
    存储元素特点:有序可重复、存储的元素有下标,有序是指元素存与取的顺序相同,并不是指排序,可重复是指集合中的元素可以相同,另外元素下标从0开始,以1递增
  • 常用实现类:ArrayList、LinkedList、Vector

4.1 ArrayList

  • 实现了List接口(like a)
  • 底层是可变长数组,查询快、增删改慢,因为底层数组操作连续的内存空间,只适合查询,不适合频繁的增删
  • ArrayList效率高(绝大部分使用),但线程非安全
  • ArrayList底层数组扩容机制问题
    ArrayList底层数组默认长度是10,每次元素进来判断是否溢出,有溢出则扩大为原来的1.5倍

4.2 LinkedList

  • 实现了List接口(like a)
  • 底层采用双向循环链表,查询慢、增删改快,因为底层操作链表,链表存储元素在空间上没有顺序,在查询的时候只能从头结点开始查找,所以查询效率低,但是增删的时候可以进行断链操作,所以增删效率高
  • LinkedList效率高,但线程非安全

4.3 Vector

  • 实现了List接口(like a)
  • 底层是可变长数组,线程安全,但效率低,很少使用(控制线程安全有其他更好的方案)

5. Set

  • 继承自Collection(is a)
    存储元素特点:无序不可重复、存储的元素没有下标,无序是指元素存与取的顺序不同,且集合中的元素不能重复
  • 常用实现类:HashSet、TreeSet
    子接口:SortedSet

5.1 HashSet

  • 实现了Set接口(like a)
  • 底层是一个哈希表(散列表),即HashMap(底层实际上new了一个HashMap集合),向HashSet集合中存储元素实际上存储在了HashMap集合中
public HashSet() {
    map = new HashMap<>();
}
  • 添加元素的方法 .add()
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

5.2 SortedSet

  • 继承自Set(is a)
  • 实现类:TreeSet
  • 存储元素特点:
    无序不可重复、存储的元素没有下标(因为继承了Set集合),但是放在SortedSet集合中的元素可以自动按照大小排序,称为可排序集合

5.3 TreeSet

  • 实现了SortedSet接口(like a)
  • 底层是一个二叉树,即TreeMap(底层实际上new了一个TreeMap集合),向TreeSet集合中存储元素实际上存储在了TreeMap集合中
public TreeSet() {
    this(new TreeMap<E,Object>());
}

四、Map

  • Map集合与Collection集合没有关系
  • Map集合以key,value键值对的方式存储元素,其中key起决定性作用,所有Map集合的key都是无序不可重复的(和Set集合存储元素特点相同)
  • key和value都是存储Java对象的内存地址
  • 常用实现类:HashMap、Hashtable
    子接口:SortedMap

1. HashMap

  • 实现了Map接口(like a)
  • 底层是哈希表,线程非安全

2. Hashtable

  • 实现了Map接口(like a)
  • 底层是哈希表,线程安全,但效率较低,使用较少(控制线程安全有其他更好的方案)
  • 实现类(属性类):Properties

2.1 Properties

  • Properties是线程安全的,因为继承了Hashtable,另外Properties存储元素也是按照key,value键值对的方式存储,并且key和value只支持String类型,不支持其他类型

3. SortedMap

  • 继承自Map(is a)
  • 实现类:TreeMap
  • 存储元素特点:
    无序不可重复,另外放在SortedMap集合key部分的元素会自动按照大小顺序排序,称为可排序集合

4. TreeMap

  • 实现了SortedMap接口(like a)
  • TreeMap集合底层是一个二叉树