集合及映射

news2024/12/23 18:48:39

1、集合类图

1)ArrayList与LinkedList 区别

LinkedList 实现了双向队列的接口,对于数据的插入速度较快,只需要修改前后的指向即可;ArrayList对于特定位置插入数据,需要移动特定位置后面的数据,有额外开销

public class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add(1,"d");//相对LinkedList插入速度较慢
        System.out.println(list);
        System.out.println(list.get(1));//直接通过数据下标index获取数据,查询速度相对LinkedList较快

        List<String> linkedList = new LinkedList<>();
        linkedList.add("a");
        linkedList.add("b");
        linkedList.add("c");
        linkedList.add(2,"d");//相对ArrayList插入速度较快
        System.out.println(linkedList.get(1));//需要遍历整个队列,查询速度相对ArrayList较慢

        System.out.println(linkedList);

    }
}

2)Set 存储的元素不重复,元素重复的标准如下:

i:先判断集合元素的hashCode是否在集合里面存在,不存在认为是不重复的,直接插入进集合,插入集合的位置按照hash出来散列值排序
ii:如果集合元素的hashCode在集合里面存在,需要再判断集合元素的内容是否一致(存在hash冲突,即不同的元素hash后产生相同的hashCode),调用equals方法,如果内容不一致,可以插入
iii:调用equals方法,如果内容一致,说明是重复,则不插入集合
import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.Objects;

@Data
@AllArgsConstructor
public class Student {
    private String num;//学号
    private String name;
    private int age;

    @Override
    public int hashCode() {
        return num.hashCode();//用学号计算hashCode
    }

    @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(num, student.num) && Objects.equals(name, student.name);
    }

    @Override
    public String toString() {
        return this.hashCode() + "-Student{" +
                "num='" + num + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
import java.util.*;

public class Test {
    public static void main(String[] args) {
        Set<Student> set = new HashSet<Student>();
        /**
         * set集合里面内容不可重复,判断重复的标准是:
         * 1)先判断集合元素的hashCode是否在集合里面存在,不存在认为是不重复的,直接插入进集合,插入集合的位置按照hash出来散列值排序
         * 2)如果集合元素的hashCode在集合里面存在,需要再判断集合元素的内容是否一致(存在hash冲突,即不同的元素hash后产生相同的hashCode),
         *    调用equals方法,如果内容不一致,可以插入
         * 3)调用equals方法,如果内容一致,说明是重复,则不插入集合
         */
        Student s1 = new Student("1", "张三", 18);//hashCode:49
        Student s2 = new Student("2", "李四", 19);//hashCode:50
        set.add(s1);set.add(s2);
        System.out.println(set);//[49-Student{num='1', name='张三', age=18}, 50-Student{num='2', name='李四', age=19}]
        Student s4 = new Student("1", "赵六", 18);//hashCode:49,此时集合中已经存在hashCode=49的元素
        boolean add = set.add(s4);//true hashCode与s1一致,但是内容与s1不同,可以插入
        System.out.println(set);//[49-Student{num='1', name='张三', age=18}, 49-Student{num='1', name='赵六', age=18}, 50-Student{num='2', name='李四', age=19}]
        Student s5 = new Student("1", "张三", 18);//hashCode:49,内容与s1完全一致,插入不成功
        add = set.add(s5);
        System.out.println(add);//false
    }
}

3)TreeSet 实现了SortedSet 接口,存放的元素可以按照自定义的顺序排序,示例如下:按照学生年龄升序排序

import java.util.*;

public class Test {
    public static void main(String[] args) {
        Set<Student> set = new TreeSet<>((s1,s2) -> {
            return s1.getAge() - s2.getAge();//定义排序的集合,按照学生年龄升序排序
        });
        Student s1 = new Student("1", "张三", 20);
        Student s2 = new Student("2", "李四", 25);
        Student s3 = new Student("3", "李四", 18);
        set.add(s1);
        set.add(s2);
        set.add(s3);
        //[51-Student{num='3', name='李四', age=18}, 49-Student{num='1', name='张三', age=20}, 50-Student{num='2', name='李四', age=25}]
        System.out.println(set);
    }
}

2、映射类图:

1)HashMap、LinkedHashMap、TreeMap 区别

HashMap: 按照key hash后的值大小顺序存放元素;

