ArrayList最常用的方法总结

158 阅读2分钟

代码结构

自己本身就三个构造方法、其余全是继承过的方法或者实现的接口

image.png

构造方法

ArrayList()   //with an initial capacity of ten
ArrayList(int initialCapacity)
ArrayList(Collection<? extends E> c)

构造一个list

List<String> lists = Arrays.asList("a", "b", "c");

boolean add(E e)
追加就往后增加
List<String> list2 = new ArrayList<>();
list2.add("e");
list2.add("d");
List<String> list = new ArrayList<>();
list.add("a");
System.out.println(list);
list.add("b");
System.out.println(list);
list.add("c");
System.out.println(list);
[a]
[a, b]
[a, b, c]
void add(int index, E element)
插入到对应下标、后面元素以此往后移动
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
System.out.println(list);
list.add(1,"c");
System.out.println(list);
[a, b]
[a, c, b]

后一位不算越界
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
System.out.println(list);
list.add(2,"c");
System.out.println(list);

只能预支一位、再往后就越界
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
System.out.println(list);
list.add(3,"c");
System.out.println(list);
[a, b]
java.lang.IndexOutOfBoundsException: Index: 3, Size: 2
boolean addAll(Collection<? extends E> c)
在最后追加list2的全部
List<String> list2 = new ArrayList<>();
list2.add("e");
list2.add("d");
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
System.out.println(list);
list.addAll(list2);
System.out.println(list);
[a, b]
[a, b, e, d]
boolean addAll(int index, Collection<? extends E> c)
对应下标插入
List<String> list2 = new ArrayList<>();
list2.add("e");
list2.add("d");
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
System.out.println(list);
list.addAll(1, list2);
System.out.println(list);
[a, b]
[a, e, d, b]

预支一位是可以插入的
List<String> list2 = new ArrayList<>();
list2.add("e");
list2.add("d");
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
System.out.println(list);
list.addAll(2, list2);
System.out.println(list);
[a, b]
[a, b, e, d]

超出预支的一位就报错
List<String> list2 = new ArrayList<>();
list2.add("e");
list2.add("d");
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
System.out.println(list);
list.addAll(3, list2);
System.out.println(list);
[a, b]
java.lang.IndexOutOfBoundsException: Index: 3, Size: 2

void clear() 
// 清空列表
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
System.out.println(list);
list.clear();
System.out.println(list);

[a, b]
[]
E remove(int index)
// 删除对应索引的元素
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
list.remove(0);
System.out.println(list);

[a, b, c]
[b, c]

// 超出范围就会越界
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
list.remove(3);
System.out.println(list);
[a, b, c]
java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3
boolean remove(Object o)
// 删除指定元素、从前往后删除
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("a");
list.add("c");
System.out.println(list);
System.out.println(list.remove("a"));
System.out.println(list);
[a, b, a, c]
true
[b, a, c]

// 如果不存在就不删除
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
System.out.println(list.remove("d"));
System.out.println(list);
[a, b, c]
false
[a, b, c]
boolean removeAll(Collection<?> c)
// 删除所有元素
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
List<String> list2 = new ArrayList<>();
list2.add("a");
list2.add("b");
System.out.println(list);
System.out.println(list2);
System.out.println(list.removeAll(list2));
System.out.println(list);
System.out.println(list2);
[a, b, c]
[a, b]
true
[c]
[a, b]

// 删除存在的、不存在的不删除
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
List<String> list2 = new ArrayList<>();
list2.add("a");
list2.add("d");
System.out.println(list);
System.out.println(list2);
System.out.println(list.removeAll(list2));
System.out.println(list);
System.out.println(list2);
[a, b, c]
[a, d]
true
[b, c]
[a, d]

// 如果一个都没有就不删除
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
List<String> list2 = new ArrayList<>();
list2.add("e");
list2.add("d");
System.out.println(list);
System.out.println(list2);
System.out.println(list.removeAll(list2));
System.out.println(list);
System.out.println(list2);
[a, b, c]
[e, d]
false
[a, b, c]
[e, d]
boolean removeIf(Predicate<? super E> filter)
// 有条件的删除
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
System.out.println(list.removeIf(a->a.equals("a")));
System.out.println(list);
[a, b, c]
true
[b, c]

// 没有符合条件的就一个也不删除
List<String> list2 = new ArrayList<>();
list2.add("e");
list2.add("d");
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
System.out.println(list.removeIf(a->a.equals("aa")));
System.out.println(list);
[a, b, c]
false
[a, b, c]

E set(int index, E element)
// 改对应索引位置的元素的值
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
System.out.println(list.set(1, "e"));
System.out.println(list);
[a, b, c]
b
[a, e, c]

