Java集合 —— Map集合

  • map集合的遍历

      • 方式一、根据键找值,借助Set keySet()遍历
  • 方式二、根据键值对对象找键和值

  • 当自定义类的对象传入map集合时,应该重写equals和hashcode方法

  • LinkedHashMap

  • TreeMap

    • 例1 key值为String类型时
  • 例2 key值为自定义的类的时候

    • 一、用学生类Student实现Comparable接口的方式排序
  • 二、用排序器Comparator实现排序

  • TreeMap实例

Map接口不属于Collection接口

Map接口和Collection接口的不同:
  1. 它们两个不存在继承关系,都是属于java.util包下面的平级关系

  2. Map集合存储的元素都是成对出现的,Map元素的键是唯一的,值是可以重复。把这样的元素理解为:夫妻对

  3. Collection集合存储的元素都是单独出现的,Collection接口下面的Set是元素唯一的, List集合中元素是可以重复的。

这样的单独出现的元素,可以理解为单身

Map集合的特点:
  1. 将键映射到值的对象、

  2. key和value可以是任意的引用类型的数据

  3. 一个映射不能包含重复的键(map集合的key值不能重复)

  4. 每个键最多可以映射到一个值(每个键值对只有一个key值,一个value值)

  5. 同样的值可以对应多个不同的键(不同的键值对可以拥有相同的value值)

Map集合的功能:

1、添加功能: put(K key,V value)将指定的值与该映射中的指定键相关联

2、删除功能:

remove(Object key)如果存在,从该map集合中删除一个键的映射

void clear()从该map集合中删除所有的映射

3、长度功能:int size()返回此地图中键值映射的数量

这里使用的具体实现类是HashMap类,其特点是
  1. key值不可重复

  2. 不保证插入顺序,但是打印结果,循环遍历时,输出顺序不会改

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

  1. 实现了Map接口,底层是依赖于哈希表和链表的,具有可预知的遍历顺序

  2. 哈希表保证唯一性,保证的是Key的唯一性

  3. 链表保证有序,保证的是键的有序(存储和取出顺序一致)

package review.MapDemo;

import java.util.LinkedHashMap;

import java.util.Set;

最后

无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。

针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。

udent s : keys){

String name = s.getName();

int age = s.getAge();

System.out.println(name+“—”+age);

}

}

}

在这里插入图片描述

LinkedHashMap

LinkedHashMap

  1. 实现了Map接口,底层是依赖于哈希表和链表的,具有可预知的遍历顺序

  2. 哈希表保证唯一性,保证的是Key的唯一性

  3. 链表保证有序,保证的是键的有序(存储和取出顺序一致)

package review.MapDemo;

import java.util.LinkedHashMap;

import java.util.Set;

最后

无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。

针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。

[外链图片转存中…(img-5FUEeMRH-1714395161276)]

[外链图片转存中…(img-dUAx1PdR-1714395161277)]

[外链图片转存中…(img-Ytgn5n9R-1714395161277)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 8新增的Stream是一种处理集合的优雅姿势。 Stream是对集合(Collection)对象功能的增强,它能以一种声明的方式来处理数据,实现类似于SQL语句的操作。Stream不会改变原有的数据结构,它会生成一个新的Stream,同时支持并行化操作。 Stream的核心思想是将数据看作是流,而流上可以进行各种操作,比如过滤、排序、映射等。这样可以将数据处理过程变得非常简洁和灵活。 下面是一些Stream的常用操作: 1. filter:过滤符合条件的元素 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); list.stream().filter(i -> i % 2 == 0).forEach(System.out::println); //输出2, 4 ``` 2. map:将元素转换成另一种类型 ``` List<String> list = Arrays.asList("apple", "banana", "orange"); list.stream().map(s -> s.toUpperCase()).forEach(System.out::println); //输出APPLE, BANANA, ORANGE ``` 3. sorted:对元素进行排序 ``` List<Integer> list = Arrays.asList(5, 2, 1, 4, 3); list.stream().sorted().forEach(System.out::println); //输出1, 2, 3, 4, 5 ``` 4. distinct:去重 ``` List<Integer> list = Arrays.asList(1, 2, 3, 2, 1); list.stream().distinct().forEach(System.out::println); //输出1, 2, 3 ``` 5. limit:限制元素个数 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); list.stream().limit(3).forEach(System.out::println); //输出1, 2, 3 ``` 6. skip:跳过元素 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); list.stream().skip(2).forEach(System.out::println); //输出3, 4, 5 ``` 7. reduce:对元素进行聚合操作 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); int sum = list.stream().reduce(0, (a, b) -> a + b); System.out.println(sum); //输出15 ``` Stream的操作可以组合起来形成一个流水线,每个操作都会返回一个新的Stream对象,这样就可以形成一个操作序列。最后调用终止操作(如forEach、findAny等)才会触发所有间操作的执行。 使用Stream处理集合的代码通常比使用传统的循环更简洁,同时也更易于并行化处理,提高了程序的效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值