javaSE基础之 ArrayList的底层简单实现
最近就是想扒一扒存在硬盘里面的学习资料(突然想到什么),把以前写过的一些东西整理一下分享出来。
这边是ArrayList 的简单实现,当然只实现了部分方法
package com.yck.collection; import java.util.Iterator; /** * 手动实现ArrayList的主要功能 * ArrayList的底层实现就是数组 * */ public class MyArrayList { private Object []elementDate; // private int size; /** * 索引范围的检查 * @param index */ private void rangCheck(int index) { if(index<0 || index >= size) { try { throw new Exception(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 带参构造 * @param initicalCapacity */ public MyArrayList(int initicalCapacity) { if(initicalCapacity<0) try { throw new Exception("int cannot below 0."); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } this.elementDate = new Object[initicalCapacity]; } /** * 无参构造,使用上一个构造函数,初始化数组长度默认为10 */ public MyArrayList() { this(10); } /** * 以下是List接口的一些方法实现,主要的问题在于add 和 remove一定要记住size要跟着改变 * 方法的实现很简单,看一下就能懂 * @param obj */ public void add(Object obj) { if(size >= elementDate.length) { Object []newElementDate = new Object[size*2]; /** * 用for循环写一个复制方法。 */ for(int i=0;i<elementDate.length;i++) { newElementDate[i] =elementDate[i]; } elementDate = newElementDate; } elementDate[size] = obj; size++; } public void add(MyArrayList arr) { if((size+arr.elementDate.length)>this.elementDate.length)//是否需要扩容判断 { Object []newElementDate = new Object[(size+arr.elementDate.length)*2]; //System.arraycopy(elementDate, 0, newElementDate, 0, elementDate.length);//调用系统方法复制 for(int i=0;i<this.size;i++) { newElementDate[i] = elementDate[i]; } elementDate = newElementDate; } for(int i=0;i<arr.size;i++) { this.elementDate[size]=arr.elementDate[i]; size++; } } public void remove(int index) { this.rangCheck(index); for(int i=index;i<elementDate.length-1;i++) elementDate[i] = elementDate[i+1]; size--; } public void remove(Object obj) { for(int i=0;i<size;i++) { if(this.get(i).equals(obj)) this.remove(i); } } public Object get(int index) { this.rangCheck(index); return this.elementDate[index]; } public int size() { return this.size; } public boolean isEmpty() { if(this.size == 0) return true; else return false; } public Iterator iterator() { return new MyIt(); } private class MyIt implements Iterator //那个什么跌蛋器。。不好意思我输入法写出来是这样。。。自定义迭代器的实现 { private int cursor = -1; //游标初始值置为-1; /** * 判断是否有下一个元素 * 1、如果curror + 1 < size;说明有,返回true * 2、如果curror + 1 >size;说明没有,返回 false */ public boolean hasNext() { return cursor+1 < size; } /** * 取出下当前元素,并把游标指向下一个元素 */ public Object next() { cursor++; return elementDate[cursor]; } } public static void main(String[] args) { MyArrayList list = new MyArrayList(3); list.add("aaa"); list.add("uuu"); list.add("ddd"); list.add("eee"); System.out.println(list.elementDate.length+"..."+list.size); for(Iterator iter = list.iterator();iter.hasNext();) { System.out.println((String)iter.next()); } } }
上面有简单的测试,主要是为了测试迭代器。当时写的时候肯定是写一个方法测试一下的= =
有兴趣的朋友可以稍作修改加上泛型
javaSE基础之 ArrayList的底层简单实现的更多相关文章
- javaSE基础之 LinkedList的底层简单实现
这里贴上LinkedList底层的简单实现 package com.yck.mylinkedlist; public class Node { private Node previous; //上一结 ...
- 基础1 JavaSe基础
JavaSe基础 1. 九种基本数据类型的大小,以及他们的封装类 boolean 无明确指定 Boolean char 16bits Character byte 8bits Byte short 1 ...
- Java基础系列-ArrayList
原创文章,转载请标注出处:<Java基础系列-ArrayList> 一.概述 ArrayList底层使用的是数组.是List的可变数组实现,这里的可变是针对List而言,而不是底层数组. ...
- Java基础系列--ArrayList集合
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8494618.html 一.概述 ArrayList是Java集合体系中最常使用,也是最简单 ...
- java学习之路之javaSE基础1
<h2>java学习之路之javaSE基础1</h2> <div> ###01.01_计算机基础知识(计算机概述)(了解)* A:什么是计算机?计算机在生活中的应用 ...
- JavaSE基础:集合类
JavaSE基础:集合类 简单认识类集 我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储. 而要向存储多个对象,就不能是 ...
- javaSE基础07
javaSE基础07 一.static静态修饰符 用了static修饰的变量就会变成共享的属性,只会初始化一次,在内存中只存在一个,并且每个对象都可以访问,存放在方法区(数据共享区) 1.1 stat ...
- javaSE基础06
javaSE基础06 一.匿名对象 没有名字的对象,叫做匿名对象. 1.2匿名对象的使用注意点: 1.我们一般不会用匿名对象给属性赋值的,无法获取属性值(现阶段只能设置和拿到一个属性值.只能调用一次方 ...
- javaSE基础04
javaSE基础04 一.三木运算符 <表达式1> ? <表达式2> : <表达式3> "?"运算符的含义是: 先求表达式1的值, 如果为真, ...
随机推荐
- Nancy基于JwtBearer认证的使用与实现
前言 最近在看JSON Web Token(Jwt)相关的东西,但是发现在Nancy中直接使用Jwt的组件比较缺乏,所以就在空闲时间写了一个. 这个组件是开源的,不过目前只支持.NET Core,后续 ...
- [luogu P3787][新创无际夏日公开赛] 冰精冻西瓜 [树状数组][dfs序]
题目背景 盛夏,冰之妖精琪露诺发现了一大片西瓜地,终于可以吃到美味的冻西瓜啦. 题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有 ...
- 导出EXCEL遇到问题
EXCEL设置的格式要与写入信息的格式要匹配,比如写入信息是字符串类型,而EXCEL单元格是DATE类型则会出错.
- (转)sql通配符
背景:一次搞清sql查询中的通配符问题. 1 sql通配符 通配符主要以下几种:%._.[].[^] . 在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符.SQL 通配符必须与 LIKE ...
- (转)关于eclipse的TestNG的插件安装方法
背景:最近在学习spring 4.x时候,用到了testNG的测试方法,发现需要在eclipse安装testNG插件才能够正常进行单元测试. 1 插件安装 今天在配置eclipse+selenium+ ...
- (转)XML中必须进行转义的字符
场景:在工作中接触到很多xml文件,为了更好的操作这些文件,所有很有必要熟知xml文件的相关语义. 1 引入 编写XML代码经常遗漏的常识: XML实体中不允许出现"&", ...
- iOS TextField输入限制(限制长度、只能输入数字,只能输入数字字母……)
项目中各个地方都会用到TextField,textField的输入也会有各种需求,各种限制,每次用到的时候要重写一遍这些限制,导致各种垃圾代码,各种重复,有一天,我终于看不下去了,于是把textFie ...
- 一台机器启动多个tomcat简单配置
一台机器启动多个Tomcat只需要解决Tomcat端口冲突的问题. 相关配置:打开 Tomcat 目录下 conf \ server.xml 共修改三处端口,分别是: <Server port= ...
- C——Network Saboteur (POJ2531)
题目: A university network is composed of N computers. System administrators gathered information on t ...
- [补档][Hnoi2013]游走
[Hnoi2013]游走 题目 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一 ...