08_Collection集合2

从文件名到应用:Landsat数据命名规则的实战解码 本文深入解析Landsat数据命名规则,将其作为高效筛选遥感数据的关键工具。通过拆解文件名各字段含义,并结合城市监测、农业估产、火灾应急等实战场景,指导用户根据几何精度、处理等级和质量标签快速匹配项目需求,提升卫星数据使用效率。 阅读详情

List 集合

特点与方法

List 系列集合:添加的元素是有序、可重复、有索引

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

public class Test {
    public static void main(String[] args) {
        // 1. 创建一个 ArrayList 集合对象
        List<String> lst = new ArrayList<>();
        lst.add("Jack");
        lst.add("Peter");
        lst.add("Tony");
        System.out.println(lst);  // [Jack, Peter, Tony]

        // 2. 在某索引位置,插入元素
        lst.add(1,"Tomato");
        System.out.println(lst);  // [Jack, Tomato, Peter, Tony]

        // 3. 带走某个索引的元素
        System.out.println(lst.remove(1));  // Tomato
        System.out.println(lst);  // [Jack, Peter, Tony]

        // 4. 返回某索引的元素
        System.out.println(lst.get(2));  // Tony

        // 5. 修改索引位置处的元素,修改成功后,会返回原来的数据
        System.out.println(lst.set(2, "Wang"));  // Tony
        System.out.println(lst);  // [Jack, Peter, Wang]

    }
}
遍历方式
  • for 循环(因为 List 集合有索引)
  • 迭代器
  • 增强 for 循环
  • Lambda 表达式

具体代码演示省略,请参照其父类

底层原理

ArrayList 集合的底层原理

  • 基于数组实现

  • 特点

    查询速度快(通过索引)

    删除效率低

    添加效率低

LinkedList 集合的底层原理

  • 基于双链表实现

  • 特点

    查询速度慢

    增加和删除相对较快

  • 应用场景:可以用来设计队列,也可以设计栈

// 模拟队列

import java.util.LinkedList;

public class Test {
    public static void main(String[] args) {
        // 1. 创建一个队列
        LinkedList<String> queue = new LinkedList<>();

        // 入队
        queue.addLast("第1号人");
        queue.addLast("第2号人");
        queue.addLast("第3号人");
        queue.addLast("第4号人");
        System.out.println(queue);
        
        // 出队
        System.out.println(queue.removeFirst());
        System.out.println(queue.removeFirst());
        System.out.println(queue.removeFirst());
        System.out.println(queue);
    }
}
// 模拟栈

import java.util.LinkedList;

public class Test {
    public static void main(String[] args) {
        // 1. 创建一个栈
        LinkedList<String> stack = new LinkedList<>();

        // 入栈(push)
        stack.addFirst("第1颗子弹");  // 等价于stack.push("第1颗子弹")
        stack.addFirst("第2颗子弹");  // 注意,官方的push背后的本质就是stack.addFirst()
        stack.addFirst("第3颗子弹");
        stack.addFirst("第4颗子弹");
        System.out.println(stack);
        
        // 出栈(pop)
        System.out.println(stack.removeFirst());  // 等价于stack.pop()
        System.out.println(stack.removeFirst());  // 官方pop背后的本质就是stack.removeFirst()
        System.out.println(stack.removeFirst());
        System.out.println(stack);
    }
}

Set 集合

特点
  • 无序、不重复、无索引
  • Set 要用到的常用方法,基本上就是 Collection 提供的!自己几乎没有额外新增的常用功能
HashSet 集合的底层原理

HashSet 集合:无序、不重复、无索引

哈希值

  • 就是一个 int 类型的数值,Java 中每个对象都有一个哈希值
  • Java中的所有对象,都可以调用 Object 类提供的 hashCode 方法,返回该对象自己的哈希值

对象哈希值的特点

  • 同一个对象多次调用 hashCode() 方法返回的哈希值是相同的
  • 不同的对象,它们的哈希值一般不相同,但也有可能相同(哈希碰撞)

底层原理

  • 基于哈希表实现
  • 哈希表是一种增删改查数据,性能都较好的数据结构

