Java学习笔记(九)List集合、Set集合

java之集合(详细-Map,Set,List) TreeSet集合存储自定义类型的对象时,必须指定排序规则,支持如下两种方式来指定比较规则。方式一让自定义的类(如学生类)实现Comparable接口,重写里面的compareTo方法来指定比较规则。方式二通过调用TreeSet集合有参数构造器,可以设置Comparator对象(比较器对象,用于指定比较规则。根据方式一解决对象排序根据方式二解决对象排序注意:如果既用了方式一又用了方式二进行自定义排序,那么TreeSet就近选择自己自带的比较器对象进行排序; 阅读详情

Collection中的常用子类( java.util.List 集合、 java.util.Set 集合)。

一、List接口

1、List接口中常用方法

List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法,如下:

  • public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。
  • public E get(int index):返回集合中指定位置的元素。
  • public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。
  • public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
public class ListDemo {
    public static void main(String[] args) {
		// 创建List集合对象
    	List<String> list = new ArrayList<String>();
    	
    	// 往 尾部添加 指定元素
    	list.add("图图");
    	list.add("小美");
    	list.add("不高兴");
    	
    	System.out.println(list);
    	// add(int index,String s) 往指定位置添加
    	list.add(1,"没头脑");
    	
    	System.out.println(list);
    	// String remove(int index) 删除指定位置元素  返回被删除元素
    	// 删除索引位置为2的元素 
    	System.out.println("删除索引位置为2的元素");
    	System.out.println(list.remove(2));
    	
    	System.out.println(list);
    	
    	// String set(int index,String s)
    	// 在指定位置 进行 元素替代(改) 
    	// 修改指定位置元素
    	list.set(0, "三毛");
    	System.out.println(list);
    	
    	// String get(int index)  获取指定位置元素
    	
    	// 跟size() 方法一起用  来 遍历的 
    	for(int i = 0;i<list.size();i++){
    		System.out.println(list.get(i));
    	}
    	//还可以使用增强for
    	for (String string : list) {
			System.out.println(string);
		}  	
	}
}

2、List的子类

(1)ArrayList集合

java.util.ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。

许多程序员开发时非常随意地使用ArrayList完成任何需求,并不严谨,这种用法是不提倡的。

(2)LinkedList集合

java.util.LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。

LinkedList是一个双向链表
在这里插入图片描述
实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。这些方法我们作为了解即可:

  • public void addFirst(E e):将指定元素插入此列表的开头。
  • public void addLast(E e):将指定元素添加到此列表的结尾。
  • public E getFirst():返回此列表的第一个元素。
  • public E getLast():返回此列表的最后一个元素。
  • public E removeFirst():移除并返回此列表的第一个元素。
  • public E removeLast():移除并返回此列表的最后一个元素。
  • public E pop():从此列表所表示的堆栈处弹出一个元素。
  • public void push(E e):将元素推入此列表所表示的堆栈。
  • public boolean isEmpty():如果列表不包含元素,则返回true。

LinkedList是List的子类,List中的方法LinkedList都是可以使用,这里就不做详细介绍,我们只需要了解LinkedList的特有方法即可。在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。(了解即可)

public class LinkedListDemo {
    public static void main(String[] args) {
        LinkedList<String> link = new LinkedList<String>();
        //添加元素
        link.addFirst("abc1");
        link.addFirst("abc2");
        link.addFirst("abc3");
        System.out.println(link);
        // 获取元素
        System.out.println(link.getFirst());
        System.out.println(link.getLast());
        // 删除元素
        System.out.println(link.removeFirst());
        System.out.println(link.removeLast());

        while (!link.isEmpty()) { //判断集合是否为空
            System.out.println(link.pop()); //弹出集合中的栈顶元素
        }

        System.out.println(link);
    }
}

二、Set接口

java.util.Set接口和java.util.List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。

Set集合有多个子类,这里我们介绍其中的java.util.HashSet、java.util.LinkedHashSet这两个集合。

tips:Set集合取出元素的方式可以采用:迭代器、增强for。

哈希表:数组+链表/红黑树

1、HashSet集合介绍

java.util.HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。java.util.HashSet底层的实现其实是一个java.util.HashMap支持。 HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于:hashCode与equals方法。、

    java.util.Set接口 extends Collection接口
    Set接口的特点:
        1.不允许存储重复的元素
        2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
    java.util.HashSet集合 implements Set接口
    HashSet特点:
         1.不允许存储重复的元素
         2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
         3.是一个无序的集合,存储元素和取出元素的顺序有可能不一致
         4.底层是一个哈希表结构(查询的速度非常的快)
public class HashSetDemo {
    public static void main(String[] args) {
        //创建 Set集合
        HashSet<String>  set = new HashSet<String>();

        //添加元素
        set.add(new String("cba"));
        set.add("abc");
        set.add("bac"); 
        set.add("cba");  
        //遍历
        for (String name : set) {
            System.out.println(name);
        }
    }
}

输出结果如下,说明集合中不能存储重复元素:

cba
abc
bac

tips:根据结果我们发现字符串"cba"只存储了一个,也就是说重复的元素set集合不存储。

2、HashSet集合存储数据的结构(哈希表)

什么是哈希表呢?

在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。

简单的来说,哈希表是由数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,如下图所示。
在这里插入图片描述
存储流程图
在这里插入图片描述
总而言之,JDK1.8引入红黑树大程度优化了HashMap的性能,那么对于我们来讲保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。

3、HashSet存储自定义类型元素

给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一

创建自定义Student类

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 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);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
public class HashSetDemo2 {
    public static void main(String[] args) {
        //创建集合对象   该集合中存储 Student类型对象
        HashSet<Student> stuSet = new HashSet<Student>();
        //存储 
        Student stu = new Student("于", 43);
        stuSet.add(stu);
        stuSet.add(new Student("郭1", 44));
        stuSet.add(new Student("于", 43));
        stuSet.add(new Student("郭2", 23));
        stuSet.add(stu);

        for (Student stu2 : stuSet) {
            System.out.println(stu2);
        }
    }
}
执行结果:
Student [name=郭1, age=44]
Student [name=于, age=43]
Student [name=郭2, age=23]

