Java小白一文讲清Java中集合相关的知识点(一)

集合

诞生缘由

数组

  • 长度开始时必须指定,而且一旦指定,不能更改
  • 保存的必须为同一类型元素
  • 使用数组进行增/删元素所需要编写的代码--比较麻烦
java 复制代码
Person[] pers = new Person[1];
pers[0] = new Person();
//此时增加新的Person对象呢?
Person[] pers2 = new Person[pers.length+1];//新创建数组
for(){}//拷贝pers数组的元素到pers2
pers2[pers2.length-1]=new Person();//添加新对象

//可见很麻烦,所以,集合诞生了

集合介绍

  • 可以动态保存任意多个对象,使用比较方便
  • 提供了一系列方便的操作对象的方法---add、remove、set、get等
  • 使用集合添加,删除新元素所需要编写的代码---简洁

集合的框架体系

单列集合

两个重要的子接口List Set ,他们的实现子类都是单列集合

双列集合

Map的实现子类都是双列集合,以K-V 形式存放

Collection接口和常用方法

  • collection实现子类可以存放多个元素,每个元素可以是Object
  • 有些collection的实现类,可以存放重复的元素,有些不可以
  • Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的

常用方法

接口不能实例化,所以以下的举例以实现了Collection接口的ArrayList类来举例

java 复制代码
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class Journey {
    @SuppressWarnings({"all"})//抑制所有的警告
    public static void main(String[] args) {
        //以ArrayList实现类来演示
        List list = new ArrayList();
        //add 添加单个元素
        list.add("jack");
        list.add(10);//此中有一个自动装箱的过程=(new Integer(10));
        list.add(true);
        System.out.println("List = "+list);//List = [jack, 10, true]

        //remove 删除指定元素
        list.remove(0);//指定删除某个索引对应的元素
        System.out.println("List = "+list);//List = [10, true]
        list.remove(true);//指定删除某个内容
        System.out.println("List = "+list);//List = [10]

        //contains 查找某个元素是否存在
        System.out.println(list.contains("jack"));//false

        //size  获取元素的个数
        System.out.println(list.size());//1

        //isEmpty 判断是否为空
        System.out.println(list.isEmpty());//false

        //clear  清空
        list.clear();
        System.out.println(list.size());//0

        //addAll  添加多个元素,就是可以把装有多个元素的集合再套进另一个集合中,实现原先的集合添加多个元素
        list.add("essence");
        List list2 = new ArrayList();
        list2.add("kerwin");
        list2.add(false);
        list2.add(1110);

        list.addAll(list2);
        System.out.println("此时的list1 = "+list);//此时的list1 = [essence, kerwin, false, 1110]

        //containsAll 查找多个元素是否都存在
        System.out.println(list.containsAll(list2));//true  list中包含有多个元素的集合list2

        //removeAll   删除多个元素
        list.removeAll(list2);
        System.out.println("list = "+list);//list = [essence]

    }
}

Collection接口遍历元素方式

使用Iterator迭代器实现

介绍

  • Iterator对象称为迭代器,主要用于遍历Collection集合中的元素
  • 所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象,即可以返回一个迭代器
  • Iterator的结构
  • Iterator仅用于遍历集合,Iterator本身并不存放对象


