java集合(2)

目录

一. 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类型

 

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

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

相关文章

运维锅总详解系统启动流程

本文详细介绍Linux及Windows系统启动流程&#xff0c;并分析了它们启动流程的异同以及造成这种异同的原因。希望本文对您理解系统的基本启动流程有所帮助&#xff01; 一、Linux系统启动流程 Linux 系统的启动流程可以分为几个主要阶段&#xff0c;从电源开启到用户登录。每个…

揭秘IP:从虚拟地址到现实世界的精准定位

1.IP地址介绍 1.内网 IP 地址&#xff08;私有 IP 地址&#xff09; 内网 IP 地址&#xff0c;即私有 IP 地址&#xff0c;是在局域网&#xff08;LAN&#xff09;内部使用的 IP 地址。这些地址不会在公共互联网中路由&#xff0c;因此可以在多个局域网中重复使用。私有 IP 地…

设计模式探索:责任链模式

1. 什么是责任链模式 责任链模式 (Chain of Responsibility Pattern) 是一种行为型设计模式。定义如下&#xff1a; 避免将一个请求的发送者与接收者耦合在一起&#xff0c;让多个对象都有机会处理请求。将接收请求的对象连接成一条链&#xff0c;并且沿着这条链传递请求&…

14-43 剑和诗人17 - ActiveRAG之主动学习

​​​​​ 大型语言模型 (LLM) 的出现开启了对话式 AI 的新时代。这些模型可以生成非常像人类的文本&#xff0c;并且比以往更好地进行对话。然而&#xff0c;它们在仅依赖预训练知识方面仍然面临限制。为了提高推理能力和准确性&#xff0c;LLM 需要能够整合外部知识。 检索…

文件存储的方法一

文章目录 概念介绍实现方法示例代码 我们在上一章回中介绍了"如何实现本地存储"相关的内容&#xff0c;本章回中将介绍如何实现文件存储.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值…

ffmpeg图片视频编辑器工具的安装与使用

title: ffmpeg图片视频编辑器工具的安装与使用 tags: [ffmpeg, 图片, 音频, 视频, 工具, 流媒体] categories: [工具, ffmpeg] FFmpeg是一个开源的命令行工具&#xff0c;广泛用于处理视频和音频文件&#xff0c;包括转换格式、剪辑、混流、解码、编码等。以下是一些基本的FFmp…

Zabbix 的部署和自定义监控内容

前言 一个完整的项目的业务架构包括 客户端 -> 防火墙 -> 负载均衡层&#xff08;四层、七层 LVS/HAProxy/nginx&#xff09; -> Web缓存/应用层&#xff08;nginx、tomcat&#xff09; -> 业务逻辑层(php/java动态应用服务) -> 数据缓存/持久层&#xff08;r…

智慧水利的变革之路:如何通过大数据、物联网和人工智能构建高效、智能、可持续的水利管理新模式

目录 一、引言&#xff1a;智慧水利的时代背景与意义 二、大数据&#xff1a;水利管理的数据基石 &#xff08;一&#xff09;数据收集与整合 &#xff08;二&#xff09;数据分析与挖掘 三、物联网&#xff1a;水利管理的感知神经 &#xff08;一&#xff09;智能感知与监…

Git 操作补充:cherry-pick、变基

1. 挑选提交合并 git cherry-pick 对于多分支的代码库&#xff0c;将代码从一个分支转移到另一个分支是一种常见的需求&#xff0c;这可以分成两种情况&#xff1a;一种情况是&#xff0c;你需要另一个分支的所有代码变动&#xff0c;那么就采用 git merge&#xff1b;另一种情…

【Unity2D 2022:UI】制作角色血条

一、创建血底UI 1. 创建画布&#xff08;Canvas&#xff09; 2. 在画布上添加血底图像&#xff08;Image&#xff09;子物体 二、编辑血底UI 1. 将血底图片拖入源图像&#xff08;Source Image&#xff09;中 2. 点击设置为图片的原大小&#xff08;Set Native Size&#x…

算法重新刷题