4、LinkedHashSet

HashSet保证元素唯一(不允许重复),可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢?
在HashSet下面有一个子类java.util.LinkedHashSet,它是链表和哈希表组合的一个数据存储结构。

public class LinkedHashSetDemo {
	public static void main(String[] args) {
		Set<String> set = new LinkedHashSet<String>();
		set.add("bbb");
		set.add("aaa");
		set.add("abc");
		set.add("bbc");
        Iterator<String> it = set.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}
}
结果:
  bbb
  aaa
  abc
  bbc

5、可变参数

在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以对其简化成如下格式:

修饰符 返回值类型 方法名(参数类型... 形参名){  }

这个书写完全等价与

修饰符 返回值类型 方法名(参数类型[] 形参名){  }

只是后面这种定义,在调用时必须传递数组,而前者可以直接传递数据即可。
JDK1.5以后。出现了简化操作。… 用在参数上,称之为可变参数。

同样是代表数组,但是在调用这个带有可变参数的方法时,不用创建数组(这就是简单之处),直接将数组中的元素作为实际参数进行传递,其实编译成的class文件,将这些元素先封装到一个数组中,在进行传递。这些动作都在编译.class文件时,自动完成了。

public class ChangeArgs {
    public static void main(String[] args) {
        int[] arr = { 1, 4, 62, 431, 2 };
        int sum = getSum(arr);
        System.out.println(sum);
        //  6  7  2 12 2121
        // 求 这几个元素和 6  7  2 12 2121
        int sum2 = getSum(6, 7, 2, 12, 2121);
        System.out.println(sum2);
    }

    /*
     * 完成数组  所有元素的求和 原始写法
     
      public static int getSum(int[] arr){
        int sum = 0;
        for(int a : arr){
            sum += a;
        }
        
        return sum;
      }
    */
    //可变参数写法
    public static int getSum(int... arr) {
        int sum = 0;
        for (int a : arr) {
            sum += a;
        }
        return sum;
    }
}

