List集合的具体实现子类ArrayList

一、ArrayList集合的具体特点:

底层的数据结构是数组,查询快,增删慢,线程不安全,效率高。

/*
    Collection[接口]:
        List[接口]: 元素有序,可以发生重复,有索引的概念
            ArrayList[具体的子类]: 底层数据结构是数组,查询快,增删慢,线程不安全,效率高。

        Set[接口]: 元素无序且唯一,没有索引
 */
public class ArrayListDemo1 {
    public static void main(String[] args) {
        //创建集合对象
        ArrayList list1 = new ArrayList();

        //创建元素对象
        //将元素添加到集合中
        list1.add("hello");
        list1.add("world");
        list1.add("java");
        list1.add("hadoop");
        list1.add("hello");
        list1.add("world");

        //遍历集合
        //1. 转数组遍历
        Object[] objects = list1.toArray();
        for(int i=0;i<objects.length;i++){
            System.out.println(objects[i]);
        }
        System.out.println("========================");

        //2. 使用迭代器的方式遍历
        Iterator iterator = list1.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println("========================");

        //3. 使用size()和get(i) 只有List集合才拥有的遍历方式
        for(int i=0;i<list1.size();i++){
            System.out.println(list1.get(i));
        }
    }
}

二、练习题:使用ArrayList去除集合里面重复的元素

解题思路:可以创建一个新的集合,向里面添加数据的同时进行判断

public class ArrayListTest1 {
    public static void main(String[] args) {
        //创建集合对象,创建元素对象并将元素添加到集合中
        ArrayList arrayList = new ArrayList();
        arrayList.add("java");
        arrayList.add("world");
        arrayList.add("hive");
        arrayList.add("hive");
        arrayList.add("java");
        arrayList.add("java");

        //创建一个新的集合
        ArrayList list = new ArrayList();
        for(int i=0;i<arrayList.size();i++){
            String s=(String) arrayList.get(i);//将旧集合里面的元素赋给s
            if(!list.contains(s)){//如果新集合list中没有该元素就添加进去
                list.add(s);
            }
        }
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
        
    }
}

三、练习题:去除集合中自定义对象的重复值(对象的成员变量值都相同)

基本解题思路:先创建一个学生类,再通过上面的方法创建一个新的集合,并使用contains进行判断,但是要注意的是,在java中contains的源码是使用equals进行比较的我们元素Student类中并没有重写equals方法所以使用的是父类Object中的equals方法,而父类Object中的equals方法比较的是地址值又因为每一个学生都是new出来的,所以地址值都不一样,比较的结果永远为false要想比较内容值,需要元素类型重写equals方法,自动生成即可

学生类:

package com.day13;

import java.util.Objects;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

}

main方法:

public class ArrayListTest2 {
    public static void main(String[] args) {
        Student s1 = new Student("彭于晏",34);
        Student s2 = new Student("李荣浩",23);
        Student s3 = new Student("周杰伦",25);
        Student s4 = new Student("王宝强",33);
        Student s5 = new Student("李亦菲",24);
        Student s6 = new Student("王宝强",33);

        ArrayList list = new ArrayList();
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);
        list.add(s5);
        list.add(s6);
        System.out.println(list);

        ArrayList list1 = new ArrayList();
        for(int i=0;i<list.size();i++){
            Student a=(Student) list.get(i);
            if(!list1.contains(a)){
                list1.add(a);
            }
        }
        System.out.println(list1);

    }
}

posted @ 2024-10-15 22:22  你的镁偷走了我的锌  阅读(23)  评论(0)    收藏  举报