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);
    }
}

posted @ 2022-04-01 08:08  a-tao必须奥利给  阅读(56)  评论(0)    收藏  举报