Java集合框架-Collection和Map

news2024/12/23 4:25:09

文章目录

  • Collection-单列集合特点
    • List
      • ArrayList
      • LinkedList
      • Vecter
    • Set
      • HashSet
      • TreeSet
  • Map-键值对集合特点
    • Map常用API
      • put添加细节
      • remove
    • Map的三种遍历方式
      • 1.通过键找值
      • 2.通过"键值对"
      • 3.Lambda表达式
      • foreach源码
    • HashMap
      • 需求

为什么要使用泛型

泛型的优点
  1.集合中存储的元素类型统一了
  2.从集合中取出来的元素类型是泛型指定的类型,不需要进行大量的“向下转型”

泛型的确定
  1.导致集合中存储的元素缺乏多样性。

Collection-单列集合特点

在这里插入图片描述

List

ArrayList

ArrayList特点
  1.ArrayList层地采用了数组的数据结构;
  2.ArrayList是非线程安全的;
  3.ArrayList初始化容量是10(底层先创建了一个长度为0的数组,当添加第一个元素的时候,初始化容量10);
  4.ArrayList底层是Object类型的数组Object[]
  5.扩容1.56.建议给定一个预估计的初始化容量,减少数组的扩容次数,这是ArrayList集合比较重要的优化策略

数组的优点
  1.数组的检索效率比较高。
    为什么数组的检索效率高?
       数组中每个元素占用空间大小相同,内存地址是连续的,知道首元素内存地址,然后知道下标,通过数学表达式计算出元素的内存地址,所以检索的效率高。
  2.数组向数组末尾添加元素的效率还是很高的,也就是数组的添加效率很高。
  
数组的缺点
  1.数组随机增删元素效率比较低
  
  

LinkedList

链表数据结构的特点

链表的优点:
  1.由于链表上的元素在空间存储上内存地址不连续,所以随机增删元素的时候不会有量元素的位移,因此随机增删的效率高。在以后得开发中,如果遇到随机增删集合中元素的业务比较多时,建议使用LinkedList

链表的缺点
  1.不能通过数学表达式计算被查找元素的内存地址,每一次查找都是从头节点开始遍历,直到找到为止,所以LinkedList集合检索/查找的效率较低。
LinkedList特点
  1.LinkedList底层采用了双向链表数据结构

Vecter

Vecter特点
  1.Vector底层也采用了数组的数据结构是线程安全的。
  2.Vector底层方法都使用了synchronized关键字修饰虽然线程安全但效率不高,一般使用较少了。

Set

HashSet

HashSet特点:
  1.HashSet创建时实际上是底层new了一个HashMap集合,也就意味着HashSet是将数据存储到了HashMap集合中了,HashMap是一个哈希表数据结构;

在这里插入图片描述

TreeSet

TreeSet的父级接口是SortSet,SortSet继承了Set接口,接口是抽象的,无法实例化。

TreeSet特点
  1.TreeSet也称可排序集合
  2.无顺不可重复,但存储的元素可以自动按照大小顺序或字幕A~Z排序
  3.无序:指得是元素存进去的顺序和取出来的顺序不一样,并且没有下标。
  4.TreeSet创建的时候,底层new了一个TreeMapTreeMap底层使用了二叉树数据结构
  

在这里插入图片描述
在这里插入图片描述

Map-键值对集合特点

 Map-键值对集合特点:
   1.Map是以key()value()的方式存储数据:键值对;
   2.key()不能重复,value()可以重复;
   3.key()value()都是引用数据类型,存储对象的内存地址;
   4.key()value()一一对应,每一个键只能找到自己对应的值,key起到主导的地位,value是key的一个附属品。
   5.key()value()是一个整体,称为"键值对"或者"键值对对象",在Java中叫做"Entry对象"

Map常用API

Map接口中常用方法:
 *    V put(K key,V value)Map集合中添加键值对
 *    V get(Object key)                       通过Key获取value
 *    void clear()                            清空Map集合
 *    boolean containsKey(Object key)         判断Map中是否包含某个Key
 *    boolean containsValue(Object value)     判断Map中是否包含某个value
 *    boolean isEmpty()                       判断Map集合中元素个数是否为0
 *    Set<K> keySet()                         获取Map集合中所有的key(所有的键是一个set集合)
 *    V remove(Object key)                    通过key删除键值对
 *    int size()                              获取Map集合中键值对的个数
 *    Collection<V> values()                  获取Map集合中所有的value,返回一个Collection

代码中选中Map关键字Ctrl+B去到Map的源码中
在这里插入图片描述
在这里插入图片描述

