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);
}
}
成功没有捷径,一步一个脚印!