JAVA--自己实现ArrayList
来源:互联网 发布:gson遍历json 编辑:程序博客网 时间:2024/06/05 00:30
本次实现的ArrayList并未使用泛型,以后添加。
在自己实现ArrayList之前强烈建议先看一遍JDK的源码,有助于理解。
附上一个链接深入Java集合学习系列:ArrayList的实现原理
我自己实现了ArrayList中的add,get,set,remove方法
MyArrayList:
import java.util.Arrays;/* * ArrayList的底层实现为数组 * MyArrayList暂时不考虑泛型 */public class MyArrayList { private Object[] elementData;//存放Object的数组 private int size;//ArrayList大小 public MyArrayList() { this(10);//如果不指定大小,默认大小为10 } public MyArrayList(int initSize) { if(initSize<0){ throw new IllegalArgumentException("IllegalArgument:"+initSize);//参数不合法,抛出异常 } elementData = new Object[initSize]; } public void add(Object obj) {//在末尾条件元素 checkCapacity(size+1);//插入一个元素,至少需要size+1大小的空间 elementData[this.size++] = obj; } public void add(int index,Object obj) {//在index处插入元素obj RangeCheck(index); checkCapacity(size+1);//插入一个元素,至少需要size+1大小的空间 System.arraycopy(elementData, index, elementData, index+1, size-index);//将index后的元素都后移一个位置 elementData[index] = obj; size++; } private void checkCapacity(int needCapacity) {//检查ArrayList开辟的空间是否足够,如果不足则进行扩容 if(needCapacity>elementData.length){//空间不足,扩容 Object oldelementData[] = elementData; int newSize = this.size*2+1;//扩容的空间 elementData = new Object[newSize]; elementData = Arrays.copyOf(oldelementData, newSize); } } private void RangeCheck(int index) {//检查索引是否合法 if(index<0||index>=size){ throw new IndexOutOfBoundsException("IllegalArgument"+index);//出界,抛出异常 } } public Object get(int index) {//根据索引返回对象 RangeCheck(index); return elementData[index]; } public Object set(int index,Object obj) {//将index位置置为obj RangeCheck(index); Object oldvalue = elementData[index]; elementData[index] = obj;//设置新值 return oldvalue;//返回旧值 } public Object remove(int index) {//删除index处的元素 RangeCheck(index); Object oldValue = elementData[index]; int moveNum = size-index-1; if(moveNum>0){ System.arraycopy(elementData, index+1, elementData, index, moveNum); } elementData[--size] = null;//让垃圾回收器回收 return oldValue;//返回旧值 } public boolean remove(Object obj) {//删除等于obj的元素,成功返回true,失败返回false if(obj == null){ for(int i=0;i<size;i++){ if(elementData[i]==null){ fastremove(i); return true; } } }else { for(int i=0;i<size;i++){ if(obj.equals(elementData[i])){//obj不为null,一定要在前,否则使用elementData[i]调用equals()可能导致控制在异常 fastremove(i); return true; } } } return false; } public void fastremove(int index) { int moveNum = size-index-1; if(moveNum>0){ System.arraycopy(elementData, index+1, elementData, index, moveNum); } elementData[--size] = null;//让垃圾回收器回收 } public int size(){ return this.size; } public int length() { return elementData.length; }}
测试:
public class TestMyArrayList { public static void main(String[] args) { MyArrayList List = new MyArrayList(5); //末尾插入 List.add(new A("张三")); List.add(new A("李四")); List.add(new A("王五")); List.add(new A("JACK")); List.add(new A("张三")); List.add(new A("李四")); List.add(new A("王五")); List.add(new A("JACK")); //自选位置插入 List.add(2,new A("TOM")); System.out.println(List.size()); System.out.println(((A)List.get(8)).name); //将index处置为新值 A oldA = (A)List.set(3, new A("Lucy")); System.out.println(oldA.name);//打印旧值 System.out.println(((A)List.get(3)).name);//打印新值 System.out.println(List.size()); //将index处的元素删除 oldA = (A)List.remove(3); System.out.println(oldA.name);//打印删除的元素 System.out.println(List.size()); //删除和指定对象匹配的元素 A temp = new A("Lily"); List.add(temp); System.out.println(List.remove(temp)); }}class A{ String name; public A(String name) { super(); this.name = name; }}
阅读全文
5 0
- JAVA--自己实现ArrayList
- Java -- 自己实现数组列表(Arraylist)
- 自己用java实现LinkList和arrayList
- 【java集合】自己实现简易的ArrayList
- java自己实现顺序线性表ArrayList
- java中自己实现一个ArrayList
- 自己实现ArrayList
- 自己实现ArrayList
- 自己实现一下ArrayList
- 自己实现 ArrayList
- 自己实现ArrayList
- 自己理解的java.util.ArrayList(二)实现类
- 数据结构—顺序表(自己实现Java的ArrayList)
- Java之实现自己的ArrayList与LinkedList
- 自己实现ArrayList内存代码
- 自己实现ArrayList类(大部分
- 12、自己实现的ArrayList
- ArrayList Java实现
- 获取父窗口的元素的方法
- MongoDB数据库安装配置
- jlink下载配置
- 2017年6月22日
- HDU 4331 Image Recognition 题解
- JAVA--自己实现ArrayList
- 关于mysql复合索引
- java实现截取网页中所包含的网址
- SQL Server 死锁
- CSS3 filter(滤镜)
- HashSet源码解析
- Extjs4中用到RESTful风格表格问题(update/保存按钮变灰无法使用)
- MAC下显示隐藏文件夹
- CubeMX+KEIL+stm32 c8t6驱动正交编码器显示在OLED1306上