Java中的集合如何理解(一)——精简

目录

引言

概念

体系特点

集合对于泛型的支持  

Collection常用API  

遍历方式 

迭代器遍历

 增强for循环

Lambda表达式 

 集合存储自定义类型的变量 


引言

在之前Java的学习过程中,我们已经学习过了数组,可以通过数组储存一些已知数量的数据,比如春夏秋冬、黑红梅芳、东南西北等数据,然而当我们想要储存其他未知数量的数据的时候,数组已经无法让我们使用了,这个时候我们引进集合的概念,可以帮助我们化解这个问题,集合所涉及的知识较多,因此会分为多个版块进行讲解。希望能够通过这篇文章帮助你加深对集合的理解以及在Java的学习过程之中更加优秀! 

概念

  • 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定,类似于一个没有限制的容器,随时都可以在里面装东西
  • 集合非常适合做元素的增删操作
  • 注意:集合中只能储存引用类型数据,如果要储存基本类型数据,可以选用包装类
  • 使用场景:当存储数据的数量未知的情况下,可以通过定义集合来实现,可以有效的避免容量不够 

体系特点

集合共有两个体系,分别是Collection(单列)和Map(双列) 

Collection单列集合,每个元素(数据)只保存一个值

Map双列集合,每个元素包含两个值(键值对)

tips:前期主要先掌握Collection集合体系的使用,因此今天我们主要讲解Collection的使用

  Collection集合体系(其中黄色为接口类,蓝色为实现类)

  • List系列集合:添加的元素是有序、可重复、有索引
  • ArrayList、LinekdList:有序、可重复、有索引
  • Set系列集合:添加的元素是无序、不重复、无索引
  • HashSet:无序、不重复、无索引
  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:按照大小默认升序排序、不重复、无索引

 List系列集合:有序、可重复、有索引 

Collection list = new Arrayslist();
list.add("石原里美");
list.add("石原里美");
list.add("工藤静香");
list.add(110);
list.add(119);
list.add(true);
list.add(false);
System.out.println(list);
//输出结果:
[石原里美,石原里美,工藤静香,110,119,true,false]

Set系列集合:无序、不重复、无索引

Collection list = new HashSet();
list.add("石原里美");
list.add("石原里美");
list.add("工藤静香");
list.add(110);
list.add(119);
list.add(true);
list.add(false);
System.out.println(list);
//输出结果:
[false, 工藤静香, 119, 石原里美, 110, true]

集合对于泛型的支持  

集合都是支持泛型的,可以在编译阶段约束集合只能操作某种数据类型

Collection<String> lists = new ArrayList<String>();
Collection<String> lists = new ArrayList();//JDK1.7开始后面的泛型类型可以省略不写

注意:集合和泛型都只能支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象

Collection<int> lists = new ArrayList<>();//报错

如果集合中要存储基本类型的数据怎么办?

Collection<Integer> lists = new ArrayList<>();
Collection<Double> lists = new ArrayList<>();

Collection常用API  

下面介绍一些在日常操作过程中,我们经常能够使用到的CollectionAPI:

public static void main(String[] args) {
        Collection<String> list = new ArrayList<>();
        //1、添加元素,成功则返回true
        list.add("石原里美");
        System.out.println(list.add("工藤静香"));
        System.out.println(list);
        System.out.println("------------------------");
        //2、清空集合中的元素
        list.clear();
        System.out.println(list);
        System.out.println("------------------------");
        //3、判断元素是否为空,是空返回true,反之则false
        System.out.println(list.isEmpty());
        //4、获取集合的大小
        System.out.println("------------------------");
        System.out.println(list.size());
        System.out.println("------------------------");
        //5、判断集合中是否包含某个元素
        list.add("石原里美");
        list.add("工藤静香");
        System.out.println(list.contains("石原里美"));
        System.out.println("------------------------");
        //6、删除某个元素,若有重复,则默认删除第一个
        list.add("石原里美");
        System.out.println(list);
        list.remove("石原静香");
        list.remove("石原里美");
        System.out.println(list);
        System.out.println("------------------------");
        //7、把集合转换成数组
        Object[] array = list.toArray();
        System.out.println(Arrays.toString(array));
        System.out.println("------------------------");
        //8、将一个集合中的元素添加到另一个集合中
        Collection<String> l1 = new ArrayList<>();
        Collection<String> l2 = new ArrayList<>();
        l1.add("石原里美");
        l1.add("工藤静香");
        l2.add("朱茵");
        l2.add("紫霞仙子");
        l1.addAll(l2);
        System.out.println(l1);
        System.out.println(l2);//l2中的元素没有变化

    }