哈希表

  • JDK 8 之前:哈希表 = 数值 + 链表
  • JDK 8 之后:哈希表 = 数值 + 链表 + 红黑树

补充:如果希望 Set 集合认为2个内容一样的对象是重复的,必须重写对象的 hashCode() 和 equals() 方法

import java.util.Objects;

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("Jack", 20);
        Student s2 = new Student("Tony", 25);
        Student s3 = new Student("Tony", 25);
        // 哈希值
        System.out.println(s1.hashCode());  // 71329718
        System.out.println(s2.hashCode());  // 80993012
        System.out.println(s3.hashCode());  // 80993012
        System.out.println(s2.hashCode() == s3.hashCode());  // true
        
    }
}

class Student {
    private String name;
    private int age;

    // 重写 equals 方法
    @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);
    }

    // 重写 hashCode 方法
    @Override
    public int hashCode() {
        return Objects.hash(name, 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;
    }
}
LinkedHashSet 集合

LinkedHashSet 集合:有序、不重复、无索引

底层原理

  • 依然是基于哈希表(数值、链表、红黑数)实现的
  • 但是,它的每个元素都额外的多了一个双链表的机制记录它前后元素的位置
TreeSet 集合

TreeSet 集合:不重复、无索引、可排序(默认升序排序)

底层是基于红黑树实现的排序

import java.util.Set;
import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {
        Set<Integer> set1 = new TreeSet<>();
        set1.add(6);
        set1.add(5);
        set1.add(5);
        set1.add(7);
        System.out.println(set1);  // [5, 6, 7]
    }
}

对于自定义类型,如 Student 对象,TreeSet 默认是无法直接排序的(会报错)

import java.util.Set;
import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {
        // 未简化的
//        Set<Student> set1 = new TreeSet<>(new Comparator<Student>() {
//            @Override
//            public int compare(Student o1, Student o2) {
//                return Double.compare(o1.getHeight(), o2.getHeight());
//            }
//        });

        // lambda 简化后
        Set<Student> set1 = new TreeSet<>((o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight()));

        set1.add(new Student("Jack", 25, 51.2));
        set1.add(new Student("Tony", 18, 77.9));
        set1.add(new Student("Peter", 33, 65.8));
        System.out.println(set1);
        // [Student{name='Jack', age=25, height=51.2}, Student{name='Peter', age=33, height=65.8}, Student{name='Tony', age=18, height=77.9}]
    }
}

class Student {
    private String name;
    private int age;
    private double height;

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

    public Student() {
    }

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

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

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }
}
注意事项:集合的并发修改异常问题

注意:使用迭代器遍历集合的时候,又同时在删除集合中的数据,程序就会出现并发修改异常的错误。

产生问题的原因:当我们正向的进行"迭代"或者 for 循环时,变量 i 指向了需要被删除的元素,我们成功删除对象后,其后面的所有元素会立刻前移,此时变量 i 的指向却还是停留原地,这就导致了指向的不匹配!这个问题,在 for 循环中不会报错,但是无法完成业务,而且较难发现问题所在,为了避免这个问题的难以发现,迭代器就贴心的为我们进行了报错,

解决办法

  • 如果能使用 for 循环遍历:可以倒着遍历并删除;或者从前往后遍历,但删除元素后做 i - - 操作
  • 使用迭代器遍历集合,但用迭代器自己的删除方法删除数据即可(其方法的本质上是做了类似 i - - 的操作)

Collection 其他内容

