Java基础:Map(1)

文章讲述了如何在Java中使用Map集合,包括获取键值对的Entry对象,处理自定义对象作为键的场景,以及并发情况下如何保证数据一致性与高可用性的技术要点,如LinkedHashMap的有序性和并发控制策略。
摘要由CSDN通过智能技术生成
  1. 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示: entrySet()

  2. 遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。

  3. 通过键值对(Entry)对象,获取Entry对象中的键与值。 方法提示: getkey() getValue()

public class MapDemo02 {

public static void main(String[] args) {

// 创建Map集合对象

HashMap<String, String> map = new HashMap<String,String>();

// 添加元素到集合

map.put(“胡歌”, “霍建华”);

map.put(“郭德纲”, “于谦”);

map.put(“薛之谦”, “大张伟”);

// 获取 所有的 entry对象 entrySet

Set<Entry<String,String>> entrySet = map.entrySet();

// 遍历得到每一个entry对象

for (Entry<String, String> entry : entrySet) {

// 解析

String key = entry.getKey();

String value = entry.getValue();

System.out.println(key+“的CP是:”+value);

}

}

}

遍历图解:

在这里插入图片描述

tips:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。

1.7 HashMap存储自定义类型键值


练习:每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到map集合中。学生作为键, 家庭住址作为值。

注意,学生姓名相同并且年龄相同视为同一名学生。

编写学生类:

public class Student {

private String name;

private int age;

public Student() {

}

public Student(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@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(name, age);

}

}

编写测试类:

public class HashMapTest {

public static void main(String[] args) {

//1,创建Hashmap集合对象。

Map<Student,String>map = new HashMap<Student,String>();

//2,添加元素。

map.put(newStudent(“lisi”,28), “上海”);

map.put(newStudent(“wangwu”,22), “北京”);

map.put(newStudent(“zhaoliu”,24), “成都”);

map.put(newStudent(“zhouqi”,25), “广州”);

map.put(newStudent(“wangwu”,22), “南京”);

//3,取出元素。键找值方式

SetkeySet = map.keySet();

for(Student key: keySet){

Stringvalue = map.get(key);

System.out.println(key.toString()+“…”+value);

}

}

}

  • 当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法(如果忘记,请回顾HashSet存放自定义对象)。

  • 如果要保证map中存放的key和取出的顺序一致,可以使用java.util.LinkedHashMap 集合来存放。

1.8 LinkedHashMap


我们知道HashMap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那么我们要保证有序,还要速度快怎么办呢?

在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。

public class LinkedHashMapDemo {

public static void main(String[] args) {

LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();

map.put(“邓超”, “孙俪”);在这里插入代码片

map.put(“李晨”, “范冰冰”);

map.put(“刘德华”, “朱丽倩”);

Set<Entry<String, String>> entrySet = map.entrySet();

for (Entry<String, String> entry : entrySet) {

System.out.println(entry.getKey() + " " + entry.getValue());

}

}

}

结果:

邓超 孙俪

李晨 范冰冰

刘德华 朱丽倩

1.9 Map集合练习


需求:

计算一个字符串中每个字符出现次数。

分析:

  1. 获取一个字符串对象

  2. 创建一个Map集合,键代表字符,值代表次数。

  3. 遍历字符串得到每个字符。

  4. 判断Map中是否有该键。

  5. 如果没有,第一次出现,存储次数为1;如果有,则说明已经出现过,获取到对应的值进行++,再次存储。

  6. 打印最终结果

代码

public class MapTest {

public static void main(String[] args) {

//友情提示

System.out.println(“请录入一个字符串:”);

String line = new Scanner(System.in).nextLine();

// 定义 每个字符出现次数的方法

findChar(line);

}

private static void findChar(String line) {

//1:创建一个集合 存储 字符 以及其出现的次数

HashMap<Character, Integer> map = new HashMap<Character, Integer>();

//2:遍历字符串

for (int i = 0; i < line.length(); i++) {

char c = line.charAt(i);

//判断 该字符 是否在键集中

if (!map.containsKey©) {//说明这个字符没有出现过

//那就是第一次

map.put(c, 1);

} else {

//先获取之前的次数

Integer count = map.get©;

//count++;

//再次存入 更新

map.put(c, ++count);

}

}

System.out.println(map);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总目录展示

该笔记共八个节点(由浅入深),分为三大模块。

高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。该笔记将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。

一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,将用一个节点来专门讲解如何设计秒杀减库存方案。

高可用。 虽然介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。


篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),麻烦各位转发一下(可以帮助更多的人看到哟!)

由于内容太多,这里只截取部分的内容。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。


篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),麻烦各位转发一下(可以帮助更多的人看到哟!)

[外链图片转存中…(img-SfFdbYAT-1712123370405)]

[外链图片转存中…(img-m6L1up12-1712123370406)]

由于内容太多,这里只截取部分的内容。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值