目录
Collection接口基本结构
Map接口基本结构
Set接口
List接口
Queue接口
Map接口
Java 集合类型分为 Collection 和 Map接口,它们是 Java 集合的根接口,这两个接口又包含了一些子接口或实现类。
Collection接口:set接口【HashSet类、Treeset类】、list接口【LinkedList类、ArrayList类和Vector类】、Queue接口
set接口
特点:数据是不能重复的、无序的和最多可以存储一个null值。
实现类:HashSet、LinkedHashSet和TreeSet。
list接口
特点:元素有序(按照添加的顺序在集合中摆放);元素可重复
实现类:ArrayList、LinkedList、Vector这三个实现类
Map接口的实现类:HashMap、ConcurrentHashMap、TreeMap、Hashtable以及Properties等
Collection接口基本结构
Map接口基本结构
黄色块为集合的接口,蓝色块为集合的实现类【来源:C语言中文网】
Set接口
1.概述
- Set接口是Collection的子接口,set接口没有提供额外的方法
- Set集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set集合中,则添加操作失败。(多用于过滤操作,去掉重复数据)
- Set判断两个对象是否相同不是使用==运算符,而是根据equals()方法
2.特点:数据是不能重复的、无序的和最多可以存储一个null值
3.实现类:HashSet、LinkedHashSet和TreeSet
4.元素添加过程:(以HashSet为例)
HashSet底层:数组+链表的结构。(JDK 7.0以前)
我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(即为:索引位置),判断数组此位置上是否已经有元素:
情况1:如果此位置上没有其他元素,则元素a添加成功。
如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较元素a与元素b的hash值:
情况2:如果hash值不相同,则元素a添加成功。
如果hash值相同,进而需要调用元素a所在类的equals()方法:
equals()返回true,元素a添加失败
equals()返回false,则元素a添加成功。—>情况3
对于添加成功的情况2和情况3而言:元素a 与已经存在指定索引位置上数据以链表的方式存储。
5.LinkedHashSet
底层:数组+双链表+红黑树
6.二叉排序树
treeset底层是二叉排序树,会将存入的元素按照从小到大(或字典序)自动排列
常用方法
//声明一个treeset
TreeSet a=new TreeSet();
a.add(1);
a.add(2);
a.add(0);
//遍历,不能用get(index)
Iterator it =a.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
List接口
1.实现类:ArrayList、LinkedList、Vector这三个实现类,底层如下
(1)ArrayList:数组实现,查询快,增删慢,轻量级;(线程不安全)
(2)LinkedList:双向链表实现,增删快,查询慢 (线程不安全)
(3)Vector:数组实现,重量级 (线程安全、使用少)
ArrayList底层:是由动态数组实现的。动态数组就是长度不固定,随着数据的增多而变长。当实例化ArrayList时(比如:List<Integer> intList = new ArrayList<>();),如果不指定它的长度,则默认为10。如果当添加的元素超过当前数组的长度时,它会新创建一个数组,长度为当前数组的1.5倍,然后将当前数组的元素复制到新的数组,当前数组的内存被释放。
LinkedList底层:是由双向链表的数据结构实现的。
由上图可以看到:双向链表是由三个部分组成:prev、data、next。prev:由用来存储上一个节点的地址;data:是用来存储要存储的数据;next:是用来存储下一个节点的地址。
2.List集合的特点
a:元素有序(按照添加的顺序在集合中摆放);
b:元素可重复
public static void main(String[] args) {
//定义集合
List list=new ArrayList<>();
//往集合中添加数据
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("aa");
list.add("bb");
//输出显示
for (Object o : list) {
System.out.println(o);
}
}
输出:aa bb cc dd aa bb
2.list集合的三种遍历方式
a:foreach循环(上面中的输出显示方式就是foreach循环)
b:for循环:
public static void main(String[] args) {
//定义集合
List list=new ArrayList<>();
//往集合中添加数据
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("aa");
list.add("bb");
//for循环
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}
}
c:迭代器
public static void main(String[] args) {
//定义集合
List list=new ArrayList<>();
//往集合中添加数据
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("aa");
list.add("bb");
//迭代器输出显示
Iterator it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
Queue接口
Map接口
1.实现类: hashMap、hashtable、LinkedHashMap
2.特点:
- 将键(key) 映射到值(value)的对象,
- 一个映射不能包含相同的key
- 一个key只能映射一个value
- 可以存储多个键值对
3.hashMap
底层是:基于哈希表(数组 + 链表 + 二叉树(红黑树)
使用:
// 创建一个映射
Map<Integer, String> dict = new HashMap<>();
// 向映射中添加一个键值对
dict.put(1, "张三");
dict.put(2, "李四");
dict.put(3, "王五");
// 根据key 获取 value
System.out.println(dict.get(1));
System.out.println(dict.get(2));
System.out.println(dict.get(3));