java集合(2)

news2024/9/21 7:01:15

目录

一. Map接口下的实现类

1. HashMap

1.1 HashMap常用方法

 2. TreeMap

2.1 TreeMap常用方法

 3. Hashtable

3.1 Hashtable常用方法

4.Map集合的遍历

4.1 根据键找值

4.2 利用map中的entrySet()方法

二.Collections类

1.Collections类中的常用方法

三. 泛型

1. 为什么使用泛型

2. 什么是泛型

3. 泛型类

4. 从泛型类派生子类

5. 泛型接口

6.类型擦除


一. Map接口下的实现类

特点:

(1)Map接口下的实现类都是以键值对的形式存储

(2)键不能重复,值可以重复

(3)通过键可以找到对应的值,但不能通过值找对应的键,因为值不唯一

(4)一个键只能映射到一个值

1. HashMap

HashMap存储数据时键是无序的,就和HashSet一样,无序指的是不会按照插入顺序进行存储

1.1 HashMap常用方法

V put(K, key,V value)向map中添加元素
V remove(Object key)删除键是指定元素的键值,返回对应的值
clear()清空map中的元素
boolean isEmpty()判断集合是否为空,为空返回true,不为空返回false
boolean containsKey(Object key)判断是否包含指定的键,包含返回true,不包含返回false
boolean containsValue(Object value)判断是否包含指定的值,包含返回true,不包含返回false
V get(K key)根据键找对应的值
int size()

返回map中有几组键值对

 2. TreeMap

TreeMap底层仍旧是树形结构,键可以排序,只不过要求存储键的类要实现Comparable接口实现compareTo()方法

2.1 TreeMap常用方法

V put(K, key,V value)向map中添加元素
V remove(Object key)删除键是指定元素的键值,返回对应的值
clear()清空map中的元素
boolean isEmpty()判断集合是否为空,为空返回true,不为空返回false
boolean containsKey(Object key)判断是否包含指定的键,包含返回true,不包含返回false
boolean containsValue(Object value)判断是否包含指定的值,包含返回true,不包含返回false
V get(K key)根据键找对应的值
int size()

返回map中有几组键值对

 3. Hashtable

Hashtable和HashMap基本类似,但Hashtable的方法中都用synchronized修饰了,加了一把锁表示线程安全,就和ArrayList和Vector,StringBuffer和StringBuilder一样,但不同的是HashMap键和值都可以添加null关键字,而Hashtable键和值都不能添加null关键字,

3.1 Hashtable常用方法

V put(K, key,V value)向map中添加元素
V remove(Object key)删除键是指定元素的键值,返回对应的值
clear()清空map中的元素
boolean isEmpty()判断集合是否为空,为空返回true,不为空返回false
boolean containsKey(Object key)判断是否包含指定的键,包含返回true,不包含返回false
boolean containsValue(Object value)判断是否包含指定的值,包含返回true,不包含返回false
V get(K key)根据键找对应的值
int size()

返回map中有几组键值对

4. Map集合的遍历

4.1 根据键找值

public class HashMapDemo3 {
    public static void main(String[] args) {
       
        HashMap<String,String> map = new HashMap<>();
        map.put("a","aa");
        map.put("b","bb");
        map.put("w","ww");
        //HashMap键值都可以存储null
        map.put("a",null);
        map.put(null,"aaaaa");
        map.put(null,null);
        System.out.println(map);

        //map遍历

        //方式1:先拿到所有的键,遍历键,根据键找值

        Set<String> keyset = map.keySet();
        for(String key:keyset){
            System.out.println(key+":"+map.get(key));
        }
    }
}

利用map中的keySet()方法拿到所有的键,遍历键,根据map中的get()方法拿到值

4.2 利用map中的entrySet()方法