put添加细节

1.put对象是,Map有返回值

put:添加/覆盖
  在添加数据的时候,如果键不存在,那么直接把键值对对象提提添加到map集合当中,方法返回null
  在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回。
public class MapApi {

    public static void main(String[] args) {
        Map<String,String> m = new HashMap<>();
        String value0 = m.put("郭靖","黄蓉");
        System.out.println(value0);
        m.put("韦小宝","沐剑屏");
        m.put("杨过","小龙女");
        m.put("尹志平","小龙女");

        //向相同的键里再次添加元素
        String value = m.put("韦小宝","双儿");
        System.out.println(value);
        System.out.println(m);
    }
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

remove

remove时也有返回值,返回的是被删除的键值对对象的值。

在这里插入图片描述

public class MapTest01 {

    public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        //1.向Map中添加key-value
        map.put(101,"zhangsan");
        map.put(202,"lisi");
        map.put(303,"wangwu");
        map.put(404,"zhaoliu");
        System.out.println(map);

        //2.获取添加到Map中的key-value的个数
        System.out.println("2.Map中所有键值对的个数:"+map.size());

        //3.通过key取value
        String value = map.get(303);
        System.out.println("3.通过key取到的value为:"+value);

        //4.获取所有的value
        Collection<String> values = map.values();
        System.out.println("4.values()获取Map中的所有value:"+values);
        //foreach values
        for(String str : values){
            System.out.println("5.遍历取出:"+str);
        }

        //6.获取所有的key
        Set<Integer> keys = map.keySet();
        System.out.println("6.keySet()返回Map中所有的key:"+keys);

        //7.判断是否包含某个key和value
        System.out.println("7.判断是否包含202的key的结果为:"+map.containsKey(202));
        System.out.println("8.判断是否包含leilei的value的结果为:"+map.containsValue("leilei"));

        //9.通过key删除key-value
        map.remove(404);
        System.out.println("9.调用remove()方法后的键值对的数量:"+map.size());

        //10.清空Map集合
        map.clear();
        System.out.println("10.clear()后键值对的数量为:"+map.size());

    }
}
{404=zhaoliu, 101=zhangsan, 202=lisi, 303=wangwu}
2.Map中所有键值对的个数:4
3.通过key取到的value为:wangwu
4.values()获取Map中的所有value:[zhaoliu, zhangsan, lisi, wangwu]
5.遍历取出:zhaoliu
5.遍历取出:zhangsan
5.遍历取出:lisi
5.遍历取出:wangwu
6.keySet()返回Map中所有的key:[404, 101, 202, 303]
7.判断是否包含202的key的结果为:true
8.判断是否包含leilei的value的结果为:false
9.调用remove()方法后的键值对的数量:3
10.clear()后键值对的数量为:0

Map的三种遍历方式

1.通过键找值

 public static void main(String[] args) {
        Map<String,String> m = new HashMap<>();
        m.put("郭靖","黄蓉");
        m.put("韦小宝","沐剑屏");
        m.put("杨过","小龙女");
        System.out.println(m);

        Set<String> keys = m.keySet();
        for(String str : keys){
            String key = str;
            String value = m.get(key);
            System.out.println(key + "=" + value);
        }
    }

在这里插入图片描述

2.通过"键值对"

public static void main(String[] args) {
        Map<String,String> m = new HashMap<>();
        m.put("郭靖","黄蓉");
        m.put("韦小宝","沐剑屏");
        m.put("杨过","小龙女");
        System.out.println(m);

        Set<Map.Entry<String, String>> entries = m.entrySet();
        for (Map.Entry e  : entries){
            System.out.println(e.getKey()+"="+e.getValue());
        }
    }

在这里插入图片描述
Ctrl+Alt+V自动生成方法的返回值类型,或者在方法名后加.var也可以
在这里插入图片描述
在这里插入图片描述

3.Lambda表达式

public static void main(String[] args) {
        Map<String,String> m = new HashMap<>();
        m.put("鲁迅","我没说过这句话");
        m.put("诸葛亮","悠悠苍天,何薄于我");
        m.put("曹操","我笑诸葛无谋,周瑜少智");
        System.out.println(m);


        m.forEach(new BiConsumer<String, String>() {
            @Override
            public void accept(String s, String s2) {
                System.out.println(s +"="+s2);
            }
        });

        //改写为lambda
        m.forEach((s, s2) -> System.out.println("我是lambda:"+s +"="+s2));
    }

在这里插入图片描述

