容器_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]);
}
}
}
容器_JDK源码分析_自己简单实现ArrayList容器的更多相关文章
- JUC源码分析-集合篇:并发类容器介绍
JUC源码分析-集合篇:并发类容器介绍 同步类容器是 线程安全 的,如 Vector.HashTable 等容器的同步功能都是由 Collections.synchronizedMap 等工厂方法去创 ...
- .net core 轻量级容器 ServiceProvider 源码分析
首先看 ServiceCollection 的定义 //定义 public class ServiceCollection : IServiceCollection { private readonl ...
- 深入理解 spring 容器,源码分析加载过程
Spring框架提供了构建Web应用程序的全功能MVC模块,叫Spring MVC,通过Spring Core+Spring MVC即可搭建一套稳定的Java Web项目.本文通过Spring MVC ...
- Java容器 | 基于源码分析List集合体系
一.容器之List集合 List集合体系应该是日常开发中最常用的API,而且通常是作为面试压轴问题(JVM.集合.并发),集合这块代码的整体设计也是融合很多编程思想,对于程序员来说具有很高的参考和借鉴 ...
- java集合源码分析(三):ArrayList
概述 在前文:java集合源码分析(二):List与AbstractList 和 java集合源码分析(一):Collection 与 AbstractCollection 中,我们大致了解了从 Co ...
- spring5源码分析系列(三)——IOC容器的初始化(一)
前言: IOC容器的初始化包括BeanDefinition的Resource定位.载入.注册三个基本过程. 本文以ApplicationContext为例讲解,XmlWebApplicationCon ...
- Java容器 | 基于源码分析Map集合体系
一.容器之Map集合 集合体系的源码中,Map中的HashMap的设计堪称最经典,涉及数据结构.编程思想.哈希计算等等,在日常开发中对于一些源码的思想进行参考借鉴还是很有必要的. 基础:元素增查删.容 ...
- Java 容器 LinkedHashMap源码分析1
同 HashMap 一样,LinkedHashMap 也是对 Map 接口的一种基于链表和哈希表的实现.实际上, LinkedHashMap 是 HashMap 的子类,其扩展了 HashMap 增加 ...
- jQuery源码分析_工具方法(学习笔记)
expando:生成唯一JQ字符串(内部使用) noConflict():防止冲突 isReady:DOM是否加载完成(内部) readyWait:等待多少文件的计数器(内部) holdReady() ...
随机推荐
- React学习小结(三)
一.React数据的传输 1.属性和状态是react中数据传递的载体 2.属性是声明以后不允许被修改的东西 3.属性只能在组件初始化的时候声明并传入组件内部,并且在组件内部通过this.props获取 ...
- 移动应用/APP的测试流程及方法
1. APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间.正式测试前先 ...
- SQL Server 在Alwayson上使用内存表"踩坑"
200 ? "200px" : this.width)!important;} --> 介绍 因为线上alwayson环境的一个数据库上使用内存表.经过大概一个星期监控程序发 ...
- mac Path had bad ownership/permissions
解决方案: http://stackoverflow.com/questions/28063598/error-while-executing-plist-file-path-had-bad-owne ...
- 微软SQL Server认证最新信息(17年5月22日更新),感兴趣的进来看看哟
之前一直有在关注微软认证的一些消息,由于最新的SQL Server认证加入了2016的相关内容,导致课程资料需要大部分更新,但是微软更新相对比较慢,并且经常改版,目前发现的最新的MCP Cert Pa ...
- Spring学习(12)--- @Autowired与@Resource 对比
Spring不但支持自己定义的@Autowired注解,还支持由JSR-250规范定义的几个注解,如:@Resource. @PostConstruct及@PreDestroy. 1. @Autowi ...
- Java基本之数据类型
一.创建一个简单的Java应用程序 public class Code { public static void main(String[]args) { System.out.println(&qu ...
- java入门学习笔记之1(类的定义,代码的编译执行)
这篇文章讲解Java代码的基本执行过程 我们先抛开各种JAVA IDE,开发工具,只使用文本编辑器,以突出最本质的东西. 在Linux环境下,我们编辑一个文件: vim HelloWorld.java ...
- Caused by: java.lang.RuntimeException: by java.lang.OutOfMemoryError: PermGen space(tomcat 启动时提示内存溢出)
设置MaxPermSize大小TOMCAT_HOME/bin/catalina.bat 文件头加set JAVA_OPTS='-Xms512m -Xmx1024m -XX:MaxPermSize=51 ...
- [转] .NET领域驱动设计—初尝(疑问、模式、原则、工具、过程、框架、实践)
阅读目录: 1.1.疑问 1.1.1.UML何用 1.1.2.领域建模 1.2.模式 1.3.原则 1.5.过程 1.6.框架 1.7.项目演示 最近在研究DDD颇有收获,所以整理出来跟大家分享,共同 ...