可变参数
import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        // 可变参数
        run();
        run(10);
        run(10, 20, 30);
        run(10, 20, 30, 40);
        
        // 运行结果:
        // []
        // [10]
        // [10, 20, 30]
        // [10, 20, 30, 40]
    }

    // 注意事项:
    // 1. 一个形参列表中,只能有一个可变参数
    // 2. 可变参数必须放在形参列表的最后面
    public static void run(int... nums) {
        // 可变参数在方法内部,本质就是数组
        System.out.println(Arrays.toString(nums));
    }
}
Collections
  • 注意!它不是 Collection 集合,它多了个"s"
  • Collections 是一个用来操作集合的工具类
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        // 1. 为集合批量添加数据
        List<String> lst = new ArrayList<>();
        Collections.addAll(lst, "Jack", "Peter", "Tony");
        System.out.println(lst);  // [Jack, Peter, Tony]

        // 2. 打乱List集合里面的元素顺序
        Collections.shuffle(lst);
        System.out.println(lst);  // [Peter, Tony, Jack]

        // 3. 对List集合里面的元素进行升序排序
        List<Integer> lst2 = new ArrayList<>();
        lst2.add(3);
        lst2.add(5);
        lst2.add(1);
        System.out.println(lst2);  // [3, 5, 1]
        Collections.sort(lst2);
        System.out.println(lst2);  // [1, 3, 5]

        // 4. 自定义的对象如何排序
        List<Student> lst3 = new ArrayList<>();
        lst3.add(new Student("Jack", 25, 51.2));
        lst3.add(new Student("Tony", 18, 77.9));
        lst3.add(new Student("Peter", 33, 65.8));

        Collections.sort(lst3, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return Double.compare(o1.getHeight(), o2.getHeight());
            }
        });
    }
}

class Student {
    private String name;
    private int age;
    private double height;

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

    public Student() {
    }

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

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

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }
}
GEE中Landsat重大改变——Landsat Collection 1 到 Collection 2 影像集合迁移 Landsat Collection 1 到 Collection 2 迁移Landsat Collection 1 到 Collection 2 迁移Collection 1 数据切换 到 Collection 2 数据的说明。自 2022 年以来,集合 2 已在 Earth Engine 中完全可用,。Landsat Collection 1 已弃用,鼓励所有用户尽快迁移到 Collection 2。每个代表了使用一致的方法和例程处理的图像档案的一个版本。随着系统和处理算法的改进,新的集合会产生。 阅读详情

相关推荐

笔记 08 - 集合(Collection 增强for List LinkedList)练习

问答题【Collection接口】 1.1 请问Collection接口下有哪些类型的集合?它们分别是什么? ArrayList.LinkedList.(List) : 存取有序,有索引,元素可重复 set 元素不可重复 1.2 请问Collection接口中定义的方法,它的所有子类是否都有,而且都会实现这些方法? 有,会 1.3 请问向Collection集合添加一个元素用什么方法? add() 1.4 请问从Collection集合中删除一个元素用什么方法?这个方法有返回值吗? rem

qq_45181415的博客 1935

集合、Collection

1.集合的长度是可变的2.集合中的存储的数据可以是不同类型的 ,如果加上泛型的话就是会有限制3.集合中只能存储引用数据类型4.集合框架是在java.util包下的。

qq_64004825的博客 972

Java数据结构 (2) :集合框架(Collection、Map)+ Stream流简介

Java集合框架提供了一套性能优良、使用方便的接口和类,位于java.util包中。Stream是jdk8开始新增的一套API,可以用于操作集合或者数组的数据。

https://www.hyperplasma.top 1618

Java集合(一)—— Collection

Java集合中存放的数据都是以泛型指定,所以Java集合只能存放引用类型数据,基本类型数据是无法存放。三个实现类通用在需要有重复数据的情况下,LinkedList一般使用在大量的插入和删除的情况下,(1)双链表在Java中通过LinkedList的内部类Node(数据域、前指针、尾指针)实现。一般用在查找比较多的情况下,一般使用的都是ArrayList,而在多线程环境下,如果需要使用。比较的是对象的引用(即内存地址),而不是对象的内容或逻辑等价性。(2)每一次使用add增加数据,用的是尾插法增加数据。

weixin_64236449的博客 1588

【通信协议】I2C总线(一主多从)

I2C总线(一主多从)之软件模拟代码详解

m0_75090944的博客 9840

Moodle平台题库建设技术

Moodle平台题库建设技术简述1新的改变1功能快捷键1合理的创建标题,有助于目录的生成1如何改变文本的样式1插入链接与图片1如何插入一段漂亮的代码片1生成一个适合你的列表1创建一个表格1设定内容居中、居左、居右1SmartyPants1创建一个自定义列表1如何创建一个注脚注释也是必不可少的1KaTeX数学公式1新的甘特图功能,丰富你的文章1UML 图表1FLowchart流程图1导出与导入导出1...

