Java进阶: 带你玩转Collection集合(List / set / ArrayList) -- 比数组更强大的东东

前言:

集合啦!!!
在介绍集合之前,先来想一下为什么会出现集合呢?嘻嘻,揣摩一下设计者的意图,根据生活中的经验,
不难得出,新事物的出现必然是旧的事物无法满足现有的需求,所以,新事物应运而生。
那在集合面前,旧的事物是什么呢?
想一下,我们之前存储一些学生的成绩是怎么存储的,数组,但是如果要存储的类型中有不同的类型呢?
比如: String,int,char,对象Person,如果是学过 C++ 的小伙伴一定可能会说 用 struct 结构体
来存储,段位搞点的可能会想到用 C++ STL 库中的东西,学过 Python 的小伙伴可能会想到 List,
元组,and so on...................
总而言之,言而总之,用数组是实现不了的,所以在 Java 里面就有了 Collection,List,Set,
Map(之后会有专门的文章进行介绍)。

集合之间的关系:

在这里插入图片描述
在这里插入图片描述

从上图可以看到, Collection  List  Set  父接口, List  Set  Collection 的子
接口,同时 ArrayList  LinkedList  List  Collection 的实现方法,同理, HashSet 
TreeSet  Set  Collecion 的实现方法。

Collection 的常用方法:

在这里插入图片描述
代码实现进行检测:

package collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test01 {

    public static void main(String[] args) {
        // 多态的体现,接口不能被实例化,所以通过其实现类进行实现
        Collection coll = new ArrayList();

        // add()方法中的参数类型是 Object,向集合中添加一个元素
        coll.add("a");
        coll.add("b");
        coll.add("c");

        System.out.println(coll);

        // 清除集合中的所有元素
        coll.clear();

        System.out.println(coll);

        // 将三个学生对象放到 集合中

        Student student1 = new Student();
        student1.setName("张三");
        student1.setAge(23);

        Student student2 = new Student();
        student2.setName("李四");
        student2.setAge(96);

        Student student3 = new Student();
        student3.setName("王五");
        student3.setAge(78);
        // 向集合中添加 3 个对象
        coll.add(student1);
        coll.add(student2);
        coll.add(student3);
        // 如果不重写 Student 类中的 toString() 方法,调用默认的 toString() 方法时输出的是内存地址
        System.out.println(coll);

        // size() 输出集合中真实数据的个数
        System.out.println(coll.size());


        // addAll() : 将一个集合添加到另一个集合中

        Collection coll1 = new ArrayList();
        coll1.add("a");
        coll1.add("b");
        Collection coll2 = new ArrayList();
        coll2.add("123");
        coll2.add("456");

        coll1.addAll(coll2);

        System.out.println(coll1);
        // 结果:[a, b, 123, 456]

        // contains(Object e) : 查询集合中是否存在 一个 对象
        System.out.println(coll.contains("a"));
        System.out.println(coll.contains(student1));

        System.out.println("---------------------------");

        // containsAll() : 看一个集合中是否包含另一个集合
        System.out.println(coll1.containsAll(coll2));
        System.out.println(coll2.containsAll(coll1));

        System.out.println("---------------------------");
        coll.clear();
        // isEmpty() 判断某个集合是否为 空
        System.out.println(coll.isEmpty());
        System.out.println(coll1.isEmpty());
        System.out.println("---------------------------");
        // 迭代器 -- 常常用于遍历
        Iterator iterator = coll1.iterator();

        // hasNext() : 判断下一个值是否为 空
        while(iterator.hasNext()){
            // iterator.next() : 取到下一个值
            System.out.println(iterator.next());

        }

        System.out.println("---------------------------");
        // remove() : 删除集合中 指定的对象
        System.out.println("未删除前" + coll1);
        coll1.remove("a");
        System.out.println("删除后:" + coll1);

        System.out.println("---------------------------");
        // 删除一个集合中 另一个集合中的所有元素
        coll1.removeAll(coll2);
        System.out.println(coll1);

        System.out.println("---------------------------");
        // retainAll,与 removeAll 是相反操作,在一个集合中,只保留另一个集合中的所有内容
        coll1.add("a");
        coll1.add("b");
        coll2.add("123");
        coll2.add("456");

        coll1.addAll(coll2);
        System.out.println("未 retainAll() 之前:" + coll1);
        coll1.retainAll(coll2);
        System.out.println("retain() 之后:" + coll1);

        System.out.println("---------------------------");
        // size() 集合的实际大小
        System.out.println(coll1.size());

        System.out.println("---------------------------");
        // toArray() 将集合转换为数组

        Object[] o = coll1.toArray();
        System.out.println(o[0]);
        System.out.println(o[1]);
    }

}