基础算法 前缀和 一维前缀和 [USACO16JAN] Subsequences Summing to Sevens S - 洛谷 这一题主要是需要结合数学知识来求解&#xff0c; #include <iostream> #include <cstring> #include <cstdio> #include <algorithm>using namespace std;con…

java花店管理系统eclipse开发mysql数据库

1 绪论 1.1 系统开发目的 随着人们物质生活水平和经济水平的不断提高&#xff0c;室内绿化布置、家庭园艺装饰、礼仪鲜花等日益受到重视和青睐&#xff0c;以及送鲜花给亲朋好友来表达自己的情谊。传统的花店对于信息的管理的主要方式是基于文本、表格等纸质手工处理&#xf…

【经验篇】Spring Data JPA开启批量更新时乐观锁失效问题

乐观锁机制 什么是乐观锁&#xff1f; 乐观锁的基本思想是&#xff0c;认为在大多数情况下&#xff0c;数据访问不会导致冲突。因此&#xff0c;乐观锁允许多个事务同时读取和修改相同的数据&#xff0c;而不进行显式的锁定。在提交事务之前&#xff0c;会检查是否有其他事务…

mac M1安装 VSCode

最近在学黑马程序员Java最新AI若依框架项目开发&#xff0c;里面前端用的是Visual Studio Code 所以我也就下载安装了一下&#xff0c;系统是M1芯片的&#xff0c;安装过程还是有点坑的写下来大家注意一下 1.在appstore中下载 2.在系统终端中输入 clang 显示如下图 那么在终端输…

【Linux进程】命令行参数 环境变量(详解)

目录 前言 1. 命令行参数 什么是命令行参数? 2. 环境变量 常见的环境变量 如何修改环境变量? 获取环境变量 环境变量的组织方式 拓展问题 导入环境变量 3. 本地变量* 总结 前言 在使用Linux指令的时候, 都是指令后边根命令行参数, 每个指令本质都是一个一个的可执行程…

JAVA集合框架、CAS、AQS

目录 一、java 的集合框架有哪些? 二、说-下 ArrayList 和 LinkedList? 三、HashSet和TreeSet的区别? 四、HashMap 的数据结构是什么? 五、CAS机制 六、AQS理解 一、java 的集合框架有哪些? Collection 是 Java 集合框架中的一个根接口&#xff0c;位于 java.util 包中。它…

亲密数对C++函数

自定义函数 #include<bits/stdc.h> using namespace std; //求n的因子和自定义函数 int yinzihe(int n){//使用2~sqrt(n)成对求解因子和int r0,i;//变量 r 初始值为0&#xff0c;因为要存放因子和for(i2;i<sqrt(n);i) {//回顾sqrt()课程//如果 i 是 n 的因子&#xf…

微笑背后的秘密:理解自闭症儿童的面部表情控制

在星贝育园自闭症儿童康复学校&#xff0c;我们常常遇到家长们提出的一个有趣而引人深思的问题&#xff1a;“为什么我的孩子似乎控制不住面部表情&#xff0c;尤其是频繁地笑&#xff1f;”这个问题背后&#xff0c;隐藏着自闭症谱系障碍&#xff08;ASD&#xff09;儿童独特的…

Caffeinated for Mac v2.0.6 Mac防休眠应用 兼容 M1/M2/M3

Caffeinated 可以防止您的 Mac 进入休眠状态、屏幕变暗或者启动屏幕保护。 应用介绍 您的屏幕是否总是在您不希望的时候变暗&#xff1f;那么Caffeinated就是您解决这个大麻烦的最好工具啦。Caffeinated是在Caffeine这个非常便捷、有用的工具的基础上开发而来的。Caffeinated…

20240707 每日AI必读资讯

&#x1f9e0;中国生成式AI专利数量超过美国 6 倍 - 中国在2014年至2023年期间申请的生成式AI专利数量达到38210个&#xff0c;超过了美国的6倍。 - 腾讯、平安保险集团和百度是GenAI专利数量最多的中国公司。 - 中国的顶级学术机构和技术生态为生成式AI的发展提供了强大支持…