tips: 上述add方法在同一个类中,只能存在一个。因为会发生调用的不确定性

注意:如果在方法书写时,这个方法拥有多参数,参数中包含可变参数,可变参数一定要写在参数列表的末尾位置。

------ 文章知识点来源于网络,这里只想记录一下学习笔记,供日后使用时查看,不做任何商用,若有侵权请联系删除。

HWSD中国土壤数据库 T_PH_H2O: Real (酸碱度) T_CEC_CLAY: Real (粘性层土壤的阳离子交换能力);T_CEC_SOIL: Real (土壤的阳离子交换能力) T_BS: Real (基本饱和度);T_CACO3: Real (碳酸盐或石灰含量) T_CASO4: Real (硫酸盐含量);ADD_PROP: Real (土壤单元中与农业用途有关的特定土壤类型);T_USDA_TEX: Real (USDA土壤质地分类);T_REF_BULK: Real (土壤容重); 阅读详情

相关推荐

大模型蒸馏实战:让小模型获得大模型的知识

本文为初学者提供了一份大模型蒸馏实战指南,通过情感分析任务演示如何将 BERT 的知识迁移到轻量级 TextCNN。文章结合原理图解与 PyTorch 代码,详解软标签生成、温度调节和双损失设计等核心概念,并对比蒸馏前后的性能差异(准确率提升 4.6%,推理速度达 1200 句 / 秒)。内含可直接运行的代码片段、训练技巧及常见问题解答,助力开发者快速掌握模型压缩核心技术,实现工业级部署效率。适合 NLP 入门者学习实践。

1368

JAVA 8 LIST<对象> 转换SET

//list对象 转换Set Set<String> collect = users.stream().map(User ->User.getUserName()).collect(Collectors.toSet());

诚的博客 5148

从零开始:用Python搭建你的第一个加密货币量化交易机器人(附完整代码)

本文详细介绍了如何使用Python从零开始搭建一个加密货币量化交易机器人,涵盖环境准备、交易所API连接、基础交易策略实现、回测系统构建以及实盘部署等关键步骤。通过完整的代码示例,帮助读者快速掌握数字货币量化交易的核心技术,适合有一定编程基础的投资者入门。

weixin_30415113的博客 465

java8 操作List,Map,Set

业务场景: 在很多时候导入导出excel数据的时候需要频繁的查询数据库,这样可以先把需要的数据加载到内存在操作. 效率会明显提高,但是吃内存.(应对数据量不是那么大还需要关联的数据可以适当这样操作) //创建集合 List<SysUser> data = new ArrayList<>(); //给集合里添加一个元素 data.add(new SysUser().setUsername("张三").setPhone("123456")); //使用java8的stream流

圣贤参上 456

python特征选择pso_【来点干货】机器学习中常用的特征选择方法及非常详细的Python实例...

花费了很长时间整理编辑,转载请联系作者授权,违者必究。特征选择(Feature selection)是在构建预测模型的过程中减少输入变量的一个过程。它是机器学习中非常重要的一步并在很大程度上可以提高模型预测精度。这里我总结了一些机器学习中常见的比较有用的特征选择方法并附上相关python实现code。希望可以给大家一些启发。首先,我们为什么要进行特征选择呢?它有以下几个优点:减少过拟合:冗余数据常...

weixin_39927158的博客 1161

【Agent】多智能体框架MetaGPT入门教程

创建一个 Action 类的子类 SimpleWriteCode,子类中定义好 prompt,并解析返回结果。在 MetaGPT 中,

酒酿小圆子呀~ 3137

List中的set方法和add方法

[LeetCode]–119. Pascal’s Triangle II 在做这个题的时候,我发现了一个list初始化的问题。就是set必须是new出来的具体list初始化之后才能使用,不然就会报错。下面就研究一下set和add。 package yanning; import java.util.LinkedList; i...

weixin_33929309的博客 1528

RK3588开发笔记-spi扩展canfd芯片MCP2518FD调试笔记