lxf78的博客 4534

Collection集合

1.Collection集合1.1集合体系结构【记忆】 集合类的特点 ​ 提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变 集合类的体系图 ​ 1.2Collection集合概述和基本使用【应用】 Collection集合概述 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素...

xiaoyaGrace的博客 189

中心对数比变换(Centered Log Ratio Transformation,CLR)的原理及scikit-bio介绍

中心对数比变换(Centered Log Ratio Transformation,CLR)是一种数据预处理方法,常用于成分数据分析领域。在成分数据中,各成分之间通常存在一定的约束关系,比如它们的和为固定值等,中心对数比变换可以有效地处理这种具有特殊约束的数据。官方文档scikit-bio是一个在Python3中处理生物数据的库成分统计 (skbio.stats.composition )模块中的,此函数将组合从Aitchison几何体转换到真实空间。这个clr。

RECORD LEARN PROGRESS 1万+

Collection单列集合(List集合,Set集合),Map双列集合,Stream流

集合,List集合,SET集合,集合的三种遍历方式

Asiyaa的博客 1222

RagFlow实战:如何用DeepDoc引擎高效处理扫描PDF文档(附完整代码解析)

本文详细解析了如何利用RagFlow的DeepDoc引擎高效处理扫描PDF文档。通过实战演示从环境搭建、PDF预处理、文本检测与识别,到布局分析与表格结构提取的完整流程,并提供了完整的代码实现。该方案超越了传统OCR,能输出保留原始版面信息的结构化数据,为构建高质量知识库提供了强大支持。

weixin_29245767的博客 299

AI 测试工程师 — 6 个月学习计划表

AI 转型测试工程师 —— 6 个月学习计划表

weixin_46453070的博客 1067

JavaSE学习(Day08)【Collection集合】【Map集合】

文章目录Collection集合Iterator接口(迭代器-->对集合进行遍历)增强for循环List接口ArrayList和LinkedListSet接口HashSet、LinkedHashSetCollections工具类 Collection集合 集合:是一种java提供的容器,可以用来存储多个数据 集合框架是一个类库的集合 集合与数组都是容器,区别是什么: 1、数组的长度是固定的、...

weixin_42889562的博客 231

Ardupilot飞控姿态角与姿态角速度控制过程分析(超长篇)

目录 目录 摘要 1.代码控制过程分析 摘要 本节主要记录自己学习ardupilot飞控代码的姿态角速度的控制过程 1.代码控制过程分析 可以看出:AC_AttitudeControl *attitude_control; //指针对象 virtual void rate_controller_run() = 0;是AC_AttitudeContro...

陌城烟雨 1万+

08-集合1-集合类体系结构、Collection、List、泛型

