容器_JDK源码分析_自己简单实现ArrayList容器

这几天仔细研究下关于ArrayList容器的jdk源码,感觉收获颇多,以前自己只知道用它,但它里面具体是怎样实现的就完全不清楚了。于是自己尝试模拟写下java的ArrayList容器,简单了实现的ArrayList类中几个方法,当然这仅仅只是加深对容器的理解,因此希望我的分享也能够给大家带来帮助。

一、AyyayList到底是什么?

其实ArrayList就是一个java中的一个类而已,说起来没什么复杂的,好,既然是类,是不是就有成员属性和成员方法。点击查看ArrayList的outline,来看看他有哪些属性和方法。

注意看下我着重标记的那一块,是不是明白了什么。其实ArrayList的底层实现是一个Object数组,也就是elementData数组,它用来存储ArrayList添加的元素,这也就是为什么ArrayList为什么能够存储任何一切对象,因为它本身就是一个object数组。而size属性只是用来保存存储元素的个数,因为是私有的,所以只能通过size方法返回size的值,下面三个就是ArrayList的三个构造方法了。

二、自己简单编码实现ArrayList类

    有了上面的知识铺垫,现在可以开始编写我们自己ArrayList类了。首先创建一个MyArrayList类,因为我现在只是简单的实现ArrayList类,所以在MyArrayList类中就只有两个核心的成员属性,Object【】 elementData ;int size.在定义完属性以后,然后编写构造方法。

public class MyArrayList {
	//ArrayList的底层实现是根据数组实现,定义一个存储元素的数组,类型为object,可以存取任意类型的元素
	private Object[] elementData;
	//表示存储元素的个数
	private int size;
	//初始化elementData数组空间
	public MyArrayList(int initialCapacity){
		elementData = new Object[initialCapacity];
	}
	//重载构造方法,默认存储个数为3;
	public MyArrayList(){
		this(3);
	}
}

这里我实现了两个构造方法,构造方法主要是初始化elementData数组的大小,默认为3个,接下来在继续实现add方法。

public void add(Object o){
		//如果容器已满,则进行扩容,扩容为以前的两倍
		if(size==elementData.length){
			Object[] newArray =new Object[elementData.length*2];
			System.arraycopy(elementData,0, newArray, 0,size);
			elementData = newArray;
		}

		elementData[size] = o;
		size++;
	}

这里的话主要是有个需要扩容的地方,我这里默认扩展为原来的两倍,其实扩容的本质就是重新建立一个数组,开辟另外一片空间。相信大家看到这里基本明白了剩下的方法怎么写了,这里我就不细说了,我这里就 附上自己写的PS:我也只是简单的写了下,读者有兴趣可以自己研究,嘿嘿。

/*
 * 自己简单的实现ArrayList容器
 */
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MyArrayList {
	//ArrayList的底层实现是根据数组实现,定义一个存储元素的数组,类型为object,可以存取任意类型的元素
	private Object[] elementData;
	//表示存储元素的个数
	private int size;
	//初始化elementData数组空间
	public MyArrayList(int initialCapacity){
		elementData = new Object[initialCapacity];
	}
	//重载构造方法,默认存储个数为10;
	public MyArrayList(){
		this(3);
	}
	//添加元素的方法
	public void add(Object o){
		//如果容器已满,则进行扩容,扩容为以前的两倍
		if(size==elementData.length){
			Object[] newArray =new Object[elementData.length*2];
			System.arraycopy(elementData,0, newArray, 0,size);
			elementData = newArray;
		}

		elementData[size] = o;
		size++;
	}
	//返回元素的个数
	public int size(){
		return size;
	}
	//通过索引获取元素的值
	public Object get(int i){
		if(i<0||i>size-1){
			return null;
		}
		return this.elementData[i];
	}
	//判断是否为空
	public boolean empty(){
		return size==0;
	}
	//把ArrayList转换为数组
	public Object[] toArray(){
		return Arrays.copyOf(this.elementData,size);
	}

	public static void main(String[] args) {

		//创建myarraylist的一个容器对象
		MyArrayList myarray = new MyArrayList();
		//为容器对象添加元素
		myarray.add("fsdf");
		myarray.add("21343");
		myarray.add("21343");
		myarray.add("21343");
		myarray.add("21343");
		myarray.add("21343");
		myarray.add("21343");
		//遍历输出
		for(int i=0;i<myarray.size();i++){
			System.out.println(myarray.get(i));
		}
		System.out.println(myarray.size());
		Object[] o1 = myarray.toArray();
		for(int i=0;i<o1.length;i++){
			System.out.println(o1[i]);
		}
	}
}
时间: 2024-10-11 05:02:50