在嵌入式系统开发中,CANFD(控制器局域网灵活数据速率)是一种广泛应用于汽车和工业自动化领域的通信协议。为了满足项目需求,我们在RK3588平台上通过SPI接口扩展了CANFD芯片MCP2518FD,之所以用spi进行canfd扩展,是为了解决原生RK3588原生can不够稳定的问题(发送扩展帧有几率编程标准帧,RK3568/3588均存在该问题)。通过本次调试工作,我们成功地在RK3588平台上扩展了CANFD芯片MCP2518FD,并实现了与CAN总线的稳定通信。

flypig has a dream! 4225

java中set集合_java中怎么往集合类set里添加数据??

展开全部两种向Set中添加元素的方法,第一种是使用add()方法,每次添加一个元素到set中,当集合中不存在相32313133353236313431303231363533e59b9ee7ad9431333365656630同元素时将添加到集合中,并返回true,当集合中存在元素时,返回false。代码如下:Set sets = new HashSet<>();sets.add("S...

weixin_28937075的博客 4720

家里摄像头录像存 NAS,空间爆满了怎么办?一招实现设定容量自动清理实现循环存储!

📷 家用摄像头录像久了会撑爆 NAS 吗?别担心,这篇文章教如何实现自动清理录像,释放 NAS 空间,避免爆盘🧹

XiaoqiangClub的博客 1882

KingSCADA实现按钮点击效果

哈喽,你好啊,我是雷工!在做SCADA项目的时候,按钮是不可缺少的功能,但软件自带的按钮太丑,已经无法满足现如今客户对界面美观度的要求。这时候就需要UI小姐姐设计美观大气的SCADA界面,但UI设计的按钮切图放到程序中只是图片素材,当添加了按钮功能时,虽然能实现按钮功能,但没有任何点击效果;当遇到有需要连锁条件才能点击的按钮时,操作员无法区分是有连锁点击了没反应,还是系统界面卡死了导致的没点击成功,这时候有点击效果就能很好的区分这种问题。本篇介绍一种实现按钮点击效果的方法,以下为操作过程。

做有价值的事,积累有价值的笔记! 2765

Java Collection,List集合和Set集合

类实现Comparable接口,重写比较规则。集合自定义Comparator比较器对象,重写比较规则。

2201_76027718的博客 1949

LPDDR4 JEDEC标准测试实例解析--写操作

LPDDR4的JEDEC标准一致性测试项详解以及实例分享,满满干货!感兴趣的小伙伴可以持续关注!!

一只豌豆象的博客 7774

【Java集合】List,Map,Set-详细讲解

数组的长度是不可变的,一旦被创建,不能被修改。而集合的长度是可变的。数组中存储的元素可以是基本数据类型,也可以是对象。而集合中存储的元素只能是对象。数组可以通过下标直接访问到元素,而集合需要通过迭代器等方式来获取元素。

2302_81153890的博客 2003

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JAVA中Map,List,set集合的学习总结

java中Object 是所有类的基类 :如下图所示 一. Map集合的使用 常用方法 size() 获取集合中名值对的数量 put(key k, value v ) 添加元素 get( k ) 获取键对应的值 remove( key)键对应的元素 clear()清空 contains(key) 查询集合中是否包含某个K contains(value) 查询集合中是否包含...

nsnsvip的博客 3028

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

List集合与Set集合

Java中的所有对象,都可以调用Obejct类提供的hashCode方法,返回该对象自己的哈希值。但是,它的每个元素都额外的多了一个双链表的机制记录它前后元素的位置。或者也可能需要进行数组的扩容。用HashSet集合 (无序, 不重复, 无索引) ,底层基于哈希表实现的。1、如果希望记住元素的添加顺序, 需要存储重复的元素, 又要频繁的根据索引查询数据?4.如果希望记住元素的添加顺序, 也没有重复元素需要存储, 且希望增删改查都快?特点:不重复、无索引、可排序(默认升序排序,按照元素的大小,由小到大排序)

2401_87053441的博客 1473

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java list转set;JDK8 下list 集合转Set 集合

**List 集合转Set 集合 ** List 集合和Set 集合的区别 在说如何List集合转Set 集合之前我们先回顾一下List 集合和Set 集合的区别。 他们之间比较细致的区别有蛮多的,不过比较粗糙地来说List 和Set 之间的区别有以下那么几点 (1) llist 和 ...

weixin_44012027的博客 1万+

集合进阶-List、Set集合

最后,将所有的Collection集合总结一下,要求大家掌握每一种集合的特点,以及他们的体系结构。好了,关于Collection集合,到这里就学习完了。

2302_76719419的博客 2731

JAVA中的Collection,List,Set,Map集合的使用与万字详解

在JAVA.until包中提供了一些集合,其中List集合的List接口和Set接口实现了Collection接口,这些集合被称为容器。集合和数组不同,数组的长度是固定的,集合的长度是可变的;数组只能存放基本数据类型且只能存储一种类型,集合用来存放类对象的引用并且可以存储同一种类型。该框架必须是高性能的。的实现也必须是高效的。该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。对一个集合的扩展和适应必须是简单的。1、List列表:有序的,可重复的;2、Queue队列:有序,可重复的;

2302_79993788的博客 1605

Java中List集合与Set集合

目录 一、List 集合 1、List 接口特点 2、List 接口中常用的方法 3、List 集合存储数据结构 4、ArrayList 集合ArrayList 集合是最常用的集合,是用存储数据结构,元素增删慢,查找快。 5、LinkedList 集合 6、Vector 集合 二、Set 接口 1、HashSet 集合 2、HashSet 集合存储数据的结构(哈希表) 3、S...

ONESTARの博客 5852

java中的集合(List、Set、Map集合使用大解析)

List、Set、Map集合使用大解析

weixin_39038328的博客 1603

java集合之Set与List总结

java集合总结 Set集合(理解)          (1)Set集合的特点                   无序,唯一          (2)HashSet集合(掌握)                   A:底层数据结构是哈希表(是一个元素为链表的数组)                   B:哈希表底层依赖两个方法:hashCode()和equals()

leeioy的博客 1万+

Java集合之List,Set集合详细解释

数组与集合 数组和集合都是存放 Java数据的 Java容器,数组与集合底层的数据结构都是线性结构,对于数组而言,一旦声明了长度,数据存放的容量就不能进行改变,集合就不一样,集合也是容器但是里面的数据容量却是可以改变的,不同的集合所存放的集合数据规则也就不一样。数组在删除,添加,修改操作方面的效率不太高,存储数据的特点是有序可重复的,但是对于无序,不可重复的需求来讲,数组就无法实现了,此时Java就引出了集合这个概念。Java中的集合类都放在了**java.util**包中 单列集合框架结构 上图中的集合

qq_41857955的博客 7587

【JAVA学习笔记】集合:List、Set、Map

Java 集合框架提供了丰富的数据存储与操作工具,数组与集合各有优势,需根据实际需求合理选择。List、Set、Map 等接口的实现类在增删改查等操作中各具特色,适用于不同场景。迭代器确保了集合遍历的安全性,Comparator 提供了灵活的排序方式,而泛型则大幅提升了代码的类型安全性和复用性。深入理解并熟练运用这些组件,能够帮助开发者编写出高效、稳定且易维护的 Java 程序。在实际项目中,巧妙结合这些技术,将有力提升软件开发的质量与效率。

weixin_48272591的博客 2058

Java集合框架中的List、Map、Set详解

List、Map、Set

小L的博客 1905

浅谈集合List,Set以及Map集合的特点及区别

集合List Set以及Map的区别 要想了解三者的区别,我们想来看看java的集合框架图 接着就需要从它们各自的特点来说 1.List的主要特点及用法 1.1 可以允许存储重复的对象 1.2 可以插入多个null元素 1.3 是一个有序容器,保持了每一个元素的插入顺序,插入的顺序即输出的顺序 1.4 常用的实现类有 ArrayList、LinkedList 和 Vector。A...

qq_42894060的博客 8969
上一篇: Java学习笔记(八)泛型
下一篇: Java学习笔记(十)Collections集合工具类
Davidysw
博客等级 码龄7年 1010粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值