书接上文,Java里的Map接口和泛型

Map接口

Map接口是Java集合中的一种数据结构,它提供了一种将键(key)映射到值(value)的方法。在Map中,每个键都是唯一的,并且可以用来检索与之关联的值。Map接口是Java集合框架中的一部分,可以通过java.util.Map包来使用。

特点

  • 键值对映射Map接口使用键值对(key-value)的方式来存储数据。每个键都与一个值相关联,通过键可以快速定位对应的值。
  • 无序性Map中的元素没有固定的顺序,即元素的存储顺序与插入顺序无关。不同的Map实现可能根据不同的规则来存储和排序元素。
  • 键的唯一性Map中的键是唯一的,每个键只能映射到一个值。如果重复插入相同的键,则后续的值会覆盖之前的值。
  • 可包含空键和空值Map接口允许键和值都是null,即空引用。

常用方法

Map接口定义了许多常用的方法,用于操作和访问键值对数据。以下是一些常见的方法:

  • put(key, value):将指定的键值对添加到Map中,如果键已存在,则覆盖原有的值。
  • get(key):根据指定的键获取对应的值。
  • containsKey(key):检查Map中是否包含指定的键。
  • containsValue(value):检查Map中是否包含指定的值。
  • remove(key):根据指定的键删除对应的键值对。
  • size():返回Map中键值对的数量。
  • isEmpty():检查Map是否为空。
  • keySet():返回包含所有键的集合。
  • values():返回包含所有值的集合。
  • entrySet():返回包含所有键值对的集合。

实现类

Map接口是一个接口,它有多个实现类可供使用,其中最常用的实现类是HashMapTreeMapLinkedHashMap

  • HashMap:以哈希表的形式实现Map接口,提供了快速的插入和查找操作。不保证元素的顺序。
  • TreeMap:基于红黑树的实现,按照键的自然顺序或自定义顺序对元素进行排序。
  • LinkedHashMap:使用双向链表维护元素的插入顺序,可以按照插入顺序或访问顺序进行迭代。

这些实现类都提供了对Map接口的完整支持,并根据具体的需求提供了不同的性能和顺序保证。

Map遍历

1.iterator迭代器遍历
2.增强for循环遍历
3.for循环遍历
4.forEach方法里用lambda表达式

