Java-ArrayList集合
1.1 ArrayList集合
- 用ArrayList存储自定义对象并遍历
ArrayList底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
添加,遍历代码如下:
package com.shujia.wyh.day19;
import java.util.ArrayList;
import java.util.Iterator;
/*
使用ArrayList存储自定义对象并遍历
ArrayList底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
*/
public class ArrayListDemo1 {
public static void main(String[] args) {
//创建ArrayList集合对象
ArrayList list1 = new ArrayList();
//创建5个学生对象
Student s1 = new Student("张飞", 18);
Student s2 = new Student("关羽", 19);
Student s3 = new Student("赵云", 17);
Student s4 = new Student("黄州", 20);
Student s5 = new Student("马超", 16);
//将学生对象添加到集合中
list1.add(s1);
list1.add(s2);
list1.add(s3);
list1.add(s4);
list1.add(s5);
//遍历集合
//遍历方式1:迭代器遍历
Iterator iterator = list1.iterator();
while (iterator.hasNext()) {
Student s = (Student) iterator.next();
System.out.println(s.getName() + "---" + s.getAge());
}
System.out.println("========================================");
//遍历方式2:get()和size()结合遍历
for(int i=0;i<list1.size();i++){
Student s = (Student) list1.get(i);
System.out.println(s.getName() + "---" + s.getAge());
}
}
}
ArrayList集合如何去重
- 使用ArrayList集合存储字符串,并且进行去重(字符串的内容相同)
实现思路:创建一个新的集合,存储去重后的元素
注意事项:
- 使用 if 判断新集合中是否存在(使用 contain()方法比较,若存在返回true否则返回false)
当不存在是才添加,所以进行取反操作
package com.bigdat.java.day20;
import java.util.ArrayList;
import java.util.Iterator;
/*
使用ArrayList集合存储字符串,并且进行去重(字符串的内容相同)
实现思路:创建一个新的集合,存储去重后的元素
*/
public class ArrayListDemo2 {
public static void main(String[] args) {
//创建一个集合用来存放旧数据。
ArrayList <String> arrayList = new ArrayList<String>();
//往集合中添加数据
arrayList.add("banana");
arrayList.add("apple");
arrayList.add("world");
arrayList.add("apple");
arrayList.add("world");
//输出去重之前与之后作比较
System.out.println("去重之前:"+arrayList);
//创建一个新集合,用来存放去重之后的数据
ArrayList<String> arrayList1 = new ArrayList<>();
//创建一个ArrayList的迭代器
Iterator<String> iterator = arrayList.iterator();
//遍历旧集合
while(iterator.hasNext()){
String next = iterator.next();
if(!arrayList1.contains(next)){
arrayList1.add(next);
}
}
System.out.println("去重之后:"+arrayList1);
}
}
创建学生对象进行去重
使用ArrayList存储自定义对象并去重(成员变量的值都相同的时候,就重复)
我们按照处理字符串相同的方式来处理相同自定义对象,结果发现并没有进行去重
为什么呢?
想要知道为什么,首先得分析出问题出现在哪一行代码
经过简单的分析后得出,问题出现在if判断中,发现只有当if判断为true的时候,才会将元素添加到集合中。
说明我们这边的判断结果一直是true,去掉!,说明contains()方法的结果一直是false,
怎么去改呢?得先搞明白说明contains方法内部是怎么实现的,所以我们得去看源码。
通过观察源码发现,contains()底层调用得是元素类型中equals方法,而我们自定义类Student类中并没有equals方法
所以调用的是父类Object类中equals方法,而Object类中的equals方法比较的是地址值,又因为每一个学生对象都是new出来的
地址值必然不一样,所以equals比较的结果永远是false,contains比较的结果永远是false,加上!结果永远是true,所以通通
添加到新集合,最终出现没有去重的现象。
怎么解决呢?元素类重写equals()方法
package com.bigdat.java.day20;
import java.util.ArrayList;
import java.util.Iterator;
/*
创建学生对象来进行去重
*/
public class ArrayListDemo3 {
public static void main(String[] args) {
//创建集合对象
ArrayList<Student> student = new ArrayList<Student>();
//创建学生类对象
Student s1 = new Student("周润发",29);
Student s2 = new Student("成龙",10);
Student s3 = new Student("元彪",17);
Student s4 = new Student("周润发",29);
Student s5 = new Student("元彪",17);
//将创建好的学生对象丢入集合中
student.add(s1);
student.add(s2);
student.add(s3);
student.add(s4);
student.add(s5);
System.out.println("去重之前:"+student);
//创建一个新的集合用于存放去重后的元素
ArrayList<Student> student1 = new ArrayList<>();
//创建一个 student 的迭代器
Iterator<Student> iterator = student.iterator();
//遍历集合
while (iterator.hasNext()) {
Student next = iterator.next();
//判断是否存在不存在就添加到新集合中
if(!student1.contains(next)){
student1.add(next);
}
}
System.out.println("去重之后:"+student1);
}
}

浙公网安备 33010602011771号