JavaSE 集合
程序员文章站
2022-07-04 16:01:50
...
Java自我学习路线
一、集合概述
- 集合实际上就是一个容器,一个对象,可以容纳多个数据、多个对象
但集合不能直接存储基本类型数据,也不能直接存储Java对象,集合存储的是Java对象的内存地址(或者说是引用) - 在Java中每一个不同的集合,底层会对应不同的数据结构,往不同的数据结构中存储元素,相当于把数据放到了不同的数据结构中(即不同的数据结构,数据存储方式不同)
- 所有的集合类和集合接口都在 java.util 包下
二、集合继承结构图
- 在Java中集合分为两大类:
-
单个方式存储元素(Collection):
这一类集合中超级父接口:java.util.Collection; -
键值对<K,V>的方式存储元素(Map):
这一类集合中超级父接口:java.util.Map;
- 引用图片:
三、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集合底层是一个二叉树