public class HashMapDemo3 {
    public static void main(String[] args) {

        //方式2 推荐的遍历方式

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

二. Collections类

1. Collections类中的常用方法

addAll(Collection<? super T> c,T... elements)将emements可变参数中的元素全部添加到集合中
binarySearch(List<? extends Comparable<? super T>> list,T key)二分查找
sort(List list)对集合进行排序,默认升序
sort(List list, Comparator c)对集合进行排序,可以自定义排序规则
swap(List list, int i, int j)交换集合中的元素,i,j为下标
copy(List dest, List src)集合间的复制,注意dest.size()必须大于src.size()
fill(List list, T obj)用某个值填充集合
max(Collection coll)获取集合中的最大值
min(Collection coll)获取集合中的最小值
replaceAll(List list, T oldVal, T newVal)用新值替换集合中的旧值
reverse(List list)反转集合,逆序输出
shuffle(List list)随机打乱集合中的元素顺序

三. 泛型

1. 为什么使用泛型

我们知道集合容器中是可以添加任意类型的元素的(Object),但要是添加任意的元素,会导致我们在遍历处理时做出很多判断同时还存在类型转换的问题,使代码变得冗余,减少代码的可读性,所以我们要使用泛型来对集合中的元素进行限制,让其只能存储一组数据类型相同的元素

2. 什么是泛型

泛型就是将数据类型当做参数传递(参数化类型),注意这里的数据类型只能是引用数据类型,不能传递基本数据类型,这样就可以在编译期间检查传入的参数是否是规定的类型

3. 泛型类

泛型类就是将泛型用于类的定义中,这样当我们产生该类的对象时,就需要传入一种类型,来确定类中某些成员的类型

public class Result<T,E> {
   int code;

   public T data;

   E element;

   String message;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public E getElement() {
        return element;
    }

    public void setElement(E element) {
        this.element = element;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

如图Result类就是一个泛型类,当new该类的对象时可以传入两个参数,用来确定data和element的数据类型,如果我们不传的话,默认是Object类型

4. 从泛型类派生子类

当我们一个类要继承一个泛型类时,为了避免父类的泛型不能被确定,所以当继承时有两种方法

1.将子类也声明为泛型类,并且和父类的泛型相同

/*
    当一个类继承一个泛型类时, 将子类也声明为泛型类
       public class B<T> extends A<T>
       B<String> b = new B();

 */


public class A<T> {

     T data;

}

public class B<T> extends A<T> {

    public static void main(String[] args) {
        B  b = new B();
           b.data="";

    }
}

2.子类若不是泛型类,则在继承时需要明确指定出父类泛型的具体类型

/*

    当一个类继承一个泛型类时,子类不是泛型类,
    那么就必须明确父类泛型类型
      public class B extends A<String>

 */

public class B extends A<String> {


    public static void main(String[] args) {
        B  b = new B();
           b.data="";

    }
}

5. 泛型接口

泛型接口和泛型类的继承是一样的,可以参考上面的方式

1.一个类实现泛型接口,如果该类也是泛型类,则两者的泛型要一致

2.一个类实现泛型接口,如果该类不是泛型类,则要指明该接口泛型的具体类型

6. 类型擦除

类型擦除:泛型只是在编译期间帮助我们检查类型是否符合规定的类型,当我们在实际运行时,进入JVM前,关于泛型的一切信息就会被擦除,统一当做Object类型或上限类型处理,这就是类型擦除

public class Demo2 {
    public static void main(String[] args) throws NoSuchFieldException {
      
        Result<String,String> result2 = new Result<>();
        result2.setData("abc");//虽然声明了泛型,但是实际在底层存储时,还是按照Object接收存储,这个称为类型擦除

        Field data = result2.getClass().getField("data");
        System.out.println(data.getType());//获取实际运行时类型
    }
}

上述代码通过反射机制,获取result2中data成员变量实际运行时的类型,结果如下

 可以看到result2类中的data成员变量在实际运行时并不是我们的String类型,而是Object类型

 

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

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

相关文章

大连外贸建站公司wordpress主题模板

Robonaut萝卜纳特WP外贸站模板 适合用于工业机器人公司出口做外贸搭建公司官方网站使用的WordPress模板。 https://www.jianzhanpress.com/?p7091 优衣裳WordPress外贸建站模板 简洁的wordpress外贸独立站模板&#xff0c;适合服装、衣服、制衣外贸公司搭建公司官方网站使用…

shark云原生-日志体系-filebeat高级配置(适用于生产)-更新中

文章目录 1. filebeat.inputs 静态日志收集器2. filebeat.autodiscover 自动发现2.1. autodiscover 和 inputs2.2. 如何配置生效2.3. Providers 提供者2.4. Providers kubernetes2.5. 配置 templates2.5.1. kubernetes 自动发现事件中的变量字段2.5.2 配置 templates 2.6. 基于…

人工智能系列-Pandas基础

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” Pandas简介 Pandas是Python语言的拓展程序库&#xff0c;用于数据分析。 Pandas是一个开放源码&#xff0c;BSD许可的库&#xff0c;提供高性能&#xff0c;易于使用的数据结…

vuepress创建步骤

背景 记录vuepress配置步骤&#xff0c;以便下次使用快速上手。 读此文章之前默认您已经学会了创建vuepress项目。vuepres快速开始 最终成品 doc.jeecgflow.com 配置步骤 创建.vuepress 目录。 你的文档目录下创建一个 .vuepress 目录。 创建.vuepress/config.js module.e…

【IMU】 确定性误差与IMU_TK标定原理

1、确定性误差 MEMS IMU确定性误差模型 K 为比例因子误差 误差来源:器件的输出往往为脉冲值或模数转换得到的值,需要乘以一个刻度系数才能转换成角速度或加速度值,若该系数不准,便存在刻度系数误差。 T 为交轴耦合误差 误差来源:如下图,b坐标系是正交的imu坐标系,s坐标系的三…

spring-ai 下载不了依赖spring-ai-openai-spring-boot-starter

第1坑&#xff1a;配置第三方仓库不生效&#xff0c; 提示在阿里云仓库没有找到 spring-ai-openai-spring-boot-starter 第2坑&#xff1a;升级jdk17后&#xff0c;springboot项目启动报错 Internal error (java.lang.reflect.InaccessibleObjectException): Unable to make pr…

第10章:网络与信息安全

目录 第10章&#xff1a;网络与信息安全 网络概述 计算机网络概念 计算机网络的分类 网络的拓扑结构 ISO/OSI网络体系结构 网络互联硬件 物理层互联设备 数据链路层互联设备 网络层互联设备 应用层互联设备 网络的协议与标准 网络标准 TCP/IP协议族 网络接口层协…

【若依前后端分离】通过输入用户编号自动带出部门名称(部门树)

一、部门树 使用 <treeselect v-model"form.deptId" :options"deptOptions" :show-count"true" placeholder"请选择归属部门"/> <el-col :span"12"><el-form-item label"归属部门" prop"dept…

C++ 什么是虚函数?什么是纯虚函数,以及区别?(通俗易懂)

&#x1f4da; 当谈到虚函数时&#xff0c;通常是指在面向对象编程中的一种机制&#xff0c;它允许在派生类中重写基类的函数&#xff0c;并且能够通过基类指针或引用调用派生类中的函数。 目录 前言 &#x1f525; 虚函数 &#x1f525; 纯虚函数 &#x1f525; 两者区别…

IntelliJ IDEA教育版在Windows电脑中的下载、安装方法

本文介绍IntelliJ IDEA软件Community&#xff08;社区版&#xff09;在Windows操作系统中的下载、安装、运行与使用方法。 IntelliJ IDEA软件是一款由JetBrains公司开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Java语言的开发&#xff0c;但同时也支持其…

win7系统快速安装python

下载安装包 建议选择python3.8左右的&#xff0c;我下载的是3.7.8&#xff0c;最新版本的pythonwin7可能不支持 python网址 下拉寻找 安装python 1.双击安装包 更换完地址选择安装(install) 安装完成后点击close即可 测试是否安装成功 1.winr快捷键打开黑窗口输入cmd …

【Linux】线程(轻量级进程)

目录 一、线程概念 二、线程特性 2.1 进程更加轻量化 2.2 线程的优点 2.3 线程的缺点 2.4 线程的异常 2.5 线程用途 三、进程和线程 四、线程控制 4.1 包含线程的编译链接 4.2 创建线程 4.3 获得线程自身的ID 4.4 线程终止 4.5 线程等待 4.6 线程分离 4.6 线程…

Redis官方可视化管理工具

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl RedisInsight是一个Redis可视化工具&#xff0c;提供设计、开发和优化 Redis 应用程序的功能。RedisInsight分为免费的社区版和一个付费的企业版&#xff0c;免费版具有基本…

thingsboard v3.7 win编译相关问题记录

遇到的问题总结 node\yarn 相关版本问题 3.7 开始需要 JDK17 ui-ngx 模块 yarn 相关问题报错 报错信息 [INFO] Downloading https://github.com/yarnpkg/yarn/releases/download/v1.22.10/yarn-v1.22.10.tar.gz to D:\soft\maven\com\github\eirslett\yarn\1.22.10\yarn-1.2…

ASP.NET Core----基础学习04----Model模型的创建 服务的注入

文章目录 1. 创建Models文件夹&#xff0c;3个文件的内容如下&#xff1a;&#xff08;1&#xff09;模型的创建&#xff08;2&#xff09;服务的注入 1. 创建Models文件夹&#xff0c;3个文件的内容如下&#xff1a; &#xff08;1&#xff09;模型的创建 模型的基础类Student…

Apache Hadoop完全分布式集群搭建指南

Hadoop发行版本较多&#xff0c;Cloudera版本&#xff08;Cloudera’s Distribution Including Apache Hadoop&#xff0c;简称CDH&#xff09;收费版本通常用于生产环境&#xff0c;这里用开源免费的Apache Hadoop原始版本。 下载&#xff1a;Apache Hadoop 版本下载&#x…

[Unity入门01] Unity基本操作

参考的傅老师的教程学了一下Unity的基础操作&#xff1a; [傅老師/Unity教學] Unity3D基礎入門 [華梵大學] 遊戲引擎應用基礎(Unity版本) Class#01 移动&#xff1a;鼠标中键旋转&#xff1a;鼠标右键放大&#xff1a;鼠标滚轮飞行模式&#xff1a;右键WASDQEFocus模式&…

基于模型预测控制的PMSM系统速度环控制理论推导及仿真搭建

模型预测控制&#xff08;Model Predictive Control, MPC&#xff09;是一种先进的控制策略&#xff0c;广泛应用于工业控制中。它可以看作是一种最优控制方法&#xff0c;利用对象的动态模型来预测其状态的未来行为&#xff0c;并根据每个采样时间点特定性能目标函数的优化来确…

初见:AntDB智能运维“三剑客“之ACC

前情回顾 在前两个章节中&#xff0c;我们介绍了 AntDB 智能运维"三剑客"的 ADC 和 MTK。 初见&#xff1a;AntDB智能运维"三剑客"之ADC 初见&#xff1a;AntDB智能运维"三剑客"之MTK 本文将继续介绍 AntDB 数据库智能运维平台 ACC。 AntDB 介绍…

Open3D 删除点云中重叠的点(方法一)

目录 一、概述 二、代码实现 三、实现效果 3.1原始点云 3.2处理后的点云 3.3计算结果 一、概述 在点云处理中&#xff0c;重叠点&#xff08;即重复点&#xff09;可能会对数据分析和处理的结果产生负面影响。因此&#xff0c;删除重叠点是点云预处理中常见且重要的步骤。…