JavaSE 集合

一、集合概述

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

二、集合继承结构图

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

    Collection 部分
    Map 部分

三、Collection

1. Iterable

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

2. Collection

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

3. Iterator

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

4. List

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

4.1 ArrayList

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

4.2 LinkedList

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

4.3 Vector

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

5. Set

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

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是一一对应的,所以不能存在相同的key值,但value可以相同
  • key和value都是存储Java对象的内存地址
  • 常用实现类:HashMap、Hashtable
    子接口:SortedMap
    链接: Map

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集合底层是一个二叉树
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jayco江柯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值