Java学习20——Map接口

目录

一.Map:

1.基本介绍:

2.Map常用方法:

3.Map的遍历方法:

4.HashMap:

1.基本介绍:

2.HashMap底层扩容机制:

5.Hashtable:

1.基本介绍:

2.HashMap和Hashtable的对比:

6.Properties:

1.基本介绍:

7.如何选择集合类:

8.Treeset:

9.TreeMap:

二.Collections工具类:

1.基本介绍:

2.Collection方法:

三.泛型:

1.泛型的优点:

2.泛型的基本介绍:

3.泛型使用细节:

4.自定义泛型:

1.自定义泛型类:

2.自定义泛型接口:

3.自定义泛型方法:


一.Map:

1.基本介绍:

2.Map常用方法:

3.Map的遍历方法:

//第一组: 先取出 所有的 Key , 通过 Key 取出对应的 Value
Set keyset = map.keySet();
//(1) 增强 for
System.out.println("-----第一种方式-------");
for (Object key : keyset) {
System.out.println(key + "-" + map.get(key));
}
//(2) 迭代器
System.out.println("----第二种方式--------");
Iterator iterator = keyset.iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println(key + "-" + map.get(key));
}
//第二组: 把所有的 values 取出
Collection values = map.values();
//这里可以使用所有的 Collections 使用的遍历方法
//(1) 增强 for
System.out.println("---取出所有的 value 增强 for----");
for (Object value : values) {
System.out.println(value);
}
//(2) 迭代器
System.out.println("---取出所有的 value 迭代器----");
Iterator iterator2 = values.iterator();
while (iterator2.hasNext()) {
Object value = iterator2.next();
System.out.println(value);
}
//第三组: 通过 EntrySet 来获取 k-v
Set entrySet = map.entrySet();// EntrySet<Map.Entry<K,V>>
//(1) 增强 for
System.out.println("----使用 EntrySet 的 for 增强(第 3 种)----");
for (Object entry : entrySet) {
//将 entry 转成 Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
//(2) 迭代器
System.out.println("----使用 EntrySet 的 迭代器(第 4 种)----");
Iterator iterator3 = entrySet.iterator();
while (iterator3.hasNext()) {
Object entry = iterator3.next();
//System.out.println(next.getClass());//HashMap$Node -实现-> Map.Entry (getKey,getValue)
//向下转型 Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}

4.HashMap:

1.基本介绍:

2.HashMap底层扩容机制:

5.Hashtable:

1.基本介绍:
  • 存放的元素是键值对,Hashtable的键和值都不能为null,否则会抛出NullPointException异常。
  • Hashtable的使用方法和HashMap一样
  • Hashtable是线程安全的(synchronized),HashMap是线程不安全的。
2.HashMap和Hashtable的对比:

6.Properties:

1.基本介绍:

Properties继承了Hashtable,可以通过k-v存放数据,key和value不能为null。key

7.如何选择集合类:

8.Treeset:

treeSet排序操作

TreeSet treeSet = new TreeSet();
TreeSet treeSet = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//下面 调用 String 的 compareTo 方法进行字符串大小比较
//如果老韩要求加入的元素,按照长度大小排序
//return ((String) o2).compareTo((String) o1);
return ((String) o1).length() - ((String) o2).length();
}
});

9.TreeMap:

TreeMap排序操作:

//使用默认的构造器,创建 TreeMap, 是无序的(也没有排序)
TreeMap treeMap = new TreeMap();
TreeMap treeMap = new TreeMap(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//按照传入的 k(String) 的大小进行排序
//按照 K(String) 的长度大小排序
//return ((String) o2).compareTo((String) o1);
return ((String) o2).length() - ((String) o1).length();
}
})
/*2. 调用 put 方法
2.1 第一次添加, 把 k-v 封装到 Entry 对象,放入 root
Entry<K,V> t = root;
if (t == null) {
compare(key, key); // type (and possibly null) check
root = new Entry<>(key, value, null);
size = 1;
modCount++;
return null;
}
2.2 以后添加
Comparator<? super K> cpr = comparator;
if (cpr != null) {
do { //遍历所有的 key , 给当前 key 找到适当位置
parent = t;
cmp = cpr.compare(key, t.key);//动态绑定到我们的匿名内部类的 compare
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else //如果遍历过程中,发现准备添加 Key 和当前已有的 Key 相等,就不添加
return t.setValue(value);
} while (t != null);
}
*/

