本篇内容主要讲解“Java中ArrayList的使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中ArrayList的使用方法”吧!
目录
1.简介
ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。
ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
ArrayList 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。在ArrayList中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。稍后,我们会比较List的“快速随机访问”和“通过Iterator迭代器访问”的效率。
ArrayList 实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
ArrayList 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。
和Vector不同,ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。
ArrayList是实现List接口的,底层采用数组实现。
ArrayList 实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
ArrayList 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。
方法:
2. 方法解释
(1)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三")));
}
(2)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("张三")));
}
(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()));
}
(4)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));
}
(5)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()));
}
(6)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()));
}
(7)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()));
}
(8)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;
}
}
到此,相信大家对“Java中ArrayList的使用方法”有了更深的了解,不妨来实际操作一番吧!这里是天达云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!