java 复制代码
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Journey {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        Collection col = new ArrayList();//向上转型,父类型引用指向子类型对象
        col.add(new Book("三国演义","罗贯中",10.1));
        col.add(new Book("水浒传","施耐庵",5.1));
        col.add(new Book("西游记","吴承恩",63.5));

        System.out.println("col"+col);
        /**
         * 不间断,输出很长的一行
         *  col[Book{name='三国演义', author='罗贯中', price=10.1},
         * Book{name='水浒传', author='施耐庵', price=5.1},
         * Book{name='西游记', author='吴承恩', price=63.5}]
         */
        //现在我们希望能够遍历集合
        //1.先得到col 对应的迭代器
        Iterator iterator = col.iterator();
        //2.使用while循环遍历
        while(iterator.hasNext()){//判断是否还有数据,这里脑海中要浮现出iterator的结构哈
            //返回下一个元素,类型是Object
            Object obj = iterator.next();
            System.out.println("obj="+obj);//这里默认调的是obj对应的toString方法
            //这里会有动态绑定机制,像这里就是绑定到了Book类的toString方法;
            //此中的编译类型确实是Object,但是运行类型是取绝于你真正存放的类型,这里是存放的Book类型嘛

        }
        //经过迭代器后,输出三行
//        obj=Book{name='三国演义', author='罗贯中', price=10.1}
//        obj=Book{name='水浒传', author='施耐庵', price=5.1}
//        obj=Book{name='西游记', author='吴承恩', price=63.5}

        //顺便一提,上面的while循环的框架可以通过快捷键itit就可以快速生成
        //生成如下:

/*        while (iterator.hasNext()) {
            Object obj =  iterator.next();

        }*/

        //3.当退出while循环之后,这时iterator指向最后的元素
        //此时,再取元素
//         iterator.next();
        // 会报NoSuchElementException 异常
        //4.如果希望再次遍历,那么需要重置我们的迭代器
         iterator = col.iterator();
        System.out.println("==========第二次遍历=====");
        while (iterator.hasNext()) {
            Object obj =  iterator.next();
            System.out.println("obj="+ obj);
            
        }
        /**
         * ==========第二次遍历=====
         * obj=Book{name='三国演义', author='罗贯中', price=10.1}
         * obj=Book{name='水浒传', author='施耐庵', price=5.1}
         * obj=Book{name='西游记', author='吴承恩', price=63.5}
         */
    }
}
@SuppressWarnings({"all"})
class Book{
    private String name;
    private String author;
    private double price;

    public Book(String name, String author, double price) {
        this.name = name;
        this.author = author;
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }
}
使用增强for循环实现

增强for循环,可以代替iterator迭代器,特点:增强for就是简化版的iterator,本质一样,只能用以遍历集合或数组

基本语法

  • for( 元素类型 元素名: 集合名或数组名){

    ​ 访问元素

    }

java 复制代码
import java.util.ArrayList;
import java.util.Collection;

public class Journey {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        Collection col = new ArrayList();//向上转型,父类型引用指向子类型对象

        col.add(new Book("三国演义","罗贯中",10.1));
        col.add(new Book("水浒传","施耐庵",5.1));
        col.add(new Book("西游记","吴承恩",63.5));

        //使用增强for循环遍历
        //增强for 其底层还是迭代器
        for(Object book : col){
            System.out.println(book);
        }
        //输出如下
        /**
         * Book{name='三国演义', author='罗贯中', price=10.1}
         * Book{name='水浒传', author='施耐庵', price=5.1}
         * Book{name='西游记', author='吴承恩', price=63.5}
         */

        //这里再讲个快捷键
        //输入一个 I,即可快捷生成增强for框架
   /*
        快速生成以下框架
        for (Object o :) {

        }*/

    }
}
@SuppressWarnings({"all"})
class Book{
    private String name;
    private String author;
    private double price;

    public Book(String name, String author, double price) {
        this.name = name;
        this.author = author;
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }
}

练习

java 复制代码
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Journey {
    public static void main(String[] args) {
        List<Dog> list = new ArrayList<>();
        Dog xiaohuang = new Dog("小黄", 15);
        Dog hei = new Dog("小嘿", 8);
        list.add(xiaohuang);
        list.add(hei);

        //迭代器遍历
        Iterator<Dog> iterator = list.iterator();
        while(iterator.hasNext()){//判断是否为空
            Object obj = iterator.next();
            System.out.println(obj);
        }

        System.out.println("增强for遍历");
        for(Object dogs : list){
            System.out.println(dogs);
        }
    }
}
@SuppressWarnings({"all"})
class Dog{
    private String name;
    private int age;

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

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

//输出
Dog{name='小黄', age=15}
Dog{name='小嘿', age=8}
增强for遍历
Dog{name='小黄', age=15}
Dog{name='小嘿', age=8}
相关推荐
hopetomorrow12 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
不是二师兄的八戒22 分钟前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
小牛itbull22 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i30 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落33 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
爱编程的小生34 分钟前
Easyexcel(2-文件读取)
java·excel
GIS瞧葩菜42 分钟前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming19871 小时前
STL关联式容器之set
开发语言·c++
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
熬夜学编程的小王1 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list