二.Collections工具类:

1.基本介绍:

2.Collection方法:

//shuffle(List):对 List 集合元素进行随机排序
Collections.shuffle(list);
//reverse(List):反转 List 中元素的顺序
Collections.reverse(list);
//sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
Collections.sort(list);
//sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
//我们希望按照 字符串的长度大小排序
Collections.sort(list, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//可以加入校验代码. return ((String) o2).length() - ((String) o1).length();
}
});
//swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换
Collections.swap(list, 0, 1);

//Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
System.out.println("自然顺序最大元素=" + Collections.max(list));
//Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
//比如,我们要返回长度最大的元素
Object maxObject = Collections.max(list, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ((String)o1).length() - ((String)o2).length();
}
});
//int frequency(Collection,Object):返回指定集合中指定元素的出现次数
System.out.println("tom 出现的次数=" + Collections.frequency(list, "tom"));
//void copy(List dest,List src):将 src 中的内容复制到 dest 中
ArrayList dest = new ArrayList();
//为了完成一个完整拷贝,我们需要先给 dest 赋值,大小和 list.size()一样
for(int i = 0; i < list.size(); i++) {
dest.add("");
}
//拷贝
Collections.copy(dest, list);
System.out.println("dest=" + dest);
//boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值
//如果 list 中,有 tom 就替换成 汤姆
Collections.replaceAll(list, "tom", "汤姆");

三.泛型:

1.泛型的优点:

2.泛型的基本介绍:

public class Generic03 {
public static void main(String[] args) {
//注意,特别强调: E 具体的数据类型在定义 Person 对象的时候指定,即在编译期间,就确定 E 是什么类型
Person<String> person = new Person<String>("韩顺平教育");
person.show(); //String
/*
class Person<E> {
E s ;//E 表示 s 的数据类型, 该数据类型在定义 Person 对象的时候指定,即在编译期间,就确定 E
是什么类型
public Person(E s) {//E 也可以是参数类型
this.s = s;
}
public E f() {//返回类型使用 E
return s;
}
}
*/
你可以这样理解,上面的 Person 类
class Person {
String s ;//E 表示 s 的数据类型, 该数据类型在定义 Person 对象的时候指定,即在编译期间,就确定 E
是什么类型
public Person(String s) {//E 也可以是参数类型
this.s = s;
}
public String f() {//返回类型使用 E
return s;
}
}
*/

3.泛型使用细节:

  • 给泛型指向数据类型是,要求是引用类型,不能是基本数据类型。
  • 在给泛型指定具体类型后,可以传入该类型或者其子类类型。
ArrayList<Integer> list1 = new ArrayList<Integer>();
List<Integer> list2 = new ArrayList<Integer>();
//在实际开发中,我们往往简写
ArrayList<Integer> list3 = new ArrayList<>();
List<Integer> list4 = new ArrayList<>();
ArrayList<Pig> pigs = new ArrayList<>();
//如果是这样写 泛型默认是 Object
ArrayList arrayList = new ArrayList();//等价 ArrayList<Object> arrayList = new ArrayList<Object>();

4.自定义泛型:

1.自定义泛型类:
  • 普通成员可以使用泛型 (属性、方法)
  • 使用泛型的数组,不能初始化,数组在 new 不能确定 T 的类型,就无法在内存开空间。
  • 静态方法中不能使用类的泛型,静态是和类相关的,在类加载时,对象还没有创建 所以,如果静态方法和静态属性使用了泛型,JVM 就无法完成初始化
2.自定义泛型接口:
  • 接口中,静态成员也不能使用泛型。
  • 泛型接口的类型 , 在继承接口或者实现接口时确定
  • 没有指定类型,默认为 Object
//实现接口时,直接指定泛型接口的类型
//class bb implement IUsb<Integer, Float>{
public Float get(Integer integer) {
return null;
}
public void hi(Float aFloat) {
}
public void run(Float r1, Float r2, Integer u1, Integer u2) {
}
}
interface IA extends IUsb<String, Double> {
}
//在继承接口 指定泛型接口的类型
//当我们去实现 IA 接口时,因为 IA 在继承 IUsu 接口时,指定了 U 为 String R 为 Double
//,在实现 IUsu 接口的方法时,使用 String 替换 U, 是 Double 替换 R
class AA implements IA {
@Override
public Double get(String s) {
return null;
}
@Override
public void hi(Double aDouble) {
}
@Override
public void run(Double r1, Double r2, String u1, String u2) {
}
}interface IUsb<U, R> {
//普通方法中,可以使用接口泛型
R get(U u);
void hi(R r);
void run(R r1, R r2, U u1, U u2);
}
3.自定义泛型方法:

class Fish<T, R> {//泛型类
public void run() {//普通方法
}
public<U,M> void eat(U u, M m) {//泛型方法
}
//说明
//1. 下面 hi 方法不是泛型方法
//2. 是 hi 方法使用了类声明的 泛型
public void hi(T t) {
}
}

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

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

相关文章

Image Search-这是你的图像搜索

Image Search-这是你的图像搜索 什么是图像搜索图像搜索开通图像搜索商品图片搜索图片搜索图片新增批量操作OSS-创建bucket上传文件创建increment.meta并上传元信息导出 体验感受 什么是图像搜索 在接触一个新的产品时&#xff0c;我们首先要知道这款产品是什么&#xff1f;那…

ARM IHI0069F GIC architecture specification (8)

3.2中断旁路支持 CPU interface可以支持中断信号旁路&#xff0c;使得当接口发出的中断信号被禁用时&#xff0c;传统中断信号被传递到PE上的中断请求输入&#xff0c;从而绕过GIC功能。 是否支持旁路由实际设计决定。 用于确定是否使用GICv3 FIQ和IRQ输出或旁路信号的控制取决…

英伟达在2024台北电脑展上推出NIM云原生微服务

&#x1f989; AI新闻 &#x1f680; 英伟达推出NIM云原生微服务&#xff0c;助力生成式AI发展 摘要&#xff1a;在2024台北电脑展上&#xff0c;黄仁勋介绍了生成式人工智能将推动软件全栈重塑&#xff0c;并展示了Nvidia Inference Microservices&#xff08;NIM&#xff0…

《2024快手未成年人保护报告》发布:八大功能保护未成年人隐私信息

5月31日&#xff0c;快手发布《2024快手未成年人保护报告》&#xff08;下文简称《报告》&#xff09;。《报告》显示&#xff0c;快手在2023年持续升级未成年人保护机制&#xff0c;在不断提升平台保障能力和未成年人使用体验的同时&#xff0c;针对未成年人隐私信息保护持续优…

区间预测 | Matlab实现GRU-Attention-KDE核密度估计多置信区间多变量回归区间预测

区间预测 | Matlab实现GRU-Attention-KDE核密度估计多置信区间多变量回归区间预测 目录 区间预测 | Matlab实现GRU-Attention-KDE核密度估计多置信区间多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现GRU-Attention-KDE门控循环单元注意力…

【JS实战02】轮播图

一&#xff1a;HTML页面结构 1 整体外观 2 HTML结构以及CSS样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

HTML:认识HTML与基本语法的学习

前言 HTML&#xff08;超文本标记语言&#xff09;是用于创建网页的标记语言&#xff0c;由一系列标签组成&#xff0c;定义网页中的元素。由蒂姆伯纳斯 - 李于1990年代初发明&#xff0c;最初用于科研机构间共享文档&#xff0c;迅速演变为Web开发基础。无论是电商、博客、新…

2024 年适用于 Mac 的 5 大免费录屏软件

要成为Mac的优秀屏幕录像机&#xff0c;捕获视频的高清质量和易于操作的界面是两个主要重要因素。此外&#xff0c;Mac上的付费屏幕录像机不仅可以输出高质量的屏幕捕获视频。您也可以在免费的视频捕获软件中获得类似的桌面录制服务。因此&#xff0c;如果您不需要以专业的方式…

UE5增强输入系统入门

UE4直接在项目设置里设置的轴映射和操作映射在UE5中被标记为废弃&#xff0c;改为使用增强输入系统。 这两天学习了下蓝图和c中增强输入系统的使用&#xff0c;在这里分享一下。 学习使用的模板是第三人称模板(蓝图/c)&#xff0c;代码蓝图都参考的模板。 增强输入系统 UE5…

简单、实用、免费、无广告的图片自由分割工具

一、简介 1、是来自 Github 的一款简单、实用、免费、无广告的图片自由分割工具。它安装包大小在 4.5MB 左右,目前仅支持 Windows 和 Web 平台。 2、基本功能:支持图片自由纵向分割,横向分割,宫格分割,低仿 wps 看图图片分割,分割完成后,打开电脑的下载目录即可查看包含…

python-旋转字符串

问题描述&#xff1a;给定一个字符串&#xff08;以字符串数组的形式&#xff09;和一个偏移量&#xff0c;根据偏移量从左到右地旋转字符数组。 问题示例&#xff1a;输入str”abcdefg”,offset3,输出“efgabcd”。输入str”abcdefg”,offset0,输出“abcdefg”。&#xff08;返…

clion配置ssh隧道转发 实现远程主机功能

clion配置ssh隧道转发 clion自带的ssh配置只能配置主机和用户名的格式来实现ssh&#xff0c;因此如果需要通过中间设备来访问调试主机的话就无法使用了。 配置ssh隧道的方式有两种&#xff0c;一种是直接配置 ~/.ssh/config 配置文件&#xff0c;一种是使用跳板机工具。clion…

Python热重载调试新利器

你一定遇到过这种情况&#xff1a;Python脚本已经运行&#xff0c;却发现自己忘记打印输出需要记录的信息(比如for循环中打印更多详细信息)。 此时&#xff0c;如若暂停运行的代码&#xff0c;修改补充再重新运行整个代码&#xff0c;尤其对于已经运行数多个小时的模型训练来说…

生成式 AI——ChatGPT、Dall-E、Midjourney 等算法理念探讨

1.概述 艺术、交流以及我们对现实世界的认知正在迅速地转变。如果我们回顾人类创新的历史&#xff0c;我们可能会认为轮子的发明或电的发现是巨大的飞跃。今天&#xff0c;一场新的革命正在发生——弥合人类创造力和机器计算之间的鸿沟。这正是生成式人工智能。 生成模型正在模…

python替换“${}“占位符为变量,实现读取配置文件

文章目录 背景1、定义正则表达式2、替换变量占位符3、实现功能 背景 使用python编写小工具&#xff0c;有一个配置文件&#xff0c;希望实现类似shell命令的&#xff0c;定义变量并且使用${}或者$来引用。如果有好的建议欢迎讨论。 配置文件示例内容如下: D:\project\test\pr…

IGraph使用实例——线性代数计算(blas)

1 概述 在图论中&#xff0c;BLAS&#xff08;Basic Linear Algebra Subprograms&#xff09;并不直接应用于图论的计算&#xff0c;而是作为一套线性代数计算中通用的基本运算操作函数集合&#xff0c;用于进行向量和矩阵的基本运算。然而&#xff0c;这些基本运算在图论的相…

csrf漏洞与ssrf漏洞

环境&#xff1a;用kali搭建的pikachu靶场 一.CSRF 1.CSRF漏洞简介 跨站请求伪造&#xff08;CSRF&#xff09;漏洞是一种Web应用程序安全漏洞&#xff0c;攻击者通过伪装成受信任用户的请求来执行未经授权的操作。这可能导致用户在不知情的情况下执行某些敏感操作&#xff0…

遥感之特征选择-禁忌搜索算法

各类智能优化算法其主要区别在于算法的运行规则不同&#xff0c;比如常用的遗传算法&#xff0c;其规则就是变异&#xff0c;交叉和选择等&#xff0c;各种不同的变体大多是在框架内的实现细节不同&#xff0c;而本文中的禁忌算法也是如此&#xff0c;其算法框架如下进行介绍。…

丰盘v24.5集成OnlyOffice 7.5版本,支持子管理员高级特性

五一劳动节刚过&#xff0c;我们的开发小伙伴上线发布了v24.5版本&#xff0c;支持原生集成OnlyOffice 7.5的套件版本&#xff0c;无需管理员手工配置密钥证书等繁琐操作&#xff0c;对Word、PPT和Excel文件有了更强的兼容性和稳定性&#xff0c;例如当文件里包含Visio图像时&a…

C之动态内存管理(动态内存开辟与调整等)

目录 1.为什么要有动态内存分配 2.malloc、calloc、realloc和free malloc&#xff1a; calloc&#xff1a; realloc&#xff1a; free&#xff1a; 3.常见的动态内存的错误 3.1&#xff1a;对NULL指针的解引用操作 3.2&#xff1a;对动态开辟空间的越界访问 3.3&…