ArrayList相关方法简述
List概念
存储的元素有序、可重复,可以理解为存储对象的数组,是Connection的子接口,与数组相比,长度是可变的,可以动态的对集合中的数据进行增加或减少。有两个比较常见的实现类ArrayList与LinkedList,两个实现类的方法大致相同,但对数据处理的性能上却有一定的差异。
这里我就说一下ArrayList相关方法的使用,不喜勿喷…
1.1 ArrayList常见方法
1.1.1 构造器
方法名称 | 方法使用说明 |
---|---|
ArrayList() | 构造一个初始容量为10的空列表 |
ArrayList(Collection<? extends E> c) | 构造一个包含指定集合的元素的列表,它们在集合的迭代器返回的顺序中返回。 |
ArrayList(int initialCapacity) | 用指定的初始容量构造一个空列表。 |
- 问题一:为什么通过ArrayList() 创建的列表初始容量为10?
源码解析
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
通过构造器的源码注释可以说名:构造一个初始容量为10的空列表
问题二:通过第二个构造器创建集合时会有什么坑点?
当传入的是由一个数组转变过来的集合时会出现UnsupportedOperationException(当不支持请求的操作时,抛出该异常),需要通过new Array()构造器再次操作,传入操作后的集合就可以解决该异常问题。
案例演示
//1.构造一个初始容量为十的空列表。
//private static final int DEFAULT_CAPACITY = 10;//源码容量私有化
List list_1=new ArrayList();
System.out.println("无参构造器构建list:"+list_1);
//2.构造一个包含指定集合的元素的列表
List<Integer> list_2=new ArrayList<>();
System.out.println("包含指定集合的元素的列表list的size:"+list_2.size());
//3.构造具有指定初始容量的空列表
List<Integer> list_3=new ArrayList<>(3);
System.out.println("指定初始容量的空列表list:"+list_3);
1.1.2 add 方法
- 方法介绍
方法名称 | 方法描述 |
---|---|
public boolean add(E e) | 将指定的元素添加到当前列表的尾部 |
public void add(int index,E element) | 在当前列表的指定位置添加指定元素 |
public boolean addAll(Collection<? extends E> c) | 将指定的列表添加到此列表的尾部 |
public boolean addAll( int index,Collection<? extends E e> c ) | 在当前列表的指定位置添加指定的列表 |
- 案例演示
//1、构建初始容量为10的空列表
List<String> list = new ArrayList<>();
//2、测试add(E e)方法:将元素添加到当前列表的尾部
list.add("彭于晏");
list.add("高圆圆");
//测试add(int index,E elemtn) 当前表指定位置添加指定元素,
//原来该位置的元素向后移一位
list.add(1,"薛之谦");
//3、测试addAll(Collection<? extends E > c)
//将指定的列表添加到此列表的尾部
List<String> myList = new ArrayList<>();
myList.add("马云最帅");
myList.add("聪明绝顶");
list.addAll(myList);
//addAll( int index,Collection<? extends E e> c )与add(int index,E elemtn) 同理
System.out.println("当前列表list中的元素:" + list);
1.1.3 get和set方法
- 方法介绍
方法名称 | 方法描述 |
---|---|
public E get(int index) | 返回此列表指定索引处的元素 |
public E set(int index ,E element) | 用指定的元素替换此列表中指定位置的元素 |
- 案例演示
List<String> list=new ArrayList<>();
//1.测试set方法
// IndexOutOfBoundsException -( index < 0 || index >= size()
//list.set(0,"高圆圆");
list.add("高圆圆");
String s1=list.set(0,"佟丽娅");
System.out.println(s1);
//2.测试get方法
String s2=list.get(0);
System.out.println(s2);
注意:
1. 当在使用set方法是索引的范围不能大于等于size(),否则会出现ArrayIndexOutOfBoundsException(用非法索引访问数组时抛出的异常)
/**
* Checks if the given index is in range. If not, throws an appropriate
* runtime exception. This method does *not* check if the index is
* negative: It is always used immediately prior to an array access,
* which throws an ArrayIndexOutOfBoundsException if index is negative.
*/
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
因此,操作的索引应该小于size()大小。
- 当需要对操作后的元素进行再次利用时,可以使用set方法进行回收。原因,使用set方法后的返回值为当前位置的元素。
1.1.4 contains 方法
- 方法介绍
方法名称 | 方法描述 |
---|---|
public boolean contains(Object o) | 如果此列表包含指定的元素,则返回true |
public boolean containsAll(Collection<?> C) | 如果此列表包含指定的列表,则返回true |
- 案例演示
//构建初始容量为10的空列表
List<String> list=new ArrayList<>();
//在当前列表尾部添加指定元素
list.add("罗永浩");
list.add("彭于晏");
list.add("郑伊健");
//判断当前元素是否存在与列表中
boolean flag=list.contains("星哥");
System.out.println(flag);
List<String> mylist=new ArrayList<>();
mylist.add("苏焱");
//判断当前列表中是否包含指定列表元素
boolean myflag=list.containsAll(mylist);
System.out.println(myflag);
注意:
- contains方法判断元素是否存在是根据元素的equals方法进行比较,若元素中没有重写equals方法,那么contains将比较对象。此处我没有重写equals方法的原因是,元素为String类型,String类中已经重写了equals方法。在使用contains方法时关注equals重写问题
String类中重写了equals方法的源码解析
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
1.1.5 remove方法
- 方法介绍
方法名称 | 方法描述 |
---|---|
public E remove(int index ) | 删除该列表中指定位置的元素 |
public boolean remove(Object o) | 删除该列表中指定的元素 |
public boolean removeAll(Collection<?> c) | 从此列表中删除指定集合包含的所有元素 |
public boolean retainAll()collection<?> c | 除了集合c中的元素全部删除 |
- 案例演示
//构建初始容量为10的空列表
List<String> list=new ArrayList<>();
list.add("罗永浩");
list.add("彭于晏");
list.add("郑伊健");
//测试public E remove(int index)
String s1=list.remove(1);
System.out.println("删除的元素为:"+s1+"
删除后集合list:"+list);
//测试public boolean remove(Object o)
boolean flag_1=list.remove("郑伊健");
System.out.println("删除结果为:"+flag_1+"
删除后集合list:"+list);
//测试public boolean removeAll(Collection<?> c)
List<String> mylist=new ArrayList<>();
mylist.add("李佳琪");
mylist.add("攀哥");
mylist.add("罗永浩");
boolean flag_2=mylist.removeAll(list);
System.out.println("删除结果为:"+flag_2+"
删除后集合list:"+mylist);
//测试public boolean retainAll(Collection<?> c)
mylist.add("罗永浩");
boolean flag_3=mylist.retainAll(list);
System.out.println("删除结果为:"+flag_3+"
删除后集合list:"+mylist);
总结:若要对集合操作但是又要将移除的元素进行再次操作时,可以使用set方法和remove方法
1.1.6 toArray方法
- 作用:将集合转换为数组
- 方法介绍
方法名称 | 方法描述 |
---|---|
public Object[] toArray() | 当回一个包含当前列表所有元素的数组 |
public T[] toArray(T[] a) | 当回一个包含当前列表所有元素的数组,指定类型 |
- 案例演示
//构建初始容量为10的空列表
List<String> list=new ArrayList<>();
//在当前列表的尾部添加元素
list.add("张无忌");
list.add("令狐冲");
list.add("段誉");
//测试public Object[] toArray()
Object[] o1=list.toArray();
//测试public <T> T[] toArray(T[] a);
String[] s1=list.toArray(new String[]{});
System.out.println(Arrays.toString(s1));
1.1.7 asList方法
- 方法介绍
方法名称 | 方法描述 |
---|---|
public static List asList(T… a) | 返回由指定数组支持的一个固定大小的列表 |
- 案例演示
//构建初始容量为10的空列表
List<String> list=new ArrayList<>();
//在当前列表的尾部添加元素
list.add("张无忌");
list.add("令狐冲");
list.add("段誉");
//集合变数组(toArray()方法)
String[] names = list.toArray(new String[]{});
System.out.println("集合转数组:" + Arrays.toString(names));
//数组转为集合:Arrays.asList)
List<String> list_6 = Arrays.asList(names);
System.out.println("数组转为集合:" + list_6);
//需求:将当前元素列表添加数据、删除数据
//此处使用new Array()操作,是为了解决前面说的UnsupportedOperationException异常
List<String> list_new = new ArrayList<>(list_6);
list_new.add("山山");//会出现UnsupportedOperationException,解决方案已给(上一行代码)
System.out.println("list_new:" + list_new);
谢谢大家阅读,我会继续努力提高我的相关技术…