44 容器(三)——ArrayList索引相关方法
方法都比较简单,这里列出来即可:
- add(index,ele) //忘制定下标插入元素
- add(ele)
- addAll(Collection <C> c) 泛型必须与调用add的泛型保持一致
- set(index,ele)
- remove(index)
- remove(Object)
- removeAll(Collection<C> c) 移除交集元素
- get(index) 返回制定下标的元素
- indexOf(Object o) 返回指定元素第一次出现所在的下标(正序)
- lastIndexOf(Object o ) 返回指定元素第一次出现所在的下标(倒叙)
- contains(Object) 是否包含某个元素
- containsAll(Collection<C> c)是否包含某个集合
- retainAll(Collection<C> c)保留两个集合的交集
- toArray() 返回一个Object[]数组
- clear() 清空集合
手写ArrayList
重点强调
- ArrayList的底层是数组
- 使用泛型
- 删除元素的方法使用System.arraycopy()来覆盖原数组
package _20191209; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * 手写ArrayList v1.0 * 初始化、add、toString、get、remove方法 * @author TEDU * */ public class MyArrayList<E> { //成员变量 private Object[] datas;//底层数组 private static final int DEFAULT_CAPACITY = 10;//初始容量 private static int used = 0;//当前数组中已被填充的个数 private static int size = DEFAULT_CAPACITY;//数组实际大小 //初始化 public MyArrayList() { datas = new Object[DEFAULT_CAPACITY]; } public MyArrayList(int size) {//自定义容器大小 this.size = size; datas = new Object[size]; } //、add public void add(E e) { if(used < size) { datas[used++] = e; }else { size += (size>>1); datas = Arrays.copyOf(datas,size); } } //、toString @Override public String toString() { StringBuffer sb = new StringBuffer(); sb.append("["); // for(Object o : datas) { // sb.append(o+","); // } for (int i = 0; i < used; i++) { if(i!=used-1) { sb.append(datas[i]+","); }else { sb.append(datas[i]); } } sb.append("]"); return sb.toString(); } //、get public E get(int index) { return (E) datas[index]; } //set public boolean set(int index,E element) { if(index >= used) { return false; } datas[index] = element; return true; } //、remove方法,移除后used要减一 public boolean remove(int index) { if(index >= used) { return false; } //使用arrycopy很方便 System.arraycopy(datas, index+1, datas, index, (used--)-index); return true; } public boolean remove(E element) { for (int i = 0; i < used; i++) { if(((E)datas[i]).equals(element)) { remove(i); return true; } } return false; } //indexOf 返回第一个匹配的元素所在下标,如元素不存在返回-1 public int indexOf(E element) { for (int i = 0; i < used; i++) { if(((E)datas[i]).equals(element)) { return i; } } return -1; } //lastIndexOf public int lastIndexOf(E element) { for (int i = used-1; i >= 0; i--) { if(((E)datas[i]).equals(element)) { return i; } } return -1; } //size返回集合大小 public int size() { return used; } //clear 清空集合 public void clear() { datas = new Object[DEFAULT_CAPACITY]; used = 0; } //测试 public static void main(String[] args) { MyArrayList<Integer> ml = new MyArrayList<>(); // Scanner scan = new Scanner(System.in); // String str = ""; // while(!str.contentEquals("-1")) {//输出-1推出循环 // System.out.println("请添加:"); // str = scan.nextLine(); // if(str.contentEquals("-1")) return; // ml.add(str); // System.out.println(ml);; // } //手写版ArrayList System.out.println("----------手写版ArrayList---------------"); ml.add(123); ml.add(12); System.out.println(ml); System.out.println(ml.size()); ml.set(1, 33); System.out.println(ml); ml.remove(1); System.out.println(ml); ml.add(66); ml.add(13); System.out.println(ml); ml.remove((Integer)66);//直接输入66会被认为是下标66的元素 System.out.println(ml); System.out.println(ml.indexOf((Integer)123)); ml.add(123); System.out.println(ml.lastIndexOf((Integer)123)); ml.clear(); System.out.println(ml); System.out.println(ml.size()); //正版ArrayList测试 System.out.println("---------------以下为正版ArrayList-----------------"); List<Integer> arrayList = new ArrayList<>(); arrayList.add(123); arrayList.add(12); System.out.println(arrayList); System.out.println(arrayList.size()); arrayList.set(1, 33); System.out.println(arrayList); arrayList.remove(1); System.out.println(arrayList); arrayList.add(66); arrayList.add(13); System.out.println(arrayList); arrayList.remove((Integer)66);//直接输入66会被认为是下标66的元素 System.out.println(arrayList); System.out.println(arrayList.indexOf((Integer)123)); arrayList.add(123); System.out.println(arrayList.lastIndexOf((Integer)123)); arrayList.clear(); System.out.println(arrayList); System.out.println(arrayList.size()); } }