一、相关概念
1.Java的集合类主要由三个接口派生而出,即Collection接口、Map接口和Iterator接口
虚线:接口
实线:实现类
标红:常用实现类
2.存放位置


集合相关接口和类在rt.jar,java.util包中
3.源码
按住ctrl点击List可查看源码

List继承了Collection接口

Collection继承了Iterable接口




java1.8特性:接口中default修饰的方法可带方法体
选中List按ctrl+t,可查看继承和实现类

Collection接口中定义了size()、isEmpty()等方法的规范
List接口中继承了这些规范


ArrayList中实现了这些方法,同时,ArrayList又继承了AbstractList抽象类


4.集合原理
接口(里面只放了抽象方法,用来定义规范)
抽象类(里面继承了接口的方法,可以自己实现一部分通用方法)
普通类(也叫实现类,需要重写前面接口、抽象类的所有抽象方法)
二、集合分析
1.List集合
List集合代表一个元素是有序且可重复的集合,集合中每一个元素都有其对应的顺序索引。
List集合允许添加重复元素,可以通过索引来访问指定位置的集合元素。
List常用实现类:ArrayList、LinkedList

2.Set集合
Set集合类似于一个瓶子,"装进"Set集合中的多个对象之间没有明显的顺序
Set集合不允许包含相同的元素,如果试图将两个相同的元素加入同一个Set集合中,则添加操作失败,add方法返回false,新元素不会被添加到集合中

HashSet具有以下特点:
不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化,集合元素值可以是null。
3.Map集合
Map用于保存具有映射关系的数据,Map集合中保存着两组值,一组值用于保存Map中的key,另一组值保存Map中的value。

(键值对)
三、底层分析
1.自定义ArrayList集合
package com.study.array;
/**
* 手写实现的ArrayList 通过数组的底层方式来实现
*
* @author l1
*
*/
public class MyArrayList {
// 一个数组来保存数据
private Object[] elementData;
// 数组长度,保存几个数据,长度就为几
private int size;
/**
* 通过构造方法 ,完成一些初始化 当集合被创建时,为数组定一个默认的长度
*/
public MyArrayList() {
elementData = new Object[10];// 默认定为10
}
// 添加数据
public void add(Object obj) {
// 数组长度定义为10,如果超出,复制到一个新数组中,新数组长度翻倍
if (size >= elementData.length) {
// 新数组
Object[] temp = new Object[elementData.length * 2];
// 数组的复制,将elementData数组元素复制到temp数组中
System.arraycopy(elementData, 0, temp, 0, size);
elementData = temp;
}
elementData[size++] = obj;
}
}
2.自定义LinkedList集合
package com.study.linked;
public class Node {
// 保存当前节点的数据
Object obj;
// 保存前一个节点
Node prev;
// 保存后一个节点
Node next;
// 不带参构造
public Node() {
}
// 带参构造方法,便于做节点
public Node(Object obj, Node prev, Node next) {
super();
this.obj = obj;
this.prev = prev;
this.next = next;
}
public void setObj(Object obj) {
this.obj = obj;
}
}
package com.study.linked;
public class MyLinkedList {
private Node first;// 头节点
private Node last;// 尾节点
private int size;
public void add(Object obj) {
Node node = new Node();
if (first == null) {
// 当第一个节点不存在,集合为空的时候添加第一个元素
node.prev = null;
node.next = null;
node.setObj(obj);
first = node;
last = node;
} else {
// 当第一个节点存在之后,只需要往后关联
node.prev = last;
node.next = null;
node.setObj(obj);
last.next = node;
last = node;
}
}
}
本文深入探讨Java集合,从相关概念出发,分析Collection、Map和Iterator接口。详细讲解List、Set和Map集合的特点,以及ArrayList和LinkedList的实现原理。通过自定义ArrayList和LinkedList,理解它们的内部工作机制。

1108

被折叠的 条评论
为什么被折叠?



