自己实现一下ArrayList
2017-03-01 21:40
316 查看
java数据结构中数组列表,ArrayList的相关实现。
package pac01;
/**
* 列表接口,定义一些列的操作
**/
public interface List<T>{
//向列表的尾部添加指定的元素
public boolean add(T t);
//在列表的指定位置插入新的元素
public void add(int index,T t);
//将列表中的所有元素添加到此列表的末尾
public boolean addAll(List<T> list);
//从列表中移除所有的元素
public void clear();
//列表中是否包含指定元素
public boolean contains(Object b);
//比较指定的对象与此列表是否相等
public boolean equals(Object c);
//获取指定位置的元素
public T get(int index);
//返回此列表的hashCode
public int hashCode();
//返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回-1
public int indexOf(Object o);
//返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
public int lastIndexOf(Object o);
//移除列表中指定位置的元素
public void remove(int index);
// 从此列表中移除第一次出现的指定元素(如果存在)
public void remove(Object o);
//用指定元素替换列表中指定位置的元素
public void set(int index,T t);
//返回列表中的元素数
public int size();
//如果是整数,那么对数据进行排序
}
这就是自己实现的ArrayList,测试了几个方法是正常的。
package pac01;
/**
* 列表接口,定义一些列的操作
**/
public interface List<T>{
//向列表的尾部添加指定的元素
public boolean add(T t);
//在列表的指定位置插入新的元素
public void add(int index,T t);
//将列表中的所有元素添加到此列表的末尾
public boolean addAll(List<T> list);
//从列表中移除所有的元素
public void clear();
//列表中是否包含指定元素
public boolean contains(Object b);
//比较指定的对象与此列表是否相等
public boolean equals(Object c);
//获取指定位置的元素
public T get(int index);
//返回此列表的hashCode
public int hashCode();
//返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回-1
public int indexOf(Object o);
//返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
public int lastIndexOf(Object o);
//移除列表中指定位置的元素
public void remove(int index);
// 从此列表中移除第一次出现的指定元素(如果存在)
public void remove(Object o);
//用指定元素替换列表中指定位置的元素
public void set(int index,T t);
//返回列表中的元素数
public int size();
//如果是整数,那么对数据进行排序
}
package pac01; /** * java中的向量类似与数组的顺序存储的数据结构,但是具有比数据更强大的功能,它是 * 允许不同类型元素共存的变长数组,也就是说,java中的向量的容量是可变的,而且他 * 还提供了许多的方法来操作处理这些数据。jdk中的向量的实现包括Vector和ArrayList * Vector是线程安全的,但是操作效率较低。相反,正是ArrayList实现的优点。实际中 * ArrayList使用较多 **/ public class ArrayList implements List{ //定义它的默认长度为10 private int DEFAULT_SIZE = 10; //定义每次数组扩容的大小为5 private int EXPAND_SIZE = 5; //向量中的元素个数 public static int size = 0 , length = 10; private Object [] array; //定义它的构造方法 public ArrayList(){ array = new Object[10]; } //定义对数据的操作的方法 /** * 将指定的元素添加到列表尾 * @return **/ @Override public boolean add(Object c){ //需要判断添加后数组能否存放的下 boolean flag = this.needExpand(size+1); if(!flag) {//不需要扩展 array[size] = c; size ++; } else { Object[] temp = array;//存放 array = new Object[DEFAULT_SIZE + EXPAND_SIZE]; this.length = array.length; this.copy(array,temp); array[size] = c; size++; } return true; } /** * 进行数组的复制 * @param array2 新的数组 * @param temp 旧的数组 */ private void copy(Object[] array2, Object[] temp) { int i = 0; for(Object o : temp) { array2[i] = o; } } @Override public void add(int index, Object t) { boolean flag = this.needExpand(size+1); if(!flag) { for(int i=size ; i>index ; i--) { array[size+1] = array[i]; } array[index] = t; size++; }else { Object[] temp = array;//存放 array = new Object[DEFAULT_SIZE + EXPAND_SIZE]; this.length = array.length; this.copy(array,temp); for(int i=size ; i>index ; i--) { array[size+1] = arra 4000 y[i]; } array[index] = t; size++; } } @Override public boolean addAll(List list) { boolean b = this.needExpand(size+list.size()); if(b == false){//不需要扩容 for(int i=0,j=this.size-1;i<list.size();i++){ array[j] = list.get(i); size++; } }else { Object [] temp = array; array = new Object[this.size+list.size()]; this.length = size+list.size(); this.copy(array, temp); for(int i=0,j=this.size-1;i<list.size();i++){ array[j] = list.get(i); this.size++; } } return true; } @Override public void clear() { for(int i=0;i<size;i++) { array[i] = null; } } @Override public boolean contains(Object b) { int i = 0; while(b != array[i]){ i++; if(i==this.size) { return false; } } return true; } @Override public Object get(int index) { // TODO Auto-generated method stub return array[index]; } @Override public int indexOf(Object o) { int index = -1; for(int i=0;i<this.size;i++){ if(o.equals(array[i])){ index = i+1; } break; } return index; } @Override public int lastIndexOf(Object o) { int index = -1; for(int i=this.size;i<0;i--){ if(o.equals(array[i])){ index = i+1; } break; } return index; } @Override public void remove(int index) { for(int i=index-1;i<this.size;i++) { array[i] = array[i+1]; } } @Override public void remove(Object o) { int c = this.indexOf(o); if(c > 0) { this.remove(c); } } @Override public void set(int index, Object t) { array[index] = t; } @Override public int size() { return size; } /** * 添加后的尺寸与原来的尺寸进行比较 **/ public boolean needExpand(int afterSize){ if(afterSize < length) { return false; } return true; } @Override public String toString() { return (String) this.get(size); } }
这就是自己实现的ArrayList,测试了几个方法是正常的。
相关文章推荐
- 自己实现了一下C++STL中的next_permutation,名为ant_next_permutation,发下代码
- 见到的一篇IOCP流程 自己用demo实现了一下, 简单照抄,改动了一点点
- iOS 判断一断代码的执行时间(从网上看的,自己实现一下)
- Java中SJBArrayList自己简单实现ArrayList
- 解释一下ArrayList Vector和LinkedList的实现和区别
- Java单态模式的实现(笔试不会的题目,鄙视自己一下)
- 自己实现一个ArrayList,模仿ArrayList类的底层结构
- 容器第三课,JDK源码分析,自己实现ArrayList数组扩容
- 自己模拟实现一下Google的赛马Doodle
- MyArrayList——自己实现ArrayList
- 见到的一篇IOCP流程 自己用demo实现了一下, 简单照抄,改动了一点点
- 小伙伴来自己实现一个ArrayList
- 自己写的一个ArrayLIST,but 不知道怎么很好的实现System底下的arraycopy方法
- 自己实现ArrayList
- 自己实现单向链表讨论一下LinkedList的效率
- 自己理解的java.util.ArrayList(二)实现类
- 数据结构—顺序表(自己实现Java的ArrayList)
- 好久不写代码,网上抄了几段代码改了一下实现自己的追书功能
- 自己动手实现ArrayList
- 实现自己的ArrayList和HashMap