JavaApi学习---ArrayList类
ArrayList类常用方法
继承体系结构图
构造方法
public ArrayList() //默认Capacity=10 public ArrayList(int initialCapacity) //提供初始容量 提供的范围在0~Integer.MAX_VALUE = 2147483647 之间 public ArrayList(Collection<? extends E> c) //提供一个集合 ArrayList<Integer> arr1 = new ArrayList<>(); ArrayList<Integer> arr2 = new ArrayList<>(20); List<Integer> list = new ArrayList<>(); ArrayList<Integer> arr3 = new ArrayList<>(list);
扩容:每次扩容为原容量的1.5倍
add()添加一个元素
//在最后添加一个元素 public boolean add(E e) { ensureCapacityInternal(size + 1); //每次添加前会判断是否需要扩容 elementData[size++] = e; return true; } //在指定位置添加元素 public void add(int index, E element) { //检查index是否超过数组的长度 rangeCheckForAdd(index); ensureCapacityInternal(size + 1); //将数组从index位置往后移动 System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; }
addAll()添加集合中的全部元素
public boolean addAll(Collection<? extends E> c) //在方法里面调用循环调用add(e)方法 public boolean addAll(int index, Collection<? extends E> c) //在方法里面调用循环调用add(index,e)方法
get(int index)返回index位置的元素
//index需要在list.size()之间否则就会报:IndexOutOfBoundsException System.out.println(arr1.get(2)); //3 System.out.println(arr1.get(5)); //IndexOutOfBoundsException
clear()清除所有元素
ArrayList<Integer> arr1 = new ArrayList<>(); arr1.add(1); System.out.println(arr1.toString()); // [1] arr1.clear(); System.out.println(arr1.toString()); //[]
clone()返回数组的克隆对象(浅克隆)
ArrayList<Integer> arr1 = new ArrayList<>(); arr1.addAll(Arrays.asList(1, 2, 3, 4)); ArrayList<Integer> arrayList = (ArrayList<Integer>) arr1.clone(); System.out.println(arr1); //[1, 2, 3, 4] System.out.println(arrayList); //[1, 2, 3, 4]
contains(e) 集合是否包含此元素,包含返回true,否则返回False
ArrayList<Integer> arr1 = new ArrayList<>(); arr1.addAll(Arrays.asList(1, 2, 3, 4)); System.out.println(arr1.contains(1)); //true
ensureCapacity(int minCapacity)改变该集合的容量大小
forEach(Consumer<? super E> action) 对集合中的元素进行遍历,可以对每个元素进行操作
//对集合中每个元素扩大10倍后输出 arr1.forEach(i ->{ System.out.printf(%d、, i * 10); //10、20、30、40、 });
indexOf(object o)
//返回元素第一出现的下标,如果该元素不在集合中就会返回-1 public int indexOf(Object o) { if (o == null) { for (int i = 0; i < size; i++) //从前往后找 if (elementData[i]==null) return i; } else { for (int i = 0; i < size; i++) if (o.equals(elementData[i])) //对象需要重写equals方法 return i; } return -1; } //Person类没有重写equals方法时, ArrayList<Person> peoples = new ArrayList<>(); peoples.add(new Person(张三,18)); peoples.add(new Person(李四,19)); peoples.add(new Person(王五,20)); System.out.println(peoples.indexOf(new Person(张三, 18))); // -1 //Person类重写equals方法后。 System.out.println(peoples.indexOf(new Person(张三, 18))); // 0
//Person类 public class Person { private String name; private Integer age; public Person(){} public Person(String name, Integer age){ this.name=name; this.age = age; } public void say(){ System.out.println(I can talk); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(name, person.name) && Objects.equals(age, person.age); } @Override public int hashCode() { return Objects.hash(name, age); } }
lastIndexOf(Object o)
//返回元素最后一次出现的下标,如果该元素不在集合中就会返回-1 //与indexOf相反, public int lastIndexOf(Object o) { if (o == null) { for (int i = size-1; i >= 0; i--) //从后往前找 if (elementData[i]==null) return i; } else { for (int i = size-1; i >= 0; i--) if (o.equals(elementData[i])) return i; } return -1; }
isEmpty()判断集合是否为空
//集合中没有元素就返回true否则返回false public boolean isEmpty() { return size == 0; }
iterator()获取集合的迭代器
Iterator<Person> iterator = peoples.iterator(); while (iterator.hasNext()){ Person person = iterator.next(); System.out.println(person.toString()); } // Person{name='张三', age=18} // Person{name='李四', age=19} // Person{name='王五', age=20}
listIterator()
//listIterator() 默认是从下标0开始的 public ListIterator<E> listIterator() { return new ListItr(0); } //listIterator(int index) 可以指定下标 public ListIterator<E> listIterator(int index) { if (index < 0 || index > size) //指定的范围必须在0~~size之间 throw new IndexOutOfBoundsException(Index: +index); return new ListItr(index); } ListIterator<Person> iterator = peoples.listIterator(3); while (iterator.hasPrevious()){ //从后往前迭代 Person person = iterator.previous(); System.out.println(person.toString()); }
iterator()和listIterator()的区别
iterator: 不仅可以对list进行迭代,还可以对set进行迭代 只能单向的迭代,从前往后 listIterator: 只能对list进行迭代。 可以双向迭代,既可从前往后,也可从后往前进行迭代
remove(int index)移除集合指定位置的元素,并返回index位置的元素
//如果移除的不是最后一个元素,将会造成集合的拷贝,(所以删除性能也是挺慢的) //remove(int index) public E remove(int index) { rangeCheck(index); modCount++; E oldValue = elementData(index); int numMoved = size - index - 1; if (numMoved > 0) //如果不是最后一个元素,将会带来数据的拷贝 System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; return oldValue; } // remove(Object o)移除第一次出现的元素 public boolean remove(Object o) { if (o == null) { //即使传进来一个null值,只要集合中存在null值,也会被删除 for (int index = 0; index < size; index++) //因为从前往后遍历,将会删除第一出现的元素 if (elementData[index] == null) { fastRemove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return true; } } return false; }
removeAll(Collection<?> c)
//移除和集合c中相同的元素 public boolean removeAll(Collection<?> c) { Objects.requireNonNull(c); // 判断集合c 是否为null return batchRemove(c, false); } //主要是下面的移除方法 private boolean batchRemove(Collection<?> c, boolean complement) { final Object[] elementData = this.elementData; int r = 0, w = 0; boolean modified = false; try { for (; r < size; r++) if (c.contains(elementData[r]) == complement) // 如果集合c中不存源集合的元素, elementData[w++] = elementData[r]; //就将这个元素放到源集合中,从前往后放 } finally { // Preserve behavioral compatibility with AbstractCollection, 兼容AbstractCollection // even if c.contains() throws. // 就算 c.contains()抛出异常,导致没有遍历完 if (r != size) { // 如果没有遍历完,就将r后面的元素全部复制到源集合中,从w的位置 System.arraycopy(elementData, r, elementData, w, size - r); w += size - r; } if (w != size) { // 如果w不等于size 说明有源集合中有c集合相同的元素,就把w后面的元素全部删除,也就实现了功能 // clear to let GC do its work for (int i = w; i < size; i++) elementData[i] = null; modCount += size - w; size = w; modified = true; } } return modified; }
removeIf(Predicate<? super E> filter)
//从集合中移除符合条件的元素 //传个断言型的参数 public boolean removeIf(Predicate<? super E> filter) { .... for (int i=0; modCount == expectedModCount && i < size; i++) { @SuppressWarnings(unchecked) final E element = (E) elementData[i]; if (filter.test(element)) { //处理符合条件的元素 removeSet.set(i); //将符合条件的元素放到处理的set中 removeCount++; } } ... //将要移除的元素在这里移除 if (anyToRemove) { final int newSize = size - removeCount; for (int i=0, j=0; (i < size) && (j < newSize); i++, j++) { i = removeSet.nextClearBit(i); elementData[j] = elementData[i]; } for (int k=newSize; k < size; k++) { elementData[k] = null; // Let gc do its work } this.size = newSize; if (modCount != expectedModCount) { throw new ConcurrentModificationException(); } modCount++; } return anyToRemove; } //移除年龄小于20岁的 peoples.removeIf(p -> p.getAge() < 20); System.out.println(peoples.toString()); //[Person{name='王五', age=20}]
removeRange(int fromIndex, int toIndex)
//移除指定范围之间的元素 protected void removeRange(int fromIndex, int toIndex) { modCount++; int numMoved = size - toIndex; System.arraycopy(elementData, toIndex, elementData, fromIndex, numMoved); // clear to let GC do its work int newSize = size - (toIndex-fromIndex); for (int i = newSize; i < size; i++) { elementData[i] = null; } size = newSize; }
replaceAll(UnaryOperator operator)
//将集合中的元素,通过operator的操作后,将经过加工的元素替换原来的元素 peoples.replaceAll(p->张三.equals(p.getName()) ? new Person() : p); System.out.println(peoples); //[Person{name='null', age=null}, Person{name='李四', age=19}, Person{name='王五', age=20}]
retainAll(Collection<?> c)
//和removeAll是相对的,保存集合c中相同的元素 public boolean retainAll(Collection<?> c) { Objects.requireNonNull(c); return batchRemove(c, true); }
set(int index, E element)
//将index位置的元素用传进来的替换,并返回原元素 public E set(int index, E element) { rangeCheck(index); E oldValue = elementData(index); elementData[index] = element; return oldValue; }
size()返回集合中的个数
sort(Comparator<? super E> c)
//用一定的规则将集合中的元素进行排序 peoples.sort(new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return o1.getAge()- o2.getAge(); } }); System.out.println(peoples); //[Person{name='张三', age=18}, Person{name='李四', age=19}, Person{name='王五', age=20}]
subList(int fromIndex, int toIndex)
//返回源集合中fromIndex--toIndex之间的所有元素
toArray()
//源集合转为数组形式 public Object[] toArray() { return Arrays.copyOf(elementData, size); } Person[] persons = (Person[]) peoples.toArray(); //重构方法,将源集合,转化为 a类型的数组 public <T> T[] toArray(T[] a) { if (a.length < size) // Make a new array of a's runtime type, but my contents: return (T[]) Arrays.copyOf(elementData, size, a.getClass()); System.arraycopy(elementData, 0, a, 0, size); if (a.length > size) a[size] = null; return a; }
trimToSize()
//将集合容量缩小为当前集合的实际容量,如果size为0,那还是默认的容量。 public void trimToSize() { modCount++; if (size < elementData.length) { elementData = (size == 0) ? EMPTY_ELEMENTDATA : Arrays.copyOf(elementData, size); } }