LinkedHashMap:有链表特性,按照映射插入顺序存放元素

TreeMap:按照key的自然顺序或自定义排序key进行存放元素

示例代码如下:

import java.util.*;

public class Test {
    public static void main(String[] args) {
        Map<String,Object> map = new HashMap<>();
        map.put("name","张三");
        map.put("age","18");
        map.put("num","001");
        //按照key-hash后的值大小顺序放入映射中
        System.out.println(map);//{num=001, name=张三, age=18}

        Map<String,Object> linkedMap = new LinkedHashMap<>();
        linkedMap.put("name","张三");
        linkedMap.put("age","18");
        linkedMap.put("num","001");
        //LinkedHashMap,有链表特性,可以保证插入的顺序就是映射的顺序
        System.out.println(linkedMap);//{name=张三, age=18, num=001}

        Map<String,String> treeMap = new TreeMap<String,String>((s1,s2) -> {
            return s2.compareTo(s1);//自定义排序,按照字符串降序排列
        });
        treeMap.put("A1","A1");
        treeMap.put("A2","A2");
        treeMap.put("B1","B1");
        System.out.println(treeMap);//{B1=B1, A2=A2, A1=A1}

        //遍历
        treeMap.forEach((key,value) -> {
            System.out.println(key + ":" + value);
        });
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2112360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows 安装mysql 教程,mysql 多版本共存教程,傻瓜式安装教程

mysql 各版本官方下载地址&#xff1a;⬇ ⬇⬇⬇⬇⬇⬇⬇⬇⬇(点击下面链接前往)MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/ 首先我本地安装了 mysql8.0版本了&#xff0c;通过msi 进行安装的也就是傻瓜式…

SprinBoot+Vue高校网上缴费综合务系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

文心快码前端工程师观点分享:人机协同新模式的探索之路(三)

本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站105期线下沙龙活动上&#xff0c;从一款文心快码&#xff08;Baidu Comate&#xff09;前端工程师的角度&#xff0c;分享了关于智能研发工具本身的研…

AIGC是如何颠覆文旅行业的?

AI技术正在以前所未有的速度和规模&#xff0c;颠覆着各行各业的发展。在文旅行业&#xff0c;这种颠覆尤为显著。今天&#xff0c;我们深入探讨AIGC是如何颠覆文旅行业的。 传统的文旅内容创作方式&#xff0c;往往需要大量的人力、物力和财力投入。拍摄、录制、剪辑&#xf…

第二天旅游线路规划和预览

第二天&#xff1a;从克拉玛依市乌尔禾区到五彩滩&#xff0c;晚上住宿贾登峪&#xff1b; 规划结果见下图&#xff1a; 1、行程安排 根据上面的耗时情况&#xff0c;规划一天的行程安排如下&#xff1a; 1&#xff09;早上7&#xff1a;30起床&#xff0c;吃完早饭&#xff0c…

微信小程序页面制作——本地生活(含代码)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

基于ASP+ACCESS的教师信息管理系统

摘要 随着我国社会主义市场经济的发展和改革开放的不断深入&#xff0c;计算机的应用已遍及国民经济的各个领域&#xff0c;计算机来到我们的工作和生活中&#xff0c;改变着我们和周围的一切。在以前&#xff0c;学校用手工处理教师档案以及工资发放等繁多的工作和数据时&…

谷粒商城の缓存篇

文章目录 前言一、本地缓存和分布式缓存1.本地缓存2.分布式缓存 二、项目实战1.配置Redis2.整合业务代码2.1 缓存击穿2.2 缓存雪崩2.3 缓存穿透2.4 业务代码1.0版2.5 分布式锁1.0版2.6 分布式锁2.0版2.7 Spring Cache及缓存一致性问题2.7.1 Spring Cache2.7.2 缓存一致性问题2.…

[003].第3节.在Windows环境中搭建Redis(单机版)环境

我的后端学习大纲 我的Redis学习大纲 1.Redis下载: 1.中文2.英文 2.Windows下搭建Redis环境&#xff1a; 2.1.单机

[论文笔记]Making Large Language Models A Better Foundation For Dense Retrieval

引言 今天带来北京智源研究院(BAAI)团队带来的一篇关于如何微调LLM变成密集检索器的论文笔记——Making Large Language Models A Better Foundation For Dense Retrieval。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们&quo…

深入理解C语言中的POSIX定时器

引言 在Unix和类Unix系统中&#xff0c;定时器是一种常见的机制&#xff0c;用于在特定时间间隔后执行某些操作。POSIX定时器因其灵活性和功能丰富而被广泛采用。本文将深入探讨POSIX定时器的工作原理、内部机制、使用方法及其在实际开发中的应用。 POSIX定时器基础 POSIX定…

【视频讲解】Python贝叶斯卷积神经网络分类胸部X光图像数据集实例

全文链接&#xff1a;https://tecdat.cn/?p37604 分析师&#xff1a;Yuanchun Niu 在人工智能的诸多领域中&#xff0c;分类技术扮演着核心角色&#xff0c;其应用广泛而深远。无论是在金融风险评估、医疗诊断、安全监控还是日常的交互式服务中&#xff0c;有效的分类算法都是…

数据仓库理论知识

1、数据仓库的概念 数据仓库&#xff08;英文&#xff1a;Date Warehouse&#xff0c;简称数仓、DW&#xff09;&#xff0c;是一个用于数据存储、分析、报告的数据系统。数据仓库的建设目的是面向分析的集成化数据环境&#xff0c;其数据来源于不同的外部系统&#…

Git 修改Push后的Commit Message

向远程仓库push代码之后&#xff0c;在IDEA中无法直接修改Commit Message&#xff0c;需要在终端或控制台中输入以下命令&#xff08;HEAD~1中的1表示只对最后一个提交进行修改&#xff0c;因此1可以自定义&#xff09; git rebase -i HEAD~1执行完rebase指令后&#xff0c;会…

带AI功能朵米客服系统3.5无限制开心版+搭建文档

带AI功能朵米客服系统3.5无限制开心版搭建文档&#xff0c;朵米客服系统是一款全功能的客户服务解决方案&#xff0c;提供多渠道支持&#xff08;如在线聊天、邮件、电话等&#xff09;&#xff0c;帮助企业建立与客户的实时互动。该系统具有智能分流功能&#xff0c;可以快速将…

0基础跟德姆(dom)一起学AI Python进阶07-多线程_生成器

* 多进程案例 * 带参数的多进程代码**(重点)** * 查看进程的id * 演示: 进程之间数据是相互隔离的 * 多线程案例 * 入门案例 * 带参数的多线程代码**(重点)** * 演示: 线程之间数据是相互共享的 * 互斥锁 * 上下文管理器**(重点)** > 解析: with open原理, 为啥…

每日一题,力扣leetcode Hot100之198.打家劫舍

这一道题乍一看可以双层循环暴力解&#xff0c;但是仔细一想有可能最大利益并不是一家隔着一家偷&#xff0c;我可以间隔很多家偷&#xff0c;所以 这个题的思路还是有点像爬楼梯&#xff0c;用动态规划解。 首先确立动态规划的初始条件&#xff1a; 1.dp[0]nums[0]只有一家 …

企业邮箱怎么设置邮箱监控(老板监控员工邮件的方法推荐)【企业管理必备】

在现代企业中&#xff0c;电子邮件作为主要的沟通工具&#xff0c;不仅承载着日常的工作信息&#xff0c;还涉及大量机密内容。为了确保信息安全、提高工作效率&#xff0c;许多企业希望设置邮件监控&#xff0c;了解员工的邮箱使用情况。 本文将详细介绍企业邮箱如何设置邮箱…

Qt-使用qrc文件管理资源(15)

目录 qrc机制 创建qrc文件 1.在项目中创建一个qrc文件 2.导入图片到qrc文件中 2.2先设置一个前缀 2.3把刚刚使用的图片导入到资源文件中 测试结果 图片文件到哪去了&#xff1f; qrc机制 上篇文章中&#xff0c;我们提到了窗口的图片怎么用QIcon进行修改&#xff0c;…

MySQL record 01 part

更改密码&#xff1a; alter user rootlocalhost identified with mysql_native_password by ‘123456’; 注意&#xff1a; 在命令行方式下&#xff0c;每条MySQL的命令都是以分号结尾的&#xff0c;如果不加分号&#xff0c;MySQL会继续等待用户输入命令&#xff0c;直到MyS…