自己实现ArrayList
来源:互联网 发布:有关大数据的论文题目 编辑:程序博客网 时间:2024/05/16 02:44
自己实现ArrayList
Java中有一个ArrayList和C++中Vector非常的相似。
/* * 自己实现ArrayList */public class SxtArrayList { private Object[] elementData; private int size; public int size(){ return size; } public boolean isEmpty(){ return size == 0; } public SxtArrayList(){ this(10); // 默认数组的长度是10 } public SxtArrayList(int initialCapacity){ if(initialCapacity < 0){//鲁棒性 try { throw new Exception(); } catch (Exception e) { e.printStackTrace(); } } elementData = new Object[initialCapacity]; //创建大小为in...的数组 } public void add(Object obj){ //数组扩容 ensureCapacity(); elementData[size] = obj; size++; } public void add(int index, Object obj){ rangeCheck(index); //数组扩容 ensureCapacity(); System.arraycopy(elementData, index, elementData, index+1, size - index);//copy elementData[index] = obj; size++; } /* * 数组扩充函数 */ public void ensureCapacity(){ //数组扩容 if(size >= elementData.length){ Object [] newArray = new Object[size*2 + 1]; System.arraycopy(elementData, 0, newArray, 0, elementData.length);//copy elementData = newArray; } } public Object get(int index){ rangeCheck(index); return elementData[index]; } public Object set(int index, Object obj){ rangeCheck(index); Object oldValue = elementData[index]; elementData[index] = obj; return oldValue; } public void remove(int index){ rangeCheck(index); int oldMoved = size - index - 1; if(oldMoved > 0){ System.arraycopy(elementData, index+1, elementData, index, oldMoved); } elementData[--size] = null;//不在后边是防止越界 } public void remove(Object obj){ for(int i = 0; i< size; i++){ if(get(i).equals(obj)){ remove(i); } } } private void rangeCheck(int index){ if(index <0 || index >= size){ try { throw new Exception(); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args){ SxtArrayList list = new SxtArrayList(3); list.add("111"); list.add("222"); list.add("33"); list.add("1"); list.add("555"); list.remove("555"); list.set(0, "不是111"); list.add(0, "是000"); System.out.println(list.get(0));//get获取的是数组中的值所以是"是000" System.out.println(list.size()); }}
SxtArrayList相当于一个动态数组,可以在一定条件下自动变大。
其中有一个基础的数组容器是Object类型的elementData[]。
int变量size用来记录SxtArrayList中有效值的个数。
public boolean isEmpty(){ return size == 0; }
判断SxtArrayList对象是否为空。
public SxtArrayList(){ this(10); // 默认数组的长度是10 } public SxtArrayList(int initialCapacity){ if(initialCapacity < 0){//鲁棒性 try { throw new Exception(); } catch (Exception e) { e.printStackTrace(); } } elementData = new Object[initialCapacity]; //创建大小为in...的数组 }
带参数的构造函数和不带参数的构造函数。不带参数的构造函数会使用默认值通过this方式调用带参构造函数。SxtArrayList() -> SxtArrayList(int initialCapacity)。
public void add(Object obj){ //数组扩容 ensureCapacity(); elementData[size] = obj; size++; } public void add(int index, Object obj){ rangeCheck(index); //数组扩容 ensureCapacity(); System.arraycopy(elementData, index, elementData, index+1, size - index);//copy elementData[index] = obj; size++; } /* * 数组扩充函数 */ public void ensureCapacity(){ //数组扩容 if(size >= elementData.length){ Object [] newArray = new Object[size*2 + 1]; System.arraycopy(elementData, 0, newArray, 0, elementData.length);//copy elementData = newArray; } }
add是SxtArrayList的增加数据的方法。
由于参数中都为Object类型,所以SxtArrayList存放地可以是任意类型。
在添加数据之前进行判断是否现有的elementData[]数组是否可以放下新添加的数据(已经装满没)。若不能添加,则调用ensureCapacity()函数“扩大”数组elementData[]的大小。
private void rangeCheck(int index){ if(index <0 || index >= size){ try { throw new Exception(); } catch (Exception e) { e.printStackTrace(); } } }
对于数组的操作是不能离开下标的,而下标常常会产生运行时错误,rangeCheck()是用来判断下标是否越界的。
public Object get(int index){ rangeCheck(index); return elementData[index]; } public Object set(int index, Object obj){ rangeCheck(index); Object oldValue = elementData[index]; elementData[index] = obj; return oldValue; }
修改elementData[]数组位置index中存放的值,获取elementData[]数组位置index中存放的值。
public void remove(int index){ rangeCheck(index); int oldMoved = size - index - 1; if(oldMoved > 0){ System.arraycopy(elementData, index+1, elementData, index, oldMoved); } elementData[--size] = null;//不在后边是防止越界 } public void remove(Object obj){ for(int i = 0; i< size; i++){ if(get(i).equals(obj)){ remove(i); } } }
移除特定的对象,可以通过下标和Object对象方式进行查找,equals只是值判断。
阅读全文
0 0
- 自己实现ArrayList
- 自己实现ArrayList
- 自己实现一下ArrayList
- 自己实现 ArrayList
- 自己实现ArrayList
- JAVA--自己实现ArrayList
- 自己实现ArrayList内存代码
- 自己实现ArrayList类(大部分
- 12、自己实现的ArrayList
- 自己实现一个ArrayList,模仿ArrayList类的底层结构
- 实现自己的ArrayList和HashMap
- 实现自己的ArrayList和HashMap
- 实现自己的ArrayList和HashMap
- Java -- 自己实现数组列表(Arraylist)
- 自己实现一个泛型ArrayList
- 自己用java实现LinkList和arrayList
- MyArrayList——自己实现ArrayList
- 【java集合】自己实现简易的ArrayList
- UltraEdit v24破解
- Android Audio 输出 OpenSL
- 浅谈为什么要义无反顾的做游戏
- Timer,单例redis,HttpClient,反射 手记
- 图邻接表 和 括扑排序
- 自己实现ArrayList
- 使用QtCreator编译Python程序
- 委托和协议的区别
- 最近开发问题记录
- Java设计模式透析之 —— 组合(Composite)
- 首先介绍android开发环境的搭建
- Maven实战(三)--Pom.xml详解
- 拦截有序广播案例
- okhttp使用