// 位置不存在就报越界
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
System.out.println(list.set(3, "e"));
System.out.println(list);
[a, b, c]
java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3
void replaceAll(UnaryOperator<E> operator)
// 对所有元素进行一次加工
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
System.out.println(list);
list.replaceAll(a -> a + "@");
System.out.println(list);
[a, b, b]
[a@, b@, b@]

// 空集合不处理、返回空
List<String> list = new ArrayList<>();
System.out.println(list);
list.replaceAll(a -> a + "@");
System.out.println(list);
[]
[]

boolean contains(Object o) 
// 判断是否包含、包含返回true
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
System.out.println(list.contains("a"));
[a, b, c]
true

// 判断是否包含、不包含返回false
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
System.out.println(list.contains("e"));
System.out.println(list);
[a, b, c]
false
boolean isEmpty()
int size()
E get(int index)
// 取对应下标的值、下标存在就取值、不存在就越界错误
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
System.out.println(list.get(0));
System.out.println(list.get(3));

[a, b, c]
a
java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3
int indexOf(Object o)
// 判断元素第一次出现的索引
List<String> list = new ArrayList<>();
list.add("a");
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
System.out.println(list.indexOf("a"));
[a, a, b, c]
0

// 不存在则返回-1
System.out.println(list);
System.out.println(list.indexOf("e"));
[a, a, b, c]
-1
int lastIndexOf(Object o)
// 获取元素最后一次出现的索引
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
System.out.println(list);
System.out.println(list.lastIndexOf("b"));
[a, b, b]
2

// 不存在则返回-1
System.out.println(list);
System.out.println(list.lastIndexOf("e"));
[a, b, b]
-1
boolean retainAll(Collection<?> c)
// 取交集
List<String> list2 = new ArrayList<>();
list2.add("a");
list2.add("d");
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
System.out.println(list2);
list.retainAll(list2);
System.out.println(list);
System.out.println(list2);
[a, b, c]
[a, d]
[a]
[a, d]
List<String> list2 = new ArrayList<>();
list2.add("e");
list2.add("d");
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
System.out.println(list2);
list.retainAll(list2);
System.out.println(list);
System.out.println(list2);
[a, b, c]
[e, d]
[]
[e, d]
void sort(Comparator<? super E> c)
// 按照指定方式排序
List<String> list = new ArrayList<>();
list.add("aaaa");
list.add("bb");
list.add("ccc");
list.sort(Comparator.comparing(a->a.length()));
System.out.println(list);
[bb, ccc, aaaa]
List<E> subList(int fromIndex, int toIndex) 
// 获取子列表
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");

List<String> strings = list.subList(1, 2);
System.out.println(list);
System.out.println(strings);
[a, b, c]
[b]

List<String> strings = list.subList(1, 3);
System.out.println(list);
System.out.println(strings);
[a, b, c]
[b, c]

// 超过范围则越界
List<String> strings = list.subList(1, 4);
System.out.println(list);
System.out.println(strings);
java.lang.IndexOutOfBoundsException: toIndex = 4

类型转化

Object[] toArray()
// 大坑、错误的使用方式
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
System.out.println(list);
String[] arr = (String[])list.toArray();
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}
[a, b, b]
java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.String; ([Ljava.lang.Object; and [Ljava.lang.String; are in module java.base of loader 'bootstrap')
// 正确的使用方式
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
System.out.println(list);
Object[] arr = list.toArray();
for (int i = 0; i < arr.length; i++) {
    System.out.println((String)arr[i]);
}
[a, b, b]
a
b
b
<T> T[] toArray(T[] a)
// 比较好的转换方式
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
String[] arr = new String[list.size()];
arr = list.toArray(arr);
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

// 更高效的方式
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
String[] arr = list.toArray(new String[0]);
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}
a
b
c

String[] arr = list.toArray(new String[0]);

1、数组空间等于0时,将会动态的创建和集合size相同空间大小的数组,性能是最好的。

2、数组空间大于0但是小于size时,会重新创建大小等于集合size的数组,此时会增加GC的负担。

3、数组空间等于集合的size时,在普通情况下是没问题的,但是在高并发情况下,数组创建完成后,集合的size变大,此时影响跟第二条相同。 

4、数组空间大于集合的size时,一方面会造成空间浪费,另一方面会在使用数组是产生空指针的异常。因为多出来的空间会存入null

此处参考:

遍历

void forEach(Consumer<? super E> action)
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.forEach(a->System.out.println(a));
a
b
c
Iterator<E> iterator()
ListIterator<E> listIterator()
ListIterator<E> listIterator(int index)
Spliterator<E> spliterator()