容器_JDK源码分析_自己简单实现ArrayList容器的相关文章

深入理解 spring 容器,源码分析加载过程

Spring框架提供了构建Web应用程序的全功能MVC模块,叫Spring MVC,通过Spring Core+Spring MVC即可搭建一套稳定的Java Web项目.本文通过Spring MVC源码分析介绍它的核心实现原理. Tomcat服务器启动入口文件是web.xml,通过在其中配置相关的Listener和Servlet即可加载Spring MVC所需数据.基于Spring MVC最简单的配置如下. <!-- 加载Spring配置文件 --> <context-param>

spring5源码分析系列(五)——IOC容器的初始化(三)

前言:上一篇讲到了DocumentLoader将Bean定义资源转换为Document对象,此篇我们继续后面的内容. (9)XmlBeanDefinitionReader解析载入的Bean定义资源文件 XmlBeanDefinitionReader类中的doLoadBeanDefinitions方法是从特定XML文件中实际载入Bean定义资源的方法,该方法在载入Bean定义资源之后将其转换为Document对象, 接下来调用registerBeanDefinitions启动Spring IOC容

spring5源码分析系列(四)——IOC容器的初始化(二)

前言:上一篇讲到了Xml Bean读取器(XmlBeanDefinitionReader)调用其父类AbstractBeanDefinitionReader的reader.loadBeanDefinitions方法读取Bean定义资源,此篇我们继续后面的内容. (5)AbstractBeanDefinitionReader的loadBeanDefinitions方法 方法源码如下: //重载方法,调用下面的loadBeanDefinitions(String, Set<Resource>)方法

spark core源码分析8 从简单例子看transformation

前面提到过spark自带的一个最简单的例子,也介绍了SparkContext的部分,这节介绍剩余的内容中的transformation. object SparkPi { def main(args: Array[String]) { val conf = new SparkConf().setAppName("Spark Pi") val spark = new SparkContext(conf) val slices = if (args.length > 0) args(

spring5源码分析系列(六)——IOC容器的初始化(四)

前言:上一篇讲到了解析子元素,此篇我们继续后面的内容. (15)解析过后的BeanDefinition在IOC容器中的注册 接下来分析DefaultBeanDefinitionDocumentReader对Bean定义转换的Document对象解析的流程中,在其parseDefaultElement方法中完成对Document对象的解析后得到封装BeanDefinition的BeanDefinitionHold对象, 然后调用BeanDefinitionReaderUtils的registerB

8.4 Android灯光系统_源码分析_电池灯

电池灯的Java代码在batteryservice.java中 电池的状态电量等信息由驱动获得,但驱动不会主动做这些事情,因此肯定有个App调用驱动程序读取电池信息,称这个App为A应用. 还有个App应用B,根据电量低的情况提示对话框:提示充电.对话框:将在30S内自动关机,应用A会发出一些通知 说明: (1)APP0:读取驱动,当驱动检测到电池事件发生,唤醒APP0 (2)APP1,2,3......  注册通知响应函数 (3)APP0发出通知 (4)APP1,2,3.....执行对应的函数

spark core源码分析9 从简单例子看action操作

上一节举例讲解了transformation操作,这一节以reduce为例讲解action操作 首先看submitJob方法,它将我们reduce中写的处理函数随JobSubmitted消息传递出去,因为每个分区都需要调用它进行计算: 而resultHandler是指最后合并的方法,在每个task完成后,需要调用resultHandler将最终结果合并.所以它不需要随JobSubmitted消息传递,而是保存在JobWaiter中 /** * Submit a job to the job sc

源码学习-Tomcat-02-一个简单的Servlet容器

本文会尝试介绍怎么实现一个简单的响应静态资源请求,或者servlet请求的Servlet容器. Web 服务器也称为超文本传输协议(HTTP)服务器,因为它使用 HTTP 来跟客户端进行通信的,这通常是个 web 浏览器.一个基于 java 的 web 服务器使用两个重要的类:java.net.Socket 和 java.net.ServerSocket,并通过 HTTP 消息进行通信. 一个全功能的 servlet 容器会为 servlet 的每个 HTTP 请求做下面一些工作: 当第一次调用

Java FastJson 源码分析(一) 之 简单应用

fastjson是一个性能很好的Java语言实现的JSON解析器和生成器,来自阿里的工程师开发.提供了Java对象快速序列化和发序列化的工具. 主要特点: ?快速FAST(比其它任何基于Java的解析器和生成器更快) ?强大(支持普通JDK类包括任意JavaBean Class.Collection.Map.Date或enum) ?零依赖(没有依赖其它任何类库除了JDK) 具体应用方式: 1.首先在官网上下载fastjson.jar文件,下载方式提供了以下三种: SVN:http://code.