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的值, 如果为真, ...
随机推荐
- CSS3浏览器兼容
不同的浏览器需要不同的前缀 -webkit chrome和safari -moz firefox -ms ie -o opera 一个炫酷标题效果: HTML: <!DOCTYPE HTML&g ...
- vs2015数据驱动的单元测试
今天在做测试的时候boss让我这个菜鸟做vs2015下c#的单元测试,并且给了我参考http://www.cnblogs.com/kingmoon/archive/2011/05/13/2045278 ...
- SpringMVC源码情操陶冶-AbstractHandlerExceptionResolver
springmvc支持服务端在处理业务逻辑过程中出现异常的时候可以配置相应的ModelAndView对象返回给客户端,本文介绍springmvc默认的几种HandlerExceptionResolve ...
- Linux日志分析ELK环境搭建
场景:ELK作为一个日志收集和检索系统,感觉功能还是相当的强大的. ELK是啥, 其实是是三个组件的缩写, 分别是elasticsearch, logstash, kibana. ELK平台可以用于实 ...
- Fliptile 翻格子游戏[Usaco2007 Open]
题目描述 Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. ...
- 教你用python写:HDU刷题神器
声明:本文以学习为目的,请不要影响他人正常判题 HDU刷题神器,早已被前辈们做出来了,不过没有见过用python写的.大一的时候见识了学长写这个,当时还是一脸懵逼,只知道这玩意儿好屌-.时隔一年,决定 ...
- vue指令v-html示例解析
更新元素的innerHTML,不会作为vue模板编译,可用组件来代替. 在网站上动态渲染任意 HTML 是非常危险的,因为容易导致 xss攻击.只在可信内容上使用 v-html,永不用在用户提交的内容 ...
- Kaggle竞赛 —— 泰坦尼克号(Titanic)
完整代码见kaggle kernel 或 NbViewer 比赛页面:https://www.kaggle.com/c/titanic Titanic大概是kaggle上最受欢迎的项目了,有7000多 ...
- 计算机四级网络工程师--《操作系统(Operating System)》重点内容学习
开篇语 今天开始看<操作系统>,没办法,计算机网络技术还算有点底子.至于操作系统要不是以前看过一些这方面的书籍,以及上学期学了单片机工作原理,我估计我真的是懵逼的!所幸,在网上找的233网 ...
- cobbler无人值守批量安装Linux系统
本文目录: 1.1 pxe安装系统 1.2 cobbler基本介绍 1.3 安装和配置cobbler 1.3.1 安装cobbler 1.3.2 配置dhcp和tftp 1.4 cobbler从本地光 ...