自己实现一下ArrayList

来源:互联网 发布:java mail 附件 io 编辑:程序博客网 时间:2024/06/05 01:15

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);//返回此列表的hashCodepublic int hashCode();//返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回-1public 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{//定义它的默认长度为10private int DEFAULT_SIZE = 10;//定义每次数组扩容的大小为5private 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;}}@Overridepublic 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] = array[i];}array[index] = t;size++;}}@Overridepublic 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;}@Overridepublic void clear() {for(int i=0;i<size;i++) {array[i] = null;}}@Overridepublic boolean contains(Object b) {int i = 0;while(b != array[i]){i++;if(i==this.size) {return false;}}return true;}@Overridepublic Object get(int index) {// TODO Auto-generated method stubreturn array[index];}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic void remove(int index) {for(int i=index-1;i<this.size;i++) {array[i] = array[i+1];}}@Overridepublic void remove(Object o) {int c = this.indexOf(o);if(c > 0) {this.remove(c);}}@Overridepublic void set(int index, Object t) {array[index] = t;}@Overridepublic int size() {return size;}/** * 添加后的尺寸与原来的尺寸进行比较 **/public boolean needExpand(int afterSize){if(afterSize < length) {return false;}return true;}@Overridepublic String toString() {return (String) this.get(size);}}

这就是自己实现的ArrayList,测试了几个方法是正常的。

0 0
原创粉丝点击