JavaSE基本知识补充 -Map集合

ops/2025/2/14 1:43:32/

目录

Map(key,value键值对呈现)

1.1 Map的映射的特点

1. 2.HashMap (键值对的业务偏多,而且hashmap在jdk1.7和1.8之间有所不同,性能做了提升,面试高频考点)

1.3 Map接口的方法

方法

HashMap遍历方式:

1.4 map的实现类TreeMap

1.5 Map的实现类HashTable

1.6 map的实现类LinkedHashMap

LinkedHashMap的特点

Map中实现线程安全的方式有哪些?


Map(key,value键值对呈现)

List集合:
Set:
Map是一个键值对的集合:
我们如果想要从map中获得值,可以根据键
Map
Map虽然是集合但是和Collection的集合体系不是一个体系:

1.1 Map的映射的特点

Map:
        1,Map集合(无序)的数据结构实现只针对键有效,与值无关。
        2,存储的是键值对形式的元素,键唯一,值可重复。   --和索引一样
一个映射不能包含重复的键;  -键不能重复
每个键最多只能映射到一个值。
键只允许有一个空值,  -键不能重复
值可以有多个空值。
Map也是无序的 -键无序
        Map :K和V表示泛型,map的key和value可以是任何类型(不能是基本数据类型,可以使用它的包装类),实际项目中K一般都是字符串类型。
基本类型
引用类型
boolean
Boolean
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
char
Character

1. 2.HashMap (键值对的业务偏多,而且hashmap在jdk1.7和1.8之间有所不同,性能做了提升,面试高频考点

Hashmap:
  1. hashmap键唯一,值可重复。(键的特点就相当于set集合特点)
  2. 底层数据结构是1.7(数组+链表)1.8(数组,红黑树,链表)。 数据结构不一样,导致性能不一样
  3. 线程不安全,效率高
一个映射不能包含重复的键;
如果存在重复的key就会把之前的覆盖掉
其实键就是Set,元素唯一,只能有一个null,元素是无序的。
如果大家能理解Set那么map的key也就能理解了。
java">package cn.qcby.demo;import java.util.HashMap;
import java.util.Map;public class MapTest {public static void main(String[] args) {//创建一个Map集合Map<String, String> map = new HashMap<>();//向集合总加元素map.put("白日鼠","白胜");map.put("豹子头","林冲");map.put("小诸葛","富安");//key只能有一个是null,值任意/*map.put(null, null);map.put("aaaa", null);*///值是可以重复的//map.put("大诸葛","富安");//如果存在重复的key就会把之前的覆盖掉//map.put("小诸葛","高衙内");System.out.println(map);}
}

1.3 Map接口的方法

方法

1.put
java">//创建一个Map集合
Map<String, String> map = new HashMap<>();
//向集合总加元素
map.put("白日鼠","白胜");
map.put("豹子头","林冲");
map.put("小诸葛","富安");System.out.println(map);
2.putAll
java">Map<String, String> map1 = new HashMap<>();
//向集合总加元素
map1.put("智多星","吴用");
map1.put("入云龙","公孙胜");map.putAll(map1);System.out.println(map);

 

1.clear
java">//清空集合
map.clear();
System.out.println(map);
2. remove
java">map.remove("小诸葛");
System.out.println(map);

 

1. get
java">//获得,根据key获得值String value = map.get("入云龙");System.out.println(value);
2. keySet
java">//获得一个map的集合的key的set集合
Set<String> strings = map.keySet();
System.out.println(strings);

 

1.containsKey
java">//判断map集合是否包含指定的key
boolean isCon = map.containsKey("豹子头");
System.out.println(isCon);
2. containsValue
java">//判断集合是否包含指定的值
boolean isCon1 = map.containsValue("白胜");
System.out.println(isCon1);
3. isEmpty
java">map.clear();
System.out.println(map);
//判断集合是否是空集合
boolean empty = map.isEmpty();
System.out.println(empty);
entrySet
java">Set<Map.Entry<String, String>> entries = map.entrySet();for (Map.Entry<String, String> entry : entries){//获得map的元素的keyString key = entry.getKey();//获得map的元素的valueString value = entry.getValue();System.out.println(key +"----------->"+value);
}

HashMap遍历方式:

        keySet()  
        entrySet()
         lambada遍历
        Streams Api单线程遍历
        Streams Api多线程遍历
lambada遍历:
java">map.forEach((key,value) -> {System.out.print(key);System.out.print(value);
});
Streams Api单线程遍历
java">map.entrySet().stream().forEach((StringStringEntry -> {System.out.println(StringStringEntry.getKey());System.out.println(StringStringEntry.getValue());
}));


1.4 map的实现类TreeMap

该映射根据其键的 自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
TreeMap特点:
  1. 只针对键来说元素唯一,不能为null,可自定义排序。(set集合特点)
  2. 底层数据结构红黑树(是一种平衡的二叉树)。
  3. 线程不安全。
可以按着key来做排序
Key不能null,key不能重复,值可以有多个null --比较的时候,会报空指针异常
不是线程安全的
添加:
java">//创建一个Map集合
Map<String, String> map = new TreeMap<>();
//向集合总加元素
map.put("b","白胜");
map.put("a","林冲");
map.put("e","富安");
map.put("c","富安");System.out.println(map);
有null值:
java">//创建一个Map集合
Map<String, String> map = new TreeMap<>();
//向集合总加元素
map.put("b","白胜");
map.put("a","林冲");
map.put("e","富安");
map.put("c",null);System.out.println(map);
       
         Person实现了comparable接口,我们的treemap可以根据key来做排序
   按年龄排
