《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
Map集合的特点:
-
将键映射到值的对象、
-
key和value可以是任意的引用类型的数据
-
一个映射不能包含重复的键(map集合的key值不能重复)
-
每个键最多可以映射到一个值(每个键值对只有一个key值,一个value值)
-
同样的值可以对应多个不同的键(不同的键值对可以拥有相同的value值)
Map集合的功能:
1、添加功能: put(K key,V value)将指定的值与该映射中的指定键相关联
2、删除功能:
remove(Object key)如果存在,从该map集合中删除一个键的映射
void clear()从该map集合中删除所有的映射
3、长度功能:int size()返回此地图中键值映射的数量
这里使用的具体实现类是HashMap类,其特点是
-
key值不可重复
-
不保证插入顺序,但是打印结果,循环遍历时,输出顺序不会改
package review.MapDemo;
import java.util.HashMap;
import java.util.Map;
public class demo1 {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
// put(K key,V value)将键值对放入map集合
map.put(“唐僧”,“袈裟”);
map.put(“八戒”,“九齿钉耙”);
map.put(“沙僧”,“行李”);
//两次插入同一个key的映射的时候,返回的是该key上一个映射中对应的值
System.out.println(map.put(“孙悟空”,“金箍棒”)); //null
System.out.println(map.put(“孙悟空”,“定海神珍”)); //金箍棒
System.out.println(map.toString()); //{沙僧=行李, 孙悟空=定海神珍, 唐僧=袈裟, 八戒=九齿钉耙}
// remove(Object key)根据key删除元素,会返回key对应的value值
String value1 = map.remove(“沙僧”);
System.out.println(value1); //行李
System.out.println(map.toString()); //{孙悟空=定海神珍, 唐僧=袈裟, 八戒=九齿钉耙}
// size() 返回map集合中映射的数量
System.out.println(map.size()); //3
// void clear()清空map集合
map.clear();
System.out.println(map.toString()); //{}
}
}
4、判断功能:
boolean containsKey(Object key)
boolean containsValue(Object value)
boolean isEmpty()
package review.MapDemo;
import java.util.HashMap;
import java.util.Map;
public class demo2 {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put(“唐僧”,“袈裟”);
map.put(“八戒”,“九齿钉耙”);
map.put(“沙僧”,“行李”);
//containsKey(Object key)判断集合中是否包含某个键
System.out.println(map.containsKey(“八戒”)); //true
System.out.println(map.containsKey(“孙悟空”)); //false
//containsValue(Object value)判断集合中是否包含某个值
System.out.println(map.containsValue(“袈裟”)); //true
System.out.println(map.containsValue(“女儿国国王”)); //false
//isEmpty()判断map集合是否为空
System.out.println(map.isEmpty()); //false
map.clear();
System.out.println(map.isEmpty()); //true
}
}
5、获取功能:
(一)get(Object key) 根据指定的key获取对应的value
(二)Set< K > keySet() 返回一个Set集合,包含map集合中全部的key值
(三)Collection< V > values() 返回一个Collection集合,包含map集合中全部的value值
(四)Set<Map.Entry<K,V>> entrySet() 返回一个Set集合,包含map集合中全部的映射关系
package review.MapDemo;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class demo3 {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put(“唐僧”,“袈裟”);
map.put(“八戒”,“九齿钉耙”);
map.put(“沙僧”,“行李”);
// get(Object key)根据指定的key获取对应的value
//如果key值不存在,则返回null
System.out.println(map.get(“唐僧”)); //袈裟
System.out.println(map.get(“女儿国国王”)); //null
//Set keySet()返回一个Set集合,包含map集合中全部的key值
Set keys = map.keySet();
for(String s : keys){
System.out.println(s);
}
//Collection values()返回一个Collection集合,包含map集合中全部的value值
Collection values = map.values();
for(String s : values){
System.out.println(s);
}
//Set<Map.Entry<K,V>> entrySet()返回一个Set集合,包含map集合中全部的映射关系
Set<Map.Entry<String,String>> entrySet = map.entrySet();
for(Map.Entry<String,String> s : entrySet){
String key = s.getKey();
String value = s.getValue();
System.out.println(key+“=”+value);
}
}
}
map集合的遍历
方式一、根据键找值,借助Set keySet()遍历
package review.MapDemo;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class demo4 {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put(“孙悟空”,“金箍棒”);
map.put(“唐僧”,“袈裟”);
map.put(“八戒”,“九齿钉耙”);
map.put(“沙僧”,“行李”);
/*
借助Set keySet()遍历
1、获取Map集合中所有映射的键的Set集合
2、遍历键的集合,根据每一个键获取对应的值
*/
//方式一,用增强for循环
Set keys = map.keySet();
for(String s : keys){
String key = s;
String value = map.get(s);
System.out.println(key+“=”+value);
}
//方式二,用迭代器
//为Set集合创建一个迭代器Iterator
Set itkeys = map.keySet();
Iterator it = itkeys.iterator();
while(it.hasNext()){
String key = it.next();
String value = map.get(key);
System.out.println(key+“=”+value);
}
}
}
方式二、根据键值对对象找键和值
package review.MapDemo;
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.Set;
public class demo5 {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put(“孙悟空”,“金箍棒”);
map.put(“唐僧”,“袈裟”);
map.put(“八戒”,“九齿钉耙”);
map.put(“沙僧”,“行李”);
/*
通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。
1、获取所有的键值对的集合
2、遍历包含所有键值对的Set集合,得到每一个键值对对象
3、根据获取到的每一个键值对,来获取键和值
*/
//方式一、增强for循环
Set<Map.Entry<String,String>> entrySet = map.entrySet();
for(Map.Entry<String,String> s : entrySet){
String key = s.getKey();
String value = s.getValue();
System.out.println(key+“=”+value);
}
//方式二、迭代器遍历
Set<Map.Entry<String,String>> entrySet1 = map.entrySet();
Iterator<Map.Entry<String,String>> it = entrySet.iterator();
while(it.hasNext()){
Map.Entry<String,String> entry = it.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+“=”+value);
}
}
}
结果同上面一样
当自定义类的对象传入map集合时,应该重写equals和hashcode方法
具体实现我在之前的博客写过了
集合List和Map——重写equals和hashCode方法(集合元素是类的对象)
这里举一个简单的例子
package review.MapDemo;
import java.util.Objects;
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 String toString() {
return “Student{” +
“name='” + name + ‘’’ +
“, 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);
}
}
package review.MapDemo;
import java.util.HashMap;
import java.util.Set;
public class demo6 {
public static void main(String[] args) {
HashMap<Student,Integer> map = new HashMap<>();
Student s1 = new Student(“zhang”,12);
Student s2 = new Student(“zhou”,14);
Student s3 = new Student(“zhang”,12);
map.put(s1,1);
map.put(s2,2);
map.put(s3,3);
Set keys = map.keySet();
for(Student s : keys){
String name = s.getName();
int age = s.getAge();
System.out.println(name+“—”+age);
}
}
}
LinkedHashMap
LinkedHashMap
-
实现了Map接口,底层是依赖于哈希表和链表的,具有可预知的遍历顺序
-
哈希表保证唯一性,保证的是Key的唯一性
-
链表保证有序,保证的是键的有序(存储和取出顺序一致)
package review.MapDemo;
import java.util.LinkedHashMap;
import java.util.Set;
public class LinkedHashMapDemp1 {
public static void main(String[] args) {
LinkedHashMap<String,String> map = new LinkedHashMap<>();
map.put(“1”,“java”);
map.put(“3”,“hive”);
map.put(“2”,“hadoop”);
Set keys = map.keySet();
for(String s : keys){
String key = s;
String value = map.get(s);
System.out.println(key+“=”+value);
}
}
}
TreeMap
-
HashMap的key值是无序的,而实现了SortedMap接口的具体实现类TreeMap会对key值进行排序
-
TreeMap底层基于红黑树
-
TreeMap实现排序有两种方式
(一)传入的key值实现了Comparable接口(String,Integer等都已经实现了Comparable接口,因此可以直接用)
(二)创建TreeMap集合的时候指定比较器Comparator
例1 key值为String类型时
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class demo1 {
public static void main(String[] args) {
TreeMap<String,Integer> treeMap = new TreeMap<>();
treeMap.put(“java”,1);
treeMap.put(“hive”,2);
treeMap.put(“flume”,3);
Set<Map.Entry<String,Integer>> set = treeMap.entrySet();
for(Map.Entry<String,Integer> entry : set){
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+“—”+value);
}
}
}
按照key值的首字母进行排序
例2 key值为自定义的类的时候
一、用学生类Student实现Comparable接口的方式排序
package review.TreeMapDemo;
public class Student implements Comparable {
private String name;
private int age;
public Student() {
最后
做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。
当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。
更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
按照key值的首字母进行排序
例2 key值为自定义的类的时候
一、用学生类Student实现Comparable接口的方式排序
package review.TreeMapDemo;
public class Student implements Comparable {
private String name;
private int age;
public Student() {
最后
做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。
当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。
更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务
[外链图片转存中…(img-xy5V3M6w-1714693974858)]
[外链图片转存中…(img-HhoQaJE5-1714693974859)]
[外链图片转存中…(img-u6fRguJr-1714693974859)]
[外链图片转存中…(img-avojeQqX-1714693974859)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!