//输出结果:
true
[石原里美, 工藤静香]
------------------------
[]
------------------------
true
------------------------
0
------------------------
true
------------------------
[石原里美, 工藤静香, 石原里美]
[工藤静香, 石原里美]
------------------------
[工藤静香, 石原里美]
------------------------
[石原里美, 工藤静香, 朱茵, 紫霞仙子]
[朱茵, 紫霞仙子]

遍历方式 

迭代器遍历

  •  遍历就是一个一个的把容器中的元素访问一遍
  • 迭代器在Java中的代表是iterator,迭代器是集合的专用遍历方式 
Collection<String> list = new ArrayList<>();
list.add("石原里美");
list.add("工藤静香");
list.add("朱茵");
list.add("紫霞仙子");
Iterator<String> it = list.iterator();
while(it.hasNext){//判断索引处有无值
    System.out.println(it.next);//从零索引开始取值,取过值以后,索引后移
}
//输出结果:
石原里美
工藤静香
朱茵
紫霞仙子

 增强for循环

 增强for循环:既可以遍历集合也可以遍历数组

它是JDK5之后出现的,其内部原理是一个lterator迭代器,遍历集合相当于是迭代器的简化写法

实现lterable接口的类才可以使用迭代器和增强for,Collection接口已经实现了lterable接口

格式:

for(元素数据类型 变量名 : 数组或者Collection集合){

        在此处使用变量即可,该变量就是元素

}

Collection<String> list = new ArrayList<>();
for(String s : list){
    System.out.println(s);
}
//输出结果(沿用前面的list):
石原里美
工藤静香
朱茵
紫霞仙子
int [] age = {10,18,25};
for(int a : age){
    System.out.println(a);
    if(age==18){
        age = 28;//改age无意义,只是修改了遍历的值,不会影响数组元素(值传递)
    }
}
//输出结果
10
18
25

Lambda表达式 

得益于JDK8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式

//之前学习的匿名内部类
Collection <String>list = new ArrayList<>();
list.forEach(new Consumer<String>(){
    @Override
    public void accept(String s){
        System.out.println(s);
    }
});
//简化为Lambda表达式
list.forEach(s->{
    System.out.println(s);
});
//或者更加简化:
list.forEach(s -> System.out.println(s));
//输出结果(沿用前面的list):
石原里美
工藤静香
朱茵
紫霞仙子

其内核思想主要是集合的forEach方法(),只不过它是可以简化为Lambda表达式的形式,使得代码更加简便;接下来讲解一下该方法是如何使用的:

截图中的内容即是该方法的具体方法体,传入的参数即是上面代码通过new获取的对象,而接下来的语句即是增强for循环的格式,其中“T是元素数据类型,t是变量名,this则指代list集合”。

 集合存储自定义类型的变量 

 案例:创建一个Student类,分别创建两个对象s1和s2,并将这两个对象储存在集合之中,并通过刚学过的遍历方法进行输出。

//学生类的代码就不写了,篇幅过大,影响观感
//其中主要有四个变量
Collection<Student> Students = new ArrayList<>();
        Student s1 = new Student("张三","智能",18,1);
        Students.add(s1);
        Student s2 = new Student("李四","数据库",19,2);
        Students.add(s2);
        for(Student student:Students){
            System.out.println("姓名:"+student.getName());
            System.out.println("学号:"+student.getNum());
            System.out.println("年龄:"+student.getAge());
            System.out.println("班级:"+student.getClassroom());
            System.out.println("-------------------------");
        }
//输出结果:
姓名:张三
学号:1
年龄:18
班级:智能
-------------------------
姓名:李四
学号:2
年龄:19
班级:数据库
-------------------------

创作不易,给个三连 

猜你喜欢

转载自blog.csdn.net/weixin_50635856/article/details/124711041