Java中的Map和Set集合

目录

Map和Set集合

Map集合和Set集合的基础使用

Map的基础使用

关于Map接口常见子类的添加问题

Set的基础使用


Map和Set集合

主要的数据结构:

二分搜索树

在Java标准库中的实现叫 TreeMap / TreeSet

哈希表

在Java标准库中的实现叫 HashMap / HashSet

Map集合和Set集合的基础使用

Map的基础使用

Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap。

Map保存的是键值对元素
不重复的key对应一个可以重复的value值

map.put(key,value):添加一个新的键值对。(添加&修改操作)

若key不存在,就新增一个Map.Entry对象,保存到Map中。没有键映射,则返回NULL。

若key已经存在,修改原来的value为新的value,返回修改前的value。(既是新增又是修改

map.containsKey(1) :判断1这个值在当前map的key中是否存在 ——> true

map.containsValue(100):判断100这个值在map中Value中是否存在 ——> false
Map集合的遍历:实际上就是取出一对一对的元素,使用for each

for(Map.Entry<k,v> entry : map.entrySet()) {
    //每次从Map集合中取出一个键值对对象
    entry.getKey();
    entry.getValue();
}

Map中的键值对这个类型——> Map.Entry 表示当前Map中的一个个键值对。
map.entrySet():返回Map中所有键值对对象,即数组Map.Entry[]。

{
    {1:10},    // Map.Entry1 
    {2:20},    // Map.Entry2
    {3:10},    // Map.Entry3
}

Map.Entry方法
entry.getKey():当前键值对的key值

entry.getValue():当前键值对的Value值

package jcl;
import java.util.HashMap;
import java.util.Map;

public class MapTest {
    public static void main(String[] args) {
        Map<Integer, Integer> map = new HashMap<>();
        map.put(1, 10);
        map.put(2, 10);
        map.put(3, 10);
        System.out.println(map.containsKey(3));
        System.out.println(map.containsValue(40));
        //Map.Entry[]
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " = " + entry.getValue());
        }
    }
}

 


get():根据相应的key取出相应的value值。若不存在,返回null。

getOrDefault(key,default):若key不存在,返回默认值defaultVal。

remove():删除指定key值的这一对健值对,返回删除的value值。

Set<k> keySet()返回当前Map接口中所有的key值集合。返回值是一个Set集合,key不能重复。Set接口中就保存的不重复元素。

Collection<V> values()返回当前Map接口中所有的value值集合。返回值是一个Collection接口的集合,value可以重复。

package jcl;
import java.util.*;

/**
 * Map集合
 */
public class MapTest {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("及时雨", "宋江");
        map.put("智多星", "吴用");
        map.put("九纹龙", "史进");
        map.put("豹子头", "林冲");
        System.out.println(map.put("智多星", "张三"));
        //取出所有的k值
        Set<String> keys = map.keySet();
        System.out.println("当前所有的key为:");
        for (String str : keys) {
            System.out.print(str +" ");
        }
        System.out.println();
        //取出所有的value值
        Collection<String> values = map.values();
        System.out.println("当前所有的value为:");
        for (String str : values) {
            System.out.print(str +" ");
        }
    }
}

在Map中元素添加的顺序和保存的顺序没有必然联系。

关于Map接口常见子类的添加问题

1. Map接口中元素的添加顺序和元素的保存顺序没有必然联系。
不像List,添加顺序和保存顺序一致。即先添加1,再添加2,则1这个元素一定保存在2之前,逻辑连续。

package jcl;
import java.util.*;
public class MapTest {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("及时雨", "宋江");
        map.put("智多星", "吴用");
        map.put("九纹龙", "史进");
        map.put("豹子头", "林冲");
        System.out.println(map.toString());
    }
}

HashMap中保存的元素顺序由hash函数来决定。


由TreeMap中的compareTo方法决定

package jcl;
import java.util.*;
public class MapTest {
    public static void main(String[] args) {
        Map<String, String> map = new TreeMap<>();
        map.put("及时雨", "宋江");
        map.put("智多星", "吴用");
        map.put("九纹龙", "史进");
        map.put("豹子头", "林冲");
        System.out.println(map.toString());
    }
}

要使用TreeMap保存元素,该类必须实现Comparable或传入一个比较器

HashMap不需要实现比较


2. 关于保存null值的说明

HashMap的key和value都能为null,若key为null,有且只有一个。


TreeMap中key不能为null,value可以为null。

Set的基础使用

Set:其实就是披着Set外衣的Map。
是Collection接口的子接口,一次保存一个元素,和List集合最大的区别在于,Set集合保存的元素不能重复
Set:元素不重复,使用Set集合来进行去重处理


boolean add():添加一个元素,若该元素不存在则添加成功,返回true,若该元素已经存在,添加失败,返回false。

boolean contains():判断一个元素o是否在当前set中存在。

boolean remove():在Set集合中删除指定元素o,若该元素不存在,删除失败返回false;否则删除该元素,返回true。

没有提供修改的方法,若需要修改元素,只能先把要修改的元素删除,再添加新元素。

遍历集合使用for- each循环即可

package jcl;
import java.util.HashSet;
import java.util.Set;
public class SetTest {
    public static void main(String[] args) {
        Set<Integer> set = new HashSet();
        System.out.println(set.add(1));
        System.out.println(set.add(1));
        System.out.println(set.add(2));
        System.out.println(set.add(3));
        System.out.println(set.contains(3));
        System.out.println(set.contains(4));
        System.out.println(set.remove(2));
        for (int i : set) {
            System.out.print(i + " ");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瘦皮猴117

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值