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的值, 如果为真, ...
随机推荐
- centos下安装并配置tomcat
1,安装jdk,centos默认安装了java-openjdk的环境,但是不带JDK,运行 yum install java-1.7.0-openjdk java-1.7.0-openjdk-deve ...
- App 组件化/模块化之路——Repository 模式
什么是 Repository 模式 Repository 这个词直译过来仓库.仓储的意思.这个意思其实也能反应出 Repository 模式作用.App 开发中少不了对数据的操作,数据的来源可能有很多 ...
- web组件工具之获取表单数据:webUtils
本文需要的架包:commons-beanutils-1.8.3.jar.commons-logging-1.1.3.jar.servlet-api.jar. 本文共分为五部分:1)封装通用工具类:从表 ...
- global,$GLOBALS[' '] 全局, 浮动float跟margin的注意事项
$a; global只能声明变量为全局,不能赋值,否则报错未定义:global $a; 相对于$GLOBALS['a'],写法是这样的,所有定义过的变量都存在这里: //浮动float跟margin的 ...
- jsp 之 解决 Mysql net start mysql启动,提示发生系统错误 5 拒绝访问的问题
在dos下运行net start mysql时 !!!提示发生系统错误 5:拒绝访问!只要切换到管理员模式就可以启动了. 所以我们要以管理员身份来运行cmd程序来启动mysql. 1.在开始菜单的搜索 ...
- log4go的日志滚动处理——适应生产环境的需要
日志处理有三类使用环境,开发环境DE,测试环境TE,生产环境PE. 前两类可以看成是一类,重要的是屏幕显示--termlog.生产环境中主要用的是socklog 和 filelog,即网络传输日志和文 ...
- Python爬虫从入门到放弃(二十二)之 爬虫与反爬虫大战
爬虫与发爬虫的厮杀,一方为了拿到数据,一方为了防止爬虫拿到数据,谁是最后的赢家? 重新理解爬虫中的一些概念 爬虫:自动获取网站数据的程序反爬虫:使用技术手段防止爬虫程序爬取数据误伤:反爬虫技术将普通用 ...
- Springboot+redis 整合
运行环境: JDK1.7. SpringBoot1.4.7 redis3.0.4 1.生成Springboot项目,分别添加web,redis依赖,具体的maven依赖如下 <dependenc ...
- suffix tree
文章出处:http://www.cnblogs.com/snowberg/archive/2011/10/21/2468588.html 3 What is a Suffix Tree Suf ...
- 线程池ThreadPoolExecutor与阻塞队列BlockingQueue应用
1.线程池介绍 JDK5.0以上: java.util.concurrent.ThreadPoolExecutor 构造函数签名: public ThreadPoolExecutor( int co ...