Java集合框架-Collection和Map

文章目录

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c4d渲染到一半未响应怎么办?

如果您曾经遇到过 Cinema 4D 在渲染过程中崩溃的令人沮丧的场景&#xff0c;这种情况是很常见的。这种意外的卡顿崩溃&#xff0c;尤其是在经过数小时的精心工作之后&#xff0c;确实令人烦躁。为了帮助您解决此问题&#xff0c;您可以查看一些内容。 1、硬件限制&#xff1a;…

鸿蒙App开发新思路:小程序转App

国家与国家之间错综复杂&#xff0c;在谷歌的安卓操作系统“断供”后&#xff0c;鸿蒙系统的市场化&独立化的道路便显而易见了。 2024年1月18日&#xff0c;华为宣布&#xff0c;不再兼容安卓的“纯血鸿蒙”--HarmonyOS NEXT鸿蒙星河版最终面世&#xff0c;并与2024年Q4正…

C++模板完整版

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) {int temp left…

BioTech - ADMET的性质预测 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/136438192 ADMET&#xff0c;即 Absorption、Distribution、Metabolism、Excretion、Toxicity&#xff0c;吸收、分布、代谢、排泄、毒性…

VL53L8CX驱动开发(1)----驱动TOF进行区域检测

VL53L8CX驱动开发----1.驱动TOF进行区域检测 概述视频教学样品申请源码下载主要特点硬件准备技术规格系统框图应用示意图区域映射生成STM32CUBEMX选择MCU 串口配置IIC配置LPn 设置X-CUBE-TOF1串口重定向代码配置Tera Term配置演示结果 概述 VL53L8CX是一款8x8多区域ToF测距传感…

【学习心得】爬虫JS逆向通解思路

我希望能总结一个涵盖大部分爬虫逆向问题的固定思路&#xff0c;在这个思路框架下可以很高效的进行逆向爬虫开发。目前我仍在总结中&#xff0c;下面的通解思路尚不完善&#xff0c;还望各位读者见谅。 一、第一步&#xff1a;明确反爬手段 反爬手段可以分为几个大类 &#…

【CSP试题回顾】202305-2-矩阵运算

CSP-202305-2-矩阵运算 关键点总结&#xff1a;改变矩阵计算顺序优化时间复杂度 通过先计算 K T V K ^ T \times V KTV 而不是先计算 Q K T Q \times K ^ T QKT&#xff0c;有效地减少了计算时间&#xff0c;特别是在处理长序列时。这种优化通常在数据维度一不等时有显著效…

盘点:国家智能算力中心

文章目录 1. Main2. My thoughtsReference 1. Main 按照《中国算力白皮书&#xff08;2022年&#xff09;》的定义&#xff0c;算力主要分为四部分&#xff1a;通用算力、智能算力、超算算力、边缘算力。通用算力以CPU芯片输出的计算能力为主&#xff1b;智能算力以GPU、FPGA、…

DevStack 基于 Ubuntu 部署 OpenStack

Devstack 简介 DevStack 是一系列可扩展的脚本&#xff0c;用于基于 git master 的最新版本快速调出完整的 OpenStack 环境。devstack 以交互方式用作开发环境和 OpenStack 项目大部分功能测试的基础。 devstack 透过执行 stack.sh 脚本&#xff0c;搭建 openstack 环境&…

检修弧形导轨需遵守的原则

弧形导轨被广泛应用在各行各业中&#xff0c;特别是工业自动化领域中&#xff0c;是自动化机械设备中重要的传动零部件。在使用弧形导轨时&#xff0c;为防止意外发生或对机械设备造成损坏&#xff0c;在检修过程中必须遵守以下一些原则&#xff1a; ●安全第一&#xff1a;出现…

java核心面试题汇总

文章目录 1. Java1.1. TCP三次握手/四次挥手1.2 HashMap底层原理1.3 Java常见IO模型1.4 线程与线程池工作原理1.5 讲一讲ThreadLocal、Synchronized、volatile底层原理1.6 了解AQS底层原理吗 2. MySQL2.1 MySQL索引为何不采用红黑树&#xff0c;而选择B树2.2 MySQL索引为何不采…

蓝凌EIS智慧协同平台 rpt_listreport_definefield.aspx SQL注入漏洞复现

0x01 产品简介 蓝凌EIS智慧协同平台是一款专为企业提供高效协同办公和团队合作的产品。该平台集成了各种协同工具和功能,旨在提升企业内部沟通、协作和信息共享的效率。 0x02 漏洞概述 由于蓝凌EIS智慧协同平台 rpt_listreport_definefield.aspx接口处未对用户输入的SQL语句…

一.数据分析简介

目录 一、了解数据分析 1.1 什么是数据分析 1.2 数据分析的重要性 1.3 数据分析的基本流程 数据获取 数据处理 1.4 数据分析的应用场景 客户分析 营销分析 二、数据分析工具 jupyter 2.1 编辑器安装 2.2 Jupyter快捷使用 一、了解数据分析 学习数据分析&#xff0…

【在巴厘岛学点印尼语】日常篇

BINTANG BIR 槟棠啤酒 今天不写代码&#xff0c;在巴厘岛休养&#xff0c;顺便聊点印尼语。 印尼语&#xff0c;Bahasa Indonesia&#xff0c;是印度尼西亚的官方语言&#xff0c;也即印尼化的马来语廖内方言&#xff0c;其变种包括 爪哇语&#xff08;岛民方言&#xff09; 等…

振弦式埋入应变计:工程安全的精准守护者

振弦式埋入应变计是一种先进的工程监测设备&#xff0c;以其卓越的性能和稳定的可靠性&#xff0c;广泛应用于水工建筑物及其他混凝土结构物的长期安全监测中。峟思振弦埋入式应变计的核心部件采用进口钢弦制成&#xff0c;保证了其使用寿命的长久性。同时&#xff0c;主要构件…

Java面试题总结200道(二)

26、简述Spring中Bean的生命周期&#xff1f; 在原生的java环境中&#xff0c;一个新的对象的产生是我们用new()的方式产生出来的。在Spring的IOC容器中&#xff0c;将这一部分的工作帮我们完成了(Bean对象的管理)。既然是对象&#xff0c;就存在生命周期&#xff0c;也就是作用…

【云呐】固定资产条码管理系统有哪些优势

在当今信息时代&#xff0c;企业越来越重视固定资产的管理。传统的固定资产管理方法已经无法满足公司日益增长的需求&#xff0c;固定资产条形码管理系统的出现给企业带来了全新的解决方案。下面我们就讨论固定资产条形码管理系统的优势以及对公司的价值。 提升资产管理效率 固…

【Python】进阶学习:pandas--read_csv()用法详解

&#x1f680;【Python】进阶学习&#xff1a;pandas–read_csv()用法详解&#x1f680; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教…

有效防止CDN网站被溯源ip的教程

如何反溯源隐藏自己的源IP防止溯源&#xff1f; 还有些大牛会进行渗透攻击、CC攻击&#xff0c;溯源打服务器&#xff0c;各式各样的&#xff0c;防不胜防。所以很多站长套起了cdn&#xff0c;比起cdn提供的加速效果&#xff0c;更多的站长可能还是为了保护那可怜弱小的源站ip…

Docker创建Reids容器

1.默认拉取Redis最新镜像版本 docker pull redis 2.下载redis配置文件 https://download.redis.io/releases/ 3.下载配置文件后手动更改密码&#xff0c;链接时间等信息 绑定地址&#xff08;bind&#xff09;&#xff1a;默认情况下&#xff0c;Redis 只会监听 localhost…