foreach源码

foreach的缺点
  foreach底层也是使用的增强for循环,它没有下标,不能通过下标查询元素

在这里插入图片描述

HashMap

HashMap底层原理
  1.HashMap底层是哈希表结构
  2.依赖hashCode方法和equals方法保证键的唯一
  3.如果键存储的是自定义对象,需要重写hashCode和equals方法
    如果值存储字定义对象,不需要重写hashCode和equals方法

需求

创建一个HashMap集合,
  1.键是学生对象(Student),值是籍贯(String).
  2.存储三个键值对元素,并遍历
  3.要求:同姓名同年龄认为是同一个学生。
public class Student {
    private int age;
    private String name;

    @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(age, name);
    }

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

    getter setter省略
    ......
}
public class HashMapTest {
    public static void main(String[] args) {
        HashMap<Student,String> map = new HashMap<>();

        //1.实例化学生对象
        Student student0 = new Student(23,"张三");
        Student student1 = new Student(24,"李四");
        Student student2 = new Student(25,"王五");
        Student student3 = new Student(25,"王五");

        map.put(student0,"湖北");
        map.put(student1,"广东");
        map.put(student2,"河南");
        map.put(student3,"福建");

        //遍历map对象
        Set<Student> students = map.keySet();
        for(Student stu : students){
            String value = map.get(stu);
            System.out.println(stu +"=>"+value);
        }
    }
}

在这里插入图片描述

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

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

相关文章

《精益DevOps》译者序

计算机网络的发展导致了IT领域中的两个重要发展——虚拟化和分布式计算&#xff0c;云服务是虚拟化的一个直接体现&#xff0c;而微服务架构则是分布式计算的一个重要应用领域。不论是虚拟化还是分布式计算&#xff0c;都对软件工程中的研发效能提出了新的问题和挑战&#xff0…

Linux x86平台获取sys_call_table

文章目录 前言一、根据call *sys_call_table来获取二、使用dump_stack三、根据MSR_LSTAR寄存器四、使用sys_close参考资料 前言 Linux 3.10.0 – x86_64 最简单获取sys_call_table符号的方法&#xff1a; # cat /proc/kallsyms | grep sys_call_table ffffffff816beee0 R sy…

实名制交友-智能匹配-仿二狗交友系统-TP6+uni-APP小程序H5公众号-源码交付-支持二开!

一、代码风格 通常不同的开发者具备不同的代码风格&#xff0c;但为了保证语音交友系统开发质量&#xff0c;在编码前需要进行代码风格的统一&#xff0c;通过制定一定的规则&#xff0c;约束开发者的行为。具有统一风格的代码才能更清晰、更完整、更容易理解、更方便后期维护…

互联网加竞赛 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域&#xff0c;在无人驾驶领域中机器学习的各种算法随处可见&#xff0c;今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂&#xff0c;看上去无从下手。那么面对这样极其…

AURIX CSA(上下文存储)介绍(续写中...)

1.CSA概述 CSA&#xff08;Context Save Areas&#xff09;上下文存储区域&#xff0c;每次函数调用、进入中断、进入Trap都会存CSA对象&#xff0c;便于退出时候恢复。每个CSA对象的大小为固定的64字节。最大可以支持分配为2^164M。 2.GPRs寄存器 32个通用寄存器(GPRs) 16个…

Redis缓存【重点】

参考链接 https://xiaolincoding.com/redis/cluster/cache_problem.html#%E7%BC%93%E5%AD%98%E9%9B%AA%E5%B4%A9 目录 缓存雪崩大量数据同时过期Redis 故障宕机 缓存击穿第一种方案&#xff0c;非法请求的限制第二种方案&#xff0c;缓存空值或者默认值第三种方案&#xff0c;使…

回溯算法套路②组合型回溯+剪枝【基础算法精讲 15】

学习地址 : 回溯算法套路②组合型回溯剪枝【基础算法精讲 15】_哔哩哔哩_bilibili 回顾 &#xff1a; 从n 个数中选出k个数的组合 &#xff0c; 可以看成是长度固定的子集 ; 剪枝技巧 : 77 . 组合 链接 : . - 力扣&#xff08;LeetCode&#xff09; 枚举下一个元素选…

嵌入式中volatile关键字的使用方法

Hi,大家好&#xff01; 今天我们来学习一下volatile关键字&#xff0c;volatile关键字想必大家在平时编程中都见过或用过。可是小伙伴们有没有想过什么时候需要使用volatile关键字吗&#xff1f; 在C语言中&#xff0c;volatile是一个关键字&#xff0c;用于告诉编译器不要优化…