相同点都是容器,可以存储多个数据不同点数组的长度是不可变的,集合的长度是可变的数组可以存基本数据类型和引用数据类型集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类 蓝色外框都是接口、红色外框都是具体实现类Collection集合概述创建Collection集合的对象代码1:add&remove 代码2:removeIf 代码3:清空集合中的元素 代码4:判断集合中是否存在指定元素 public static void main(String[] args) { Collection c =

树叶子的博客 454

【保姆级教程】教你如何轻松获取MIMIC数据使用权限

文章非常详细地介绍了MIMIC数据库申请使用的全部步骤。

越努力 越幸运 6598

【OpenClaw从入门到精通】第24篇:OpenClaw Skill商业化实战指南——从0开发付费技能,在ClawHub变现(2026实测版)

本文聚焦OpenClaw Skill商业化的全流程落地,基于2026年生态现状、公开行业报告及开发者指南,拆解付费Skill的市场机会、商业模式、技术实现、发布运营及避坑要点。核心围绕“Freemium API Backend”主流路径,通过虚拟但贴合真实场景的“金融研报复现”案例,提供从需求分析、定价设计到代码开发、ClawHub上架的完整实操方案。文中包含可直接复用的代码片段、执行结果演示及流程图解,既满足新手快速入门的需求,也为进阶开发者提供商业化落地的关键思路,帮助读者抓住AI Agent早期红利。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1084

Java 08 集合

在Java中,集合(Collection)是一种或用于存储和操作一组对象的数据结构。它提供了一组接口和类,用于处理和操作对象的集合。集合框架是Java中用于表示操作集合的一组类和接口,它位于java.util包中,并提供了一系列的接口和类,包含集合接口Collection,列表接口List,集合类Set,映射接口Map等。集合框架的主要目标是提供一种通用的方式来存储和操作对象的集合,无论集合的具体实现方法如何,用户都可以使用统一的接口和方法操作集合。集合理解:集合分类Collection接口是单列集合类的父

m0_71296672的博客 874

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

java集合(Collection和Map)

数组在存储数据方面的弊端:1.数组初始化以后,长度就不可变了,不便于扩展2.数组中提供的方法非常有限,对于添加、删除、插入数据等操作,非常不便同时效率不高3.获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用4.数组存储数据的特点:有序、可重复,对于无序、不可重复的需求,不能满足这里是用多态写的,父类引用指向子类对象抽象类和接口都不能实例化,因为collection是接口,所以要创建实现类的对象,调用实现类的方法Collection接口:单列集合,用来存储一个一个的对象。

2401_83191759的博客 895

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java基础08-集合框架—单列集合

TreeSet集合存储自定义类型的对象时,必须指定排序规则,支持如下两种方式来指定比较规则。方式一:让自定义的类( 如学生类)实现Comparable接口,重写里面的compareTo方法来指定比较规则。方式二:通过调用TreeSet集合有参数构造器,可以设置Comparator对象( 比较器对象,用于指定比较规则。//学生类(通过实现 Comparable 接口来自定义规则)//重写compareTo方法实现安装规则排序@Override。

qq_57340195的博客 1008

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

笔记 - 08 - 集合(Collection 增强for List LinkedList)

1.Collection集合 1.1数组和集合的区别【理解】 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类 1.2集合类体系结构【理解】 1.3Collection 集合概述和使用【应用】 Collection集合概述 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素 JDK 不提供此接口的任何直接实现.

qq_45181415的博客 226

Java 集合Collection 与 Map

之后每次扩充,容量变为原来的 2 倍。JDK1.7 及之前版本的 HashMap 在多线程环境下扩容操作可能存在死循环问题,这是由于当一个桶位中有多个元素需要进行扩容时,多个线程同时对链表进行操作,头插法可能会导致链表中的节点指向错误的位置,从而形成一个环形链表,进而使得查询元素的操作陷入死循环无法结束。二叉树就是每个节点最多有两个子节点的有序树,每个节点及其子节点组成的树称为子树,左侧的节点称为"左子树",右侧的节点称为"右子树",其中左子树上的元素小于它的根结点,而右子树上的元素大于它的根结点。

叼着烟吻着你的香 1131

学习011-08-07 Collection Properties(集合属性)

WinForms和ASP.NET Web窗体应用程序使用ListProperty tyEditor在NestedFrameTemplateV2和NestedFrameControlNew中显示集合属性。在模型编辑器中,将IModelMemberViewItem. View属性设置为自定义列表视图,以使用此视图而不是默认视图。请参阅随XAF安装的功能中心演示中的属性编辑器|集合属性部分以查看正在运行的集合属性编辑器。XAF应用程序在嵌套列表视图中显示集合属性。不同的集合属性在UI中具有不同的操作。

DevExpress Xaf 学习专栏 1383

Java基础08集合

​ 数据存储的容器,大小不固定。​ Collection集合层次的顶级接口。​ < E >表示泛型—用于限定元素的数据类型的—而且由于泛型的限定,集合只能存储引用类型的数据。

qq_63550078的博客 969

黑马程序员 JavaSE-08 Collection(集合)

JavaSE-09 集合(Collection)

ClimberRobert的博客 459
上一篇: 07_Collection集合1
下一篇: 09_Map集合
code_stream
博客等级 码龄4年 1238粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值