Java集合_底层原理_自定义ArrayList和LinkedList

本文深入探讨Java集合,从相关概念出发,分析Collection、Map和Iterator接口。详细讲解List、Set和Map集合的特点,以及ArrayList和LinkedList的实现原理。通过自定义ArrayList和LinkedList,理解它们的内部工作机制。
摘要由CSDN通过智能技术生成

一、相关概念

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;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值