【MATLAB第97期】基于MATLAB的贝叶斯Bayes算法优化BiGRU双向门控循环单元的多输入单输出回归预测模型,含GRU与BiGRU多层结构优化选择

【MATLAB第97期】基于MATLAB的贝叶斯Bayes算法优化BiGRU双向门控循环单元的多输入单输出回归预测模型&#xff0c;含GRU与BiGRU结构层数优化 前言 前面在【MATLAB第10期】讲解了基于贝叶斯Bayes算法优化LSTM长短期记忆网络的多输入单输出回归预测模型。 本次模型难点包括&am…

ChatGPT数据分析应用——热力图分析

ChatGPT数据分析应用——热力图分析 ​ 热力图分析既可以算作一种可视化方法&#xff0c;也可以算作一种分析方法&#xff0c;主要用于直观地展示数据的分布情况。接下来我们让ChatGPT解释这个方法的概念并提供相应的案例。发送如下内容给ChatGPT。 ​ ChatGPT收到上述内容后&…

[linux]shell脚本语言:变量、测试、控制语句以及函数的全面详解

一、shell的概述 1、shell本质是脚本文件&#xff1a;完成批处理。 shell脚本是一种脚本语言&#xff0c;我们只需使用任意文本编辑器&#xff0c;按照语法编写相应程序&#xff0c;增加可执行权限&#xff0c;即可在安装shell命令解释器的环境下执行。shell 脚本主要用于帮助开…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:无障碍属性)

组件可以设置相应的无障碍属性和事件来更好地使用无障碍能力。 说明&#xff1a; 从API Version 10 开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 accessibilityGroup accessibilityGroup(value: boolean) 无障碍组。 系统能力&#…

机器学习:主成分分析笔记

主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#xff09;是一种无监督的机器学习算法&#xff0c;通常用于高维数据的降维、提取主要特征、数据降噪和可视化。PCA的基本思想是将原始数据的多个变量转换为少数几个相互独立的变量&#xff08;即主成分&a…

【Web前端入门学习】——HTML

目录 HTML简介HTML文件结构常用文本标签标题标签段落标签有序列表和无序列表表格标签 HTML属性a标签—超链接标签图片标签 HTML区块块元素与行内元素 HTML表单 HTML简介 HTML全称是Hypertext Markup Language超文本标记语言。 HTML的作用&#xff1a; 为网页提供结构&#xff…

Stream流(Java)

目录 一、介绍 二、Stream流的使用步骤 三、Stream流常见的中间方法 四、Stream流常见的终结方法 一、介绍 Stream也叫Stream流&#xff0c;是JDK8开始新增的一套API&#xff0c;可以用于操作集合或者数组的数据。 优势&#xff1a;Stream流大量的结合了Lambda的语法风格来…

SpringCloud远程调用为啥要采用HTTP

关于SpringCloud远程调用采用HTTP而非RPC。 首先SpringCloud开启Web服务依赖于内部封装的Tomcat容器&#xff0c;而今信息飞速发展&#xff0c;适应大流量的微服务&#xff0c;采用Tomcat处理HTTP请求&#xff0c;开发者编写Json作为资源传输&#xff0c;服务器做出相应的响应&…

解决uni-app中使用webview键盘弹起遮挡input输入框问题

这个平平无奇的回答&#xff0c;可能是全网最靠谱的解决方案。 这里我用的是vue3 setup .vue文件的方式 <view> <web-view :fullscreen"false" :webview-styles"{top: statusBarHeight40,height:height,progress: {color: green,height:1px } }"…

软考57-上午题-【数据库】-数据库的控制功能

一、事务管理 1-1、事务的定义 事务是一个操作序列&#xff0c;这些操作&#xff0c;要么都做&#xff0c;要么都不做。 事务和程序是两个不同的概念&#xff0c;一般一个程序可以包含多个事务。 1-2、事务定义的语句 1、事务开始&#xff1a;BEGIN TRANSACTION 2、事务提…

Vue.js 实用技巧:深入理解 Vue.set 方法

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

交友盲盒系统PHP开源的盲盒源码

源码介绍&#xff1a; 交友盲盒系统是一款基于PHP开发的开源免费盲盒系统&#xff0c;旨在为用户提供一个充满乐趣和惊喜的社交体验。该系统具有丰富的功能和灵活的扩展性&#xff0c;可以轻松地满足各种线上交友、抽奖活动等场景的需求。 安装说明&#xff1a; PHP版本&…