简要记录下关于ArrayList集合类相关方法的使用说明。
说明:该ArrayList的方法说明是操作jdk1.8来进行梳理的。
- ensureCapacity(int minCapacity)
说明:设置ArrayList的容量。
注意:只有给定的minCapacity大于ArrayList的容量的时候才会执行“扩容操作”。
给定的容量大于List当前容量:
Test_ensureCapacity(10);
..........
private static void Test_ensureCapacity(int minCapacity) {
ArrayList<String> list = new ArrayList<>(3);
list.add("1");
list.add("1");
list.add("1");
System.out.println("ArrayList--容量:" + getElementLength(list));
list.ensureCapacity(minCapacity);
System.out.println("ArrayList--容量:" + getElementLength(list));
}
log:
ArrayList--容量:3
ArrayList--容量:10
给定的容量小于或者等于List当前容量:
Test_ensureCapacity(2);
log
ArrayList--容量:3
ArrayList--容量:3
- trimToSize()
说明:设置ArrayList的容量大小为size属性对应的大小(就像方法说明的一样,修剪List的容量至size大小)。
条件:只有当size小于ArrayList中Object[]的大小时才会设置。
场景:释放ArrayList未使用的内存。
private static void Test_trimToSize(){
ArrayList<String> list = new ArrayList<>();
list.add("1");
System.out.println("ArrayList--容量:" + getElementLength(list));
list.trimToSize();
System.out.println("ArrayList--容量:" + getElementLength(list));
}
log
ArrayList--容量:10
ArrayList--容量:1
- indexOf(Object o)
说明:返回ArrayList中第一次出现给定值的数组下标。如果不存在返回-1。
注意:
1:如果ArrayList中存储的是自定义类型,需要重写equals()方法,indexOf()内部会调用自定义类的equals()来判断要查找的内容与其中存储的数据元素是否“相等”。
2:如果不重写equals()方法,则只有给定值的内存地址与ArrayList中的数据元素相等时,才能返回其在ArrayList存储的位置,就算内容一致也会返回-1标记ArrayList不存在给定内容。
3:“相等”这个概念不仅表示两个对象的内存地址一样,还代表他们的“内容”相同。
private static void Test_indexOf(){
Persion p1 = new Persion("张三");
Persion p4 = new Persion("张12三");
Persion p2 = new Persion("张三3");
Persion p3 = new Persion("张三3");
ArrayList<Persion> list = new ArrayList<>();
list.add(p1);
list.add(p4);
list.add(p2);
System.out.println(list.indexOf(new Persion("张12三")));
}
.......
private static class Persion{
String name;
public Persion(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
//Object的equals()默认实现是:采用“this==obj”来比较 “当前对象与给定对象指向的内存地址是否一致”。
//如果List中的元素不是String,Integr这些系统提供的类的话(这些系统类都重写了equals()),需要重写equals()方法。
//为什么要重写??如果不重写,当调用List的提供的系统方法时(例如indexOf()),这些方法可能会调用给定对象的equals()
//来做相应判断,如果给定的对象的内容相同但是对象在内存的存储地址不同时,则会出现判断错误情况。
if(obj == null){
return false;
}
if(this == obj){
return true;
}
if(obj instanceof Persion){
Persion p = (Persion) obj;
if(p.name == this.name){
return true;
}
if(p.name == null || this.name == null){
return false;
}
if(p.name.equals(this.name)){
return true;
}
}
return false;
}
}
- contains(Object o)
说明:判断该ArrayList中是否包含指定的内容。该方法内部调用indexOf(),如果indexOf()可以查找到该内容返回true,否则返回false。
注意:记得也要重写自定义类型的equals()方法。
private static void Test_contains(){
Persion p1 = new Persion("张三");
Persion p4 = new Persion("张12三");
Persion p2 = new Persion("张三3");
Persion p3 = new Persion("张三3");
ArrayList<Persion> list = new ArrayList<>();
list.add(p1);
list.add(p4);
list.add(p2);
System.out.println(list.contains(new Persion("张12三")));
}
log
true
- lastIndexOf(Object o)
说明:查找给定元素最后一次的位置。也就是说 倒序查找该ArrayList中第一次出现给定元素的位置。存在返回具体的位置,不存在返回-1。
实现:内容采用倒序遍历Object[]方式进行查找。
注意:与indexOf(Object o)方法描述的注意点一样,都需要重写自定义类型的equals()方法。
private static void Test_laseIndexOf(){
Persion p1 = new Persion("张三");
Persion p2 = new Persion("张12三");
Persion p3 = new Persion("张三3");
Persion p4 = new Persion("张三");
Persion p5 = new Persion("张三3");
ArrayList<Persion> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
System.out.println(list.lastIndexOf(new Persion("张三")));
}
log
3
- toArray()
说明:以Object[]形式返回ArrayList中存储的数据元素。
实现:返回的Object[]是采用Arrays.copyOf()(实际采用System.arraycopy())方式生成的一个"新数组"。
注意点:返回的Object[]中的数据应该是采用“浅拷贝”方式复制出来的。(也就是说,修改Object[]中元素的内容,ArrayList的内容也会发生改变)
private static void Test_toArray(){
Persion p1 = new Persion("张三");
Persion p2 = new Persion("张12三");
Persion p3 = new Persion("张三3");
Persion p4 = new Persion("张三");
Persion p5 = new Persion("张三3");
ArrayList<Persion> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
Object[] array = list.toArray();
System.out.println(Arrays.toString(array));
((Persion)array[0]).name = "0000000";
((Persion)array[2]).name = "2222222";
System.out.println(Arrays.toString(list.toArray()));
}
log
[张三, 张12三, 张三3, 张三, 张三3]
[0000000, 张12三, 2222222, 张三, 张三3]
- toArray(T[] a)
说明:以给定的类型数组形式,返回ArrayList中存储的数据元素。
注意:
1:返回的Object[]中的数据应该是采用“浅拷贝”方式复制出来的。(也就是说,修改Object[]中元素的内容,ArrayList的内容也会发生改变)
2:如果给定的数组类型与ArrayList存储的元素类型不匹配的话(给定的类型要是List中存储数据类型的父类型或者其本分),则会抛出"ArrayStoreException"。
原因:System.arraycopy()在做数组拷贝时,如果发现类型不匹配时就会抛出ArrayStoreException。
private static void Test_toArray2(){
Persion p1 = new Persion("张三");
Persion p2 = new Persion("张12三");
Persion p3 = new Persion("张三3");
Persion p4 = new Persion("张三");
Persion p5 = new Persion("张三3");
ArrayList<Persion> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
AbsPersion[] array = list.toArray(new AbsPersion[]{});
System.out.println(Arrays.toString(array));
}
- remove(Object o)
说明:删除ArrayList中与给定的元素“相等”的且第一次出现的元素。
注意:与indexOf(Object o)方法描述的注意点一样,都需要重写自定义类型的equals()方法。
private static void Test_remove(){
Persion p1 = new Persion("张三");
Persion p2 = new Persion("张12三");
Persion p3 = new Persion("张三3");
Persion p4 = new Persion("张三");
Persion p5 = new Persion("张三3");
ArrayList<Persion> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.remove(new Persion("张12三"));
System.out.println(Arrays.toString(list.toArray()));
}
log
[张三, 张三3, 张三, 张三3]
- removeAll(Collection<?> c)
说明:从当前ArrayList中删除指定集合中包含的所有元素。也就是说此方法会从ArrayList中删除其与给定集合的“相交”的数据。
private static void Test_removeAll(){
Persion p1 = new Persion("张三");
Persion p2 = new Persion("张三");
Persion p3 = new Persion("李四");
ArrayList<Persion> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
ArrayList<Persion> list2 = new ArrayList<>();
list2.add(new Persion("张三"));
list.removeAll(list2);
System.out.println(Arrays.toString(list.toArray()));
}
log
[李四]
- retainAll(Collection<?> c)
说明:从该列表中删除未包含在指定集合中的所有元素。
也就是说此方法会移除非当前列表和给定列表共有的数据。执行此方法后,该列表只会保留下其与给定列表的“交集”数据。
可以用于求 两个列表的交集。
private static void Test_retainAll(){
Persion p1 = new Persion("张三");
Persion p2 = new Persion("张三");
Persion p3 = new Persion("李四");
Persion p4 = new Persion("王五");
ArrayList<Persion> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
ArrayList<Persion> list2 = new ArrayList<>();
list2.add(new Persion("张三"));
list.retainAll(list2);
System.out.println(Arrays.toString(list.toArray()));
}
log
[张三, 张三]
- subList(int fromIndex, int toIndex)
说明:该方法返回一个SubList(子列表),该SubList是ArrayList中一个私有内部类,并且该SubList直接继承自AbstractList,间接继承于List。
注意:
1:调用通过此方法返回的List的实际类型为SubList,其add(),remove()等方法都会对其外部类,也就是ArrayList中的存储的内容进行同步(通过SubList的定义可知,调用SubList的方法其内部还是调用了ArrayList的相应方法对ArrayList存储的内容来进行操作)。
2:调用此方法后,ArrayList不可再调用“能引起其存储结构发生变化的方法”(具体原因查看 集合--快速失败机制 的介绍)。
2.1:更改ArrayList中Object[]的容量的方法包括:add(),addAll()remove(),removeAll(),retailAll(),clear(),trimToSize()
2.2:replaceAll(),sort()
关于SubList的详细介绍,请查看 集合--SubList
正常使用
private static void Test_subList(){
Persion p1 = new Persion("张三");
Persion p2 = new Persion("张三");
Persion p3 = new Persion("李四");
Persion p4 = new Persion("王五");
Persion p5 = new Persion("赵六");
ArrayList<Persion> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
List<Persion> subList = list.subList(2, 4);
System.out.println("subList:" + Arrays.toString(subList.toArray()));
System.out.println("删除:" + Arrays.toString(Arrays.asList(p1, p3).toArray()));
subList.removeAll(Arrays.asList(p1, p3));
System.out.println("subList:" + Arrays.toString(subList.toArray()));
System.out.println("ArrayList:" + Arrays.toString(list.toArray()));
}
log
subList:[李四, 王五]
删除:[张三, 李四]
subList:[王五]
ArrayList:[张三, 张三, 王五, 赵六]
调用subList()后再调用可引起ArrayList“结构发生变化”的方法
private static void Test_subList(){
Persion p1 = new Persion("张三");
Persion p2 = new Persion("张三");
Persion p3 = new Persion("李四");
Persion p4 = new Persion("王五");
Persion p5 = new Persion("赵六");
ArrayList<Persion> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
List<Persion> subList = list.subList(0, 4);
System.out.println("subList:" + Arrays.toString(subList.toArray()));
System.out.println("删除:" + Arrays.toString(Arrays.asList(p1, p3).toArray()));
list.add(0, new Persion("lily"));
//list.clear();
//list.trimToSize();
//list.removeAll(Arrays.asList(p1, p3));
//list.set(0, new Persion("lily"));
System.out.println("subList:" + Arrays.toString(subList.toArray()));
System.out.println("ArrayList:" + Arrays.toString(list.toArray()));
}
log
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1239)
at java.util.ArrayList$SubList.size(ArrayList.java:1048)
at java.util.AbstractCollection.toArray(AbstractCollection.java:136)
at com.list.array.api.system.arraylist.Test_5.Test_subList(Test_5.java:248)
at com.list.array.api.system.arraylist.Test_5.main(Test_5.java:56)
subList:[张三, 张三, 李四, 王五]
删除:[张三, 李四]
- replaceAll(UnaryOperator<E> operator)
说明:对ArrayList中存储的数据元素进行替换(这会从0开始至size-1处遍历一遍该顺序表,根据UnaryOperator的apply()返回的数据替换掉原位置的数据)。
注意:此方法是List接口中定义的default方法。
private static void Test_replaceAll(){
Persion p1 = new Persion("张三");
Persion p2 = new Persion("李四");
ArrayList<Persion> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.replaceAll(new UnaryOperator<Persion>() {
@Override
public Persion apply(Persion persion) {
return persion.name.equals("李四") ? new Persion("牛魔王") : persion;
}
});
System.out.println("ArrayList:" + Arrays.toString(list.toArray()));
}
log
ArrayList:[张三, 牛魔王]
- sort(Comparator<? super E> c)
说明:对ArrayList中存储的数据元素进行排序。
注意:需要重写comapre()。
1:comapre()的返回值有三种:
0:代表给定的两个变量相等
负数:代表o1小于o2
正数:代表o1大于o2
2:如果ArrayList存储的数据为自定义类型,该类也可以实现Comparable接口,重写compareTo(),然后把Comparator中compare()的比较逻辑放置该自定义类型的compareTo()中。
private static void Test_sort(){
Persion p1 = new Persion("张三", 20);
Persion p2 = new Persion("李四", 32);
Persion p3 = new Persion("王五", 12);
ArrayList<Persion> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.sort(new Comparator<Persion>() {
@Override
public int compare(Persion o1, Persion o2) {
int compareFlag = 0;
if(o1.age < o2.age){
compareFlag = -1;
} else if(o1.age > o2.age){
compareFlag = 1;
}
//return o1.compareTo(o2);
return compareFlag;
}
});
System.out.println("ArrayList:" + Arrays.toString(list.toArray()));
}
log
ArrayList:[王五_12, 张三_20, 李四_32]
- iterator()
- listIterator()
- spliterator()
网友评论