Student.java – 向集合中插入对象时需要用到:

关于toString() 方法,老铁,戳我没毛病

package collection;

public class Student {

    private String name;
    private int 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 +
                '}';
    }
}

List 中的主要方法:

由于 List 是 Collection 的一個子接口,所以 Collection 中有的方法, List 中也已經存在,在
此不再多加贅述,重点实现一下再 List 中特有的方法(很多都是 重载 Collection 中的方法)。

方法重载不了解的小伙伴戳我哦
在这里插入图片描述
在这里插入图片描述
代码演示:

package collection;

import java.util.ArrayList;
import java.util.List;

public class ListTest {


    public static void main(String[] args) {

        List list = new ArrayList();

        list.add("a");
        list.add("b");
        list.add("c");
        // list 是有序的,(添加是什么顺序,输出时就是什么顺序)
        System.out.println(list);

        System.out.println("--------------------------------------");

        // 重载方法,在指定位置添加元素(位置是从 0 开始的)
        list.add(1,"d");
        System.out.println(list);

        System.out.println("--------------------------------------");

        // get() : 获取集合之中某一个位置的元素(类似于数组的下标)

        Object o = list.get(2);
        System.out.println("位置上有值" + o);
        // 访问的位置上没有值时会报错:java.lang.IndexOutOfBoundsException:
//        Object value = list.get(4);
//        System.out.println("这个位置上没有值:" + value);

        System.out.println("--------------------------------------");

        // indexOf() : 获取某个指定元素(对象) 在集合中的位置,不存在时返回 -1
        int index = list.indexOf("d");
        System.out.println(index);

        int index1 = list.indexOf("x");
        System.out.println(index1);

        System.out.println("--------------------------------------");

        // remove(int index) : 删除指定位置的元素,重载方法(因为 List 是有序的)

        System.out.println(list);
        list.remove(2);
        System.out.println(list);

        System.out.println("--------------------------------------");

        // set() 更改集合中指定位置的值
        System.out.println(list);
        list.set(2,"x");
        System.out.println(list);

        System.out.println("--------------------------------------");
        // subList() 截取集合中的一段元素
        System.out.println(list);
        List list1 = list.subList(1,3);
        System.out.println(list1);

        

    }
}

Set 常用方法:

在这里插入图片描述

Set 中的方法与 List  Collection 中的使用方法类似,再次不在多加赘述,下面会重点说 
List  Set 的区别,选择适合的场景选用即可。

List 和 Set 的区别:

List: 有序,不唯一
Set: 无序,唯一

有序: 输入是有序,输出时跟输入时顺序一样称为有序。
唯一: 元素在集合中的只出现一次。

代码测试:

        List list2 = new ArrayList();
        list2.add("中国");
        list2.add("美国");
        list2.add("美国");
        list2.add("俄罗斯");

        Set set = new HashSet();
        set.add("中国");
        set.add("美国");
        set.add("美国");
        set.add("俄罗斯");

        System.out.println(list2);
        System.out.println(set);

结果:
在这里插入图片描述

ArrayList 和 LinkedList 的区别:

两者各自的方法都是类似的,使用方法也是类似的,只是底层原理实现不一样:

     *  ArrayList() 是动态连续的数组,数组的长度可变  (读取方便,增删改查比较麻烦)
     *  LinkList() -- 与链表类似                   (读取麻烦,增删改查比较容易)

HashSet 和 TreeSet 的区别:

同上,两者各自的方法都是类似的,使用方法也是类似的,只是底层原理实现不一样:
HashSet : 基于 Hash 表实现。
TreeSet :  基于 红黑树实现。
由于本人技术有限,相关知识可以自行了解,嘻嘻。

后记:

到此,跟 Collection 相关的知识就介绍完了,如果有问题或者有疑问的地方,或者写的不到位的地方,
欢迎各位指出,本人一定会细心改正。
如果对您有所帮助,不要忘了 赞 一下哟,嘻嘻,关注一下也是可以的。
加油!

猜你喜欢

转载自blog.csdn.net/qq_43619271/article/details/106270053
今日推荐