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的值, 如果为真, ...
随机推荐
- 中国剩余定理(CRT)与欧拉函数[数论]
中国剩余定理 ——!x^n+y^n=z^n 想必大家都听过同余方程这种玩意,但是可能对于中国剩余定理有诸多不解,作为一个MOer&OIer,在此具体说明. 对于同余方程: x≡c1(mod m ...
- Sql for Oracle基本操作关键字
Sql for Oracle基本操作关键字 +SQL TOP子句 TOP 子句用于规定要返回的记录的数目 SELECT column_name(s) FROM table_name WHERE ROW ...
- tensorflow官方文档中的sub 和mul中的函数已经在API中改名了
在照着tensorflow 官方文档和极客学院中tensorflow中文文档学习tensorflow时,遇到下面的两个问题: 1)AttributeError: module 'tensorflow' ...
- jQuery serializeArray()方法改写多维对象以及自定义
jQuery客户端表单数据获取 jq在进行客户端表单数据获取我们通常用serialize或者是serizlizeArray(),两种方法,可是在serizlizeArray()返回的数据是一个数组,数 ...
- python中的类属性和实例属性
属性就是属于一个对象的数据或者函数,我们可以通过句点(.)来访问属性,同时 Python 还支持在运作中添加和修改属性. 我们先来看看类里面的普通字段: class Test(object): nam ...
- git分支管理之分支管理策略
分支管理策略 阅读: 246888 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就 ...
- LindAgile~大叔新宠~一个无所不能框架
关于她 LindAgile是大叔在这两年里的新宠儿,它主推模块化,插件化,敏捷化,主要于LindAgile基础项目,LindAgile.Http项目,LindAgile.Modules项目和几个扩展模 ...
- h5 录音
得益于前辈的分享,做了一个h5录音的demo.效果图如下: 点击开始录音会先弹出确认框: 首次确认允许后,再次录音不需要再确认,但如果用户点击禁止,则无法录音: 点击发送 将录音内容发送到对话框中.点 ...
- ETL作业调度工具TASKCTL的两个重大突破
在传统设计理念下,流程图的可视化.作业流的定义设计功能,随着作业量增加,越来越难用,越来越不适用是一个难以避免的问题.就这两个问题,我给大家分享一下TASKCTL是如何转变思路.如何突破.如何带来一些 ...
- .net core 2.0学习笔记(二):Hello World & 进阶
官网已经有一个.net core的入手教程(https://www.microsoft.com/net/core#windowscmd),但这个教程完全没有顾及全宇宙第一IDE的感受.今天就跟大家体验 ...