java">
public class Person implements Comparable<Person>{private String name;private int age;public Person(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;}@Overridepublic int compareTo(Person o) {return this.age - o.age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}

java">//创建一个Map集合
Map<Person, String> map = new TreeMap<>();
//向集合总加元素
map.put(new Person("白日鼠", 30),"白胜");
map.put(new Person("豹子头", 28),"林冲");
map.put(new Person("及时雨", 35),"宋江");System.out.println(map);

1.5 Map的实现类HashTable

HashTable 的特点
        1. HashTable是 map 的实现类
        2.不允许任何 null 值和 null --无法调用hashCode(),会抛出空指针异常 get(key)获取的null无法确定是键不存在还是值为null
        3. HashTable中的元素没有顺序(跟添加的顺序无关)
        4. HashTable是线程安全的。
        5.底层实现是哈希表。
java">//创建一个Map集合
Map<String, String> map = new Hashtable<>();
//向集合总加元素
map.put("b","白胜");
map.put("a","林冲");
map.put("e","富安");
map.put("c","asdsa");
map.put("d","afdsdsa");
map.put("e","asddffsa");
map.put("f","adfdfdfdsa");
map.put("g","assdsdsa");
System.out.println(map);

1.6 map的实现类LinkedHashMap

LinkedHashMap的特点

        1. LinkedHashMap是 map 的实现类(底层实现是链表)
        2.允许多个 null 值和一个 null 键 键是唯一的 注意,使用 get () 方法获取值时,如果键对应的值为 null,它会返回 null
        3. LinkedHashMap有顺序(添加的顺序)
        4. LinkedHashMap不是线程安全的。
java">//创建一个Map集合
Map<String, String> map = new LinkedHashMap<>();
//向集合总加元素
map.put("b","白胜");
map.put("a","林冲");
map.put("e","富安");
map.put("c",null);System.out.println(map);

 

Map中实现线程安全的方式有哪些?

        1.多线程环境下,可以使用concurrent包下有一个ConcurrentHashMap(方法和hashmap一样只是做了升级加了同步) 或者是使用Collections.synchronized Map (new HashMap());  
实现同步:
三个:
hashTable直接使用  
ConcurrentHashMap直接使用  
Collections.synchronizedMap(new HashMap()) -使用collections接口
        2.ConcurrentHashMap保证线程安全,效率比HashTable高
JDK1.7版本:ReentrantLock+Segment+HashEntry
JDK1.8版本:synchronized+CAS+HashEntry+红黑树

http://www.ppmy.cn/ops/158187.html

相关文章

MySQL面试题合集

1.MySQL中的数据排序是怎么实现的? 回答重点 排序过程中,如果排序字段命中索引,则利用 索引排序。 反之,使用文件排序。 文件排序中,如果数据量少则在内存中排序, 具体是使用单路排序或者双路排序。 如果数据大则利用磁盘文件进行外部排序,一 般使用归并排序。 知识…

python视频爬虫

文章目录 爬虫的基本步骤一些工具模拟浏览器并监听文件视频爬取易错点一个代码示例参考 爬虫的基本步骤 1.抓包分析&#xff0c;利用浏览器的开发者工具 2.发送请求 3.获取数据 4.解析数据 5.保存数据 一些工具 requests, 用于发送请求&#xff0c;可以通过get&#xff0c;p…

【清晰教程】本地部署DeepSeek-r1模型

【清晰教程】通过Docker为本地DeepSeek-r1部署WebUI界面-CSDN博客 目录 Ollama 安装Ollama DeepSeek-r1模型 安装DeepSeek-r1模型 Ollama Ollama 是一个开源工具&#xff0c;专注于简化大型语言模型&#xff08;LLMs&#xff09;的本地部署和管理。它允许用户在本地计算机…

自制游戏——斗罗大陆

很简陋&#xff0c;没有图&#xff0c;请见谅 // mine[0] 级数 // mine[1] 战力 //mine[2] 1 白虎 //mine[2] 2 昊天锤 //mine[2] 3 蓝银草 #include <bits/stdc.h> using namespace std; int mine[100],live3, dou 1, luo 1, da 1, bag[1000], huan 0, lia…

ASP.NET Core的贫血模型与充血模型

目录 概念 需求 贫血模型 充血模型 总结 概念 贫血模型&#xff1a;一个类中只有属性或者成员变量&#xff0c;没有方法。充血模型&#xff1a;一个类中既有属性、成员变量&#xff0c;也有方法。 需求 定义一个类保存用户的用户名、密码、积分&#xff1b;用户必须具有…

CSS Position宝典:解锁网页元素精准布局的秘密武器

在网页设计的浩瀚宇宙中&#xff0c;CSS Position属性无疑是那把开启精准布局大门的钥匙。它如同一位技艺高超的魔术师&#xff0c;让网页元素在屏幕上自由穿梭&#xff0c;无论是固定位置的导航栏、悬浮的提示框&#xff0c;还是动态变化的弹出层&#xff0c;都离不开Position…

现代神经网络QA(LeNet/AlexNet/VGG/NiN/GooleNet/ResNet)-----一篇搞懂

现代神经网络Q&A-----一篇搞懂 LeNet核心架构 经典卷积神经网络的包括&#xff1a; 带填充以保持分辨率的卷积层&#xff1b;非线性激活函数&#xff0c;如ReLU&#xff1b;汇聚层&#xff0c;如最大汇聚层。 pooling时&#xff0c;使用avg还是max&#xff1f; max&…

【Rust中级教程】1.5. 内存 Pt.3:深入探究Rust堆内存底层实现

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 1.5.1. 堆内存(Heap) Heap意味着混乱&#xff0c;而stack则相对比较整齐。Heap是一个内存池…