public class Student {public static void main(String[] args) {Map<String, Person> map = new HashMap<String, Person>();Person liming = new Person("李明", "男");Person zhangsan = new Person("张三", "男");map.put("jack", liming);map.put("tom", zhangsan);//迭代器Iterator<String> it = map.keySet().iterator();while (it.hasNext()) {String key = it.next();Person value = map.get(key);System.out.println(key + "对应的学生姓名是:" + value.getName() + ";性别是:" + value.getSex());}System.out.println("--------------");//增强forSet<String> set = map.keySet();for (String obj : set) {
//            String key = (String) obj;Person value = map.get(obj);System.out.println(obj + "对应的学生姓名是:" + value.getName() + ";性别是:" + value.getSex());}System.out.println("--------------");//for循环for (int i = 0; i < map.size(); i++) {System.out.println(map.keySet().toArray()[i] <br/>+ "对应的学生姓名是:" + map.get(map.keySet().toArray()[i]).getName()+ ";性别是:" + map.get(map.keySet().toArray()[i]).getSex());}System.out.println("--------------");//lambda表达式,forEach方法map.forEach((key, value) -> System.out.println(key + "对应的学生姓名是:" + value.getName() +";性别是:" + value.getSex()));}}

#泛型
将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性。本质是参数化类型

泛型集合

在Java中,泛型集合是指具有类型参数的集合类。泛型集合允许我们在编译时指定集合中存储的元素类型,从而提供类型安全和更好的代码重用性。以下是一些常见的泛型集合类及其用法的示例:

List<E>

List<E> 是一个接口,表示一个有序的集合,可以包含重复元素。

List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Alice");System.out.println(names); // 输出: [Alice, Bob, Alice]

Set<E>

Set<E> 是一个接口,表示一个不包含重复元素的集合。

Set<Integer> numbers = new HashSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(2); // 重复元素不会被添加System.out.println(numbers); // 输出: [1, 2, 3]

Iterator<E>

Iterator是一个迭代器,一种用于遍历集合元素的接口

fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");Iterator<String> iterator = fruits.iterator();
while (iterator.hasNext()) {String fruit = iterator.next();System.out.println(fruit);
}

Map<K, V>

Map<K, V> 是一个接口,表示键值对的映射。

Map<String, Integer> scores = new HashMap<>();
scores.put("Alice", 90);
scores.put("Bob", 80);
scores.put("Charlie", 95);System.out.println(scores.get("Alice")); // 输出: 90

Queue<E>

Queue<E> 是一个接口,表示先进先出(FIFO)的队列。

Queue<String> queue = new LinkedList<>();
queue.offer("Apple");
queue.offer("Banana");
queue.offer("Cherry");System.out.println(queue.poll()); // 输出: Apple

Stack<E>

Stack<E> 是一个类,表示后进先出(LIFO)的栈。

Stack<String> stack = new Stack<>();
stack.push("Apple");
stack.push("Banana");
stack.push("Cherry");System.out.println(stack.pop()); // 输出: Cherry

##泛型的指定类型
Java中的泛型不支持基本数据类型(如 int、char、boolean 等),而只支持引用类型。这是因为泛型的实现依赖于类型擦除(Type Erasure)机制,它在编译时将泛型类型擦除为原始类型。由于基本数据类型不是引用类型,无法使用类型擦除机制来处理。

为了解决这个问题,可以使用其对应的包装类作为泛型参数。例如,使用 Integer 代替 int,Double 代替 double,Boolean 代替 boolean,以此类推。这些包装类是引用类型,可以作为泛型参数来实现泛型集合的操作。

包装类基本数据类
Booleanbooolean
Bytebyte
Integerint
Shortshort
Longlong
Floatfloat
Doubledouble
Characterchar

这些示例中的泛型集合类允许我们指定特定的元素类型,从而在编译时进行类型检查,并提供了更好的代码可读性和安全性。通过使用泛型集合,我们可以更好地组织和操作数据集合,而不必担心类型转换错误或运行时异常。

希望对你有所帮助,有的话可以点赞加收藏,让更多人看到。

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

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

相关文章

《Linux C编程实战》笔记:创建线程

上一章是进程&#xff0c;这一章是线程 有关线程进程的概念之类的请自行学操作系统吧&#xff0c;书里都是偏实战应用的 线程创建函数pthread_create #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)…

设计循环队列——oj题622

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;LeetCode刷题|数据结构|Linux 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 题目要求&#xff1a;应该支持如下操作&#xff1a;示例&#xff1a;提示&#xff1a; 结构体定义队列的创建基本操作判断队列是否为空&#xf…

软件设计模式 --- 类,对象和工厂模式的引入

Q1&#xff1a;什么是软件设计模式&#xff1f; A&#xff1a;软件设计模式&#xff0c;又称设计模式。它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。综上&…

vmware安装redhat 7.6 操作系统

vmware安装redhat 7.6 操作系统 1、下载redhat 7.6 操作系统镜像文件2、安装redhat 7.6操作系统3、配置redhat 7.6 操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载redhat 7.6 操作系统镜像文件 链接: 盘盘 zwzg 文件名&#xff1a;rhel-serv…

Ubuntu20 编译 Android 12源码

1.安装基础库 推荐使用 Ubuntu 20.04 及以上版本编译&#xff0c;会少不少麻烦&#xff0c;以下是我的虚拟机配置 执行命令安装依赖库 // 第一步执行 update sudo apt-get update//安装相关依赖sudo apt-get install -y libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-de…

无监督学习(K-Means)的认识

目录 一、无监督学习 二、无监督学习和有监督学习的区别 三、K-Means 3.1数据分析 3.2k-meas算法 3.3数据正态化后k-means 3.4找最佳k&#xff08;Elbow Plot&#xff09; 四、k-means算法的优缺点 一、无监督学习 无监督学习是一种机器学习的方法&#xff0c;…

掌握 Copilot:AI编程的未来

掌握 Copilot&#xff1a;AI编程的未来 前言: 欢迎来到本篇博客&#xff0c;今天我们将深入介绍一款颠覆性的编程辅助工具——Copilot。作为 GitHub Copilot 插件的使用者&#xff0c;你将体验到人工智能在编程领域的前沿应用&#xff0c;为你的代码编写提供更快、更智能的支…

车载 Android之 核心服务 - CarPropertyService 的VehicleHAL

前言: 本文是车载Android之核心服务-CarPropertyService的第二篇&#xff0c;了解一下CarPropertyService的VehicleHAL, 第一篇在车载 Android之 核心服务 - CarPropertyService 解析-CSDN博客&#xff0c;有兴趣的 朋友可以去看下。 本节介绍 AndroidAutomotiveOS中对于 Veh…

【大数据】Zookeeper 集群及其选举机制

Zookeeper 集群及其选举机制 1.安装 Zookeeper 集群2.如何选取 Leader 1.安装 Zookeeper 集群 我们之前说了&#xff0c;Zookeeper 集群是由一个领导者&#xff08;Leader&#xff09;和多个追随者&#xff08;Follower&#xff09;组成&#xff0c;但这个领导者是怎么选出来的…

PTA——逆序的三位数

程序每次读入一个正3位数&#xff0c;然后输出按位逆序的数字。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如输入700&#xff0c;输出应该是7。 输入格式&#xff1a; 每个测试是一个3位的正整数。 输出格式&#xff1a; 输出按位逆序…

2025年考研数学题型、题量预测和真题(送35页考研数学大纲详解)

2024年考研的分数线在陆续发布中&#xff0c;在此&#xff0c;六分成长祝福所有努力奋斗的学子们都能进入考研的复试&#xff0c;并顺利录取&#xff0c;2024年9月进入自己心目中的高校、院系和专业继续深造。 与此同时&#xff0c;2025年的考研大幕已经徐徐拉开&#xff0c;现…

书生·浦语大模型全链路开源体系(陈恺|上海人工智能实验室 青年科学家)-听课笔记

大模型重要性 大模型确实已成为发展通用人工智能&#xff08;AGI&#xff09;的重要途径。它们通过整合和处理大量数据&#xff0c;学习语言、图像、声音等多种模式的表示&#xff0c;以此来模拟人类的学习和思维方式。通过不断地学习和优化&#xff0c;这些模型能够在各种任…

DBeaver配置达梦数据库连接

随着信创逐渐推广&#xff0c;达梦数据库也成为流行。下面展示如何使用dbeaver配置达梦数据库连接 1 驱动新建 菜单&#xff0c;数据库->驱动管理器 2 驱动信息填写 选择新建之后&#xff0c;弹出一个填写页面 需要填写的几个关键信息&#xff1a; 驱动名称&#xff1a;…

SpringBoot实用开发(十)-- MongoDB的安装

目录 1. 简单认识 2.使用MongoDB的场景 3.MongoDB的安装 4. MongoDB的服务启动(重点记忆)

zookeeper应用场景之分布式的ID生成器

1. 分布式ID生成器的使用场景 在分布式系统中&#xff0c;分布式ID生成器的使用场景非常之多&#xff1a; 大量的数据记录&#xff0c;需要分布式ID。大量的系统消息&#xff0c;需要分布式ID。大量的请求日志&#xff0c;如restful的操作记录&#xff0c;需要唯一标识&#x…

新手学习易语言中文编程,易语言从入门到精通教学

一、教程描述 本套教程共有100集&#xff0c;并且有大量的课件资料&#xff0c;可能是截止到目前为止&#xff0c;最为全面系统的易语言教程了&#xff0c;其中有些视频是.exe文件&#xff0c;可以下载到本地播放。本套易语言教程&#xff0c;大小14.59G&#xff0c;共有6个压…

【Java并发】深入浅出 synchronized关键词原理-下

上一篇文章&#xff0c;简要介绍了syn的基本用法和monter对象的结构&#xff0c;本篇主要深入理解&#xff0c;偏向锁、轻量级锁、重量级锁的本质。 对象内存布局 Hotspot虚拟机中&#xff0c;对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据 (Instance Da…

互联网广告行业发展历程

在20年的历程中&#xff0c;广告主与媒体方持续面对着一些问题&#xff0c;一些核心问题推动了行业的迭代。 互联网广告经过了20年左右的高速发展&#xff0c;已愈发成熟&#xff0c;其历程是有趣的。 对互联网广告发展的理解&#xff0c;网上的文章并不多&#xff0c;已有的…

第12课 利用openCV检测物体是否运动了

FFmpeg与openCV绝对是绝配。前面我们已经基本熟悉了FFmpeg的工作流程&#xff0c;这一章我们重点来看看openCV。 在前面&#xff0c;我们已经使用openCV打开过摄像头并在MFC中显示图像&#xff0c;但openCV能做的要远超你的想像&#xff0c;比如可以用它来实现人脸检测、车牌识…

【Netapp数据恢复】Netapp存储lun被删除如何恢复数据?

Netapp存储数据恢复环境&故障情况&#xff1a; 某单位一台Netapp存储&#xff0c;该Netapp存储内共有数十块SAS硬盘。 工作人员误操作删除了Netapp存储中12个lun&#xff0c;删除的数据包括客户信息和其他重要数据。 Netapp存储数据恢复过程&#xff1a; 1、将故障存储中所…