Java集合框架详述之Map集合

简介: Map与Collection无继承关系,Map集合以Key和Value的方式存储数据。(键值对)

前言


Map接口的层次结构图:


1.png


Map集合概述


Map与Collection无继承关系。

Map集合以Key和Value的方式存储数据。(键值对)

Key和Value是引用数据类型。

Key和Value存储对象的内存地址。


所有Map集合的key特点:无序不可重复的。


Map集合的key和Set集合存储元素特点相同。


Map接口常用的方法:


void clear() 清空集合中的元素

boolean containsKey(Object key) 判断Map中是否包含某个Key

boolean containsValue(Object value) 判断Map中是否包含某个Value

V get(Object key) 通过Key获取Value

boolean isEmpty() 判断Map中元素是否为0

V put(K key, V value) 向集合中添加键值对

V remove(Object key) 通过Key删除键值对

int size() 获取Map集合中的元素个数

Collection<V> values() 获取集合Map中所有的Value,返回一个Collection


下面两个方法用于遍历Map集合:


Set<K> keySet() 获取Map所有的Key

Set<Map.Entry<K,V>> entrySet() 将Map集合转换为Set集合。


示例代码(1):


import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class MapText01 {
    public static void main(String[] args) {
        //创建集合
        Map<Integer,String> map=new HashMap<>();
        // 向集合中添加键值对
        map.put(1,"zhangsan");
        map.put(2,"lisi");
        map.put(3,"wangwu");
        map.put(4,"lili");
        //通过Key获取Value
        String value=map.get(2);
        System.out.println(value);
        // 获取Map集合中的元素个数
        System.out.println("集合中的元素为:"+map.size());
        //删除集合中的元素
        map.remove(3);
        System.out.println("集合中的元素为:"+map.size());
        //判断Map中是否包含某个Key(底层调用equals方法,重写类时重写equals方法)
        System.out.println(map.containsKey(1));
        //判断Map中是否包含某个Value
        System.out.println(map.containsValue("lili"));
        //获取所有Values
        Collection<String> values=map.values();
        for(String s:values){
            System.out.println(s);
        }
        //清空集合
        map.clear();
        System.out.println("集合中的元素为:"+map.size());
        //判断集合是否为空
        System.out.println(map.isEmpty());
    }
}

运行结果:


lisi
集合中的元素为:4
集合中的元素为:3
true
true
zhangsan
lisi
lili
集合中的元素为:0
true


示例代码(2):


遍历Map集合


Set<K> keySet() 获取Map所有的Key


import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapText02 {
    public static void main(String[] args) {
        //第一种方式:Set<K> keySet()  获取Map所有的Key
        Map<Integer,String> map=new HashMap<>();
        map.put(1,"zhangsan");
        map.put(2,"lisi");
        map.put(3,"wangwu");
        map.put(4,"zhaoliu");
        //遍历Map集合
        //获取所有的Key,所有的Key是一个Set集合
        Set<Integer> keys=map.keySet();
/*        //迭代器
        Iterator<Integer> it=keys.iterator();
        while (it.hasNext()){
            //取出其中的一个Key
            Integer key= it.next();
            //通过Key获取Value
            String values=map.get(key);
            System.out.println(key+"="+values);
        }*/
        //foreach
        for (Integer key:keys) {
            System.out.println(key+"="+map.get(key));
        }
    }
}


运行结果:


1=zhangsan
2=lisi
3=wangwu
4=zhaoliu

Set<Map.Entry<K,V>> entrySet() 将Map集合转换为Set集合。


import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapText02 {
    public static void main(String[] args) {
        //第一种方式:Set<K> keySet()  获取Map所有的Key
        Map<Integer,String> map=new HashMap<>();
        map.put(1,"zhangsan");
        map.put(2,"lisi");
        map.put(3,"wangwu");
        map.put(4,"zhaoliu");
        //遍历Map集合
        //第二种方式:Set<Map.Entry<K,V>> entrySet()  将Map集合转换为Set集合。
        Set<Map.Entry<Integer,String>> set=map.entrySet();
        /*//迭代器循环
        Iterator<Map.Entry<Integer,String>> it=set.iterator();
        while (it.hasNext()){
            Map.Entry<Integer,String> node=it.next();
            Integer key=node.getKey();
            String value=node.getValue();
            System.out.println(key+"----------->"+value);
        }*/
        //这个方法效率较高,便于开发大数据量!!
        for (Map.Entry<Integer,String> node:set) {
            System.out.println(node.getKey()+"------->"+node.getValue());
        }
    }
}

运行结果:


1------->zhangsan
2------->lisi
3------->wangwu
4------->zhaoliu


HashMap类:


HashMap底层时哈希表数据结构

-HashMap非线程安全。

放在HashMap集合Key部分的元素其实是放在HashSet中了(须重写hashCode和equals方法)

Java集合框架详述之(Collection,List,Set)


HashMap的Key部分特点:无序,不可重复。

-HashMap初始化容量为16,默认加载因子为0.75


默认加载因子表示/;当HashMap集合底层数组容量到75%时,开始扩容


扩容机制:扩容为原容量的2倍

注:HashMap集合初始化容量必须为2的倍数,因为达到散列均匀,为了提高HashMap集合存取效率。


JDK8之后新特性:

在JDK8之后,如果哈希表单向链表中元素超过8个,单向链表这种数据结构会变成红黑树数据结构。当红黑树上的节点数量小于6时,会重新把红黑树变成单向链表数据结构这种方式也是为了提高检索效率,二叉树的检索会再次缩小扫描范围。提高效率。


HashMap集合的key和value允许null(HashMap的key为null只能有一个)

HashMap与Hashtable区别?

HashTable的 Key和value都不可以为null

HashMap的 Key和value都可以为null

HashTable是线程安全的,使用较少

底层也是哈希表数据结构,初始化容量为11,加载因子为0.75

扩容为:原容量*2+1;


示例代码(3):


import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class HasnMapText01 {
    public static void main(String[] args) {
        Map<Integer,String> map=new HashMap<>();
        map.put(1111,"wangwu");
        map.put(2222,"asdkmnc");
        map.put(3333,"king");
        map.put(4444,"zhaoliu");
        map.put(4444,"lihua");
        System.out.println(map.size());
        //遍历HashMap集合
        Set<Map.Entry<Integer,String>> set= map.entrySet();
        for (Map.Entry<Integer,String> entry:set) {
            System.out.println(entry.getKey()+"-->"+entry.getValue());
        }
    }
}

运行结果:


4
3333-->king
1111-->wangwu
4444-->lihua
2222-->asdkmnc


Properties属性类


继承Hashtable,Key和Value都是String类型

Properties是线程安全的。


Properties两个常用方法:


Object setProperty(String key, String value)存元素

String getProperty(String key) 通过key获取value


示例代码(4):


import java.util.Properties;
public class ProperticesText01 {
    public static void main(String[] args) {
        //创建一个Properties对象
        Properties po = new Properties();
        //存元素
        po.setProperty("king", "wowowowo");
        po.setProperty("xiao", "ma");
        po.setProperty("da", "ma");
        po.setProperty("ximenqing", "www.123.com");
        //通过key获取value
        String king = po.getProperty("king");
        String xiao = po.getProperty("xiao");
        String da = po.getProperty("da");
        String ximenqing = po.getProperty("ximenqing");
        System.out.println(king);
        System.out.println(xiao);
        System.out.println(da);
        System.out.println(ximenqing);
    }
}


运行结果:


wowowowo
ma
ma
www.123.com


TreeMap类


TreeMap底层是二叉树。

无序,不可重复但是可以按照大小顺序进行排序,称为:可排序集合

放到TreeMap集合中的Key部分的元素等同于放到TreeSet集合中


示例代码(5):


import java.util.TreeSet;
public class TreeMapText01 {
    public static void main(String[] args) {
        //
        TreeSet<String> ts=new TreeSet();
        ts.add("zhangsan");
        ts.add("wangwu");
        ts.add("make");
        ts.add("langlang");
        for (String s: ts){
            System.out.println(s);
        }
        System.out.println("=============================");
        TreeSet<Integer> ts2=new TreeSet();
        ts2.add(200);
        ts2.add(300);
        ts2.add(600);
        ts2.add(14);
        for (Integer i:ts2){
            System.out.println(i);
        }
    }
}

运行结果:


langlang
make
wangwu
zhangsan
=============================
14
200
300
600


Collections工具类


常用方法汇总:


static <T> Collection<T> synchronizedCollection(Collection<T> c)

返回由指定集合支持的同步(线程安全)集合。


static <T> List<T> synchronizedList(List<T> list)

返回由指定列表支持的同步(线程安全)列表。


static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)

返回由指定的Map支持的同步(线程安全)Map。


static <T> void sort(List<T> list, Comparator<? super T> c)

根据指定的比较器指定的顺序对指定的列表进行排序。


示例代码(6):


import java.util.*;
public class CollectionsText01 {
    public static void main(String[] args) {
        //线程不安全!!
        List<String> list=new ArrayList();
        //线程安全!!
        Collections.synchronizedList(list);
        //排序
        list.add("abc");
        list.add("abd");
        list.add("abv");
        list.add("abg");
        Collections.sort(list);
        for (String s:list){
            System.out.println(s);
        }
        //对set集合怎样排序?
        Set<String> set=new HashSet<>();
        set.add("wang");
        set.add("zheng");
        set.add("fang");
        //将Set集合转换为List集合!!!
        List<String> mylist=new ArrayList<>(set);
        //调用sort()方法!!
        Collections.sort(mylist);
        for (String s:mylist){
            System.out.println(s);
        }
    }
}


运行结果:


abc
abd
abg
abv
fang
wang
zheng


相关文章
|
2月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
3月前
|
人工智能 Java 开发者
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
JManus是阿里开源的Java版OpenManus,基于Spring AI Alibaba框架,助力Java开发者便捷应用AI技术。支持多Agent框架、网页配置、MCP协议及PLAN-ACT模式,可集成多模型,适配阿里云百炼平台与本地ollama。提供Docker与源码部署方式,具备无限上下文处理能力,适用于复杂AI场景。当前仍在完善模型配置等功能,欢迎参与开源共建。
1505 58
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
|
2月前
|
存储 安全 Java
《数据之美》:Java集合框架全景解析
Java集合框架是数据管理的核心工具,涵盖List、Set、Map等体系,提供丰富接口与实现类,支持高效的数据操作与算法处理。
|
2月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
128 8
|
2月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
93 7
|
4月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
269 23
|
3月前
|
SQL Java 数据库连接
区分iBatis与MyBatis:两个Java数据库框架的比较
总结起来:虽然从技术角度看,iBATIS已经停止更新但仍然可用;然而考虑到长期项目健康度及未来可能需求变化情况下MYBATISS无疑会是一个更佳选择因其具备良好生命周期管理机制同时也因为社区力量背书确保问题修复新特征添加速度快捷有效.
210 12
|
4月前
|
存储 缓存 安全
Java集合框架(三):Map体系与ConcurrentHashMap
本文深入解析Java中Map接口体系及其实现类,包括HashMap、ConcurrentHashMap等的工作原理与线程安全机制。内容涵盖哈希冲突解决、扩容策略、并发优化,以及不同Map实现的适用场景,助你掌握高并发编程核心技巧。
|
4月前
|
安全 Java 开发者
Java集合框架:详解Deque接口的栈操作方法全集
理解和掌握这些方法对于实现像浏览器后退功能这样的栈操作来说至关重要,它们能够帮助开发者编写既高效又稳定的应用程序。此外,在多线程环境中想保证线程安全,可以考虑使用ConcurrentLinkedDeque,它是Deque的线程安全版本,尽管它并未直接实现栈操作的方法,但是Deque的接口方法可以相对应地使用。
248 12
|
4月前
|
存储 安全 Java
Java集合框架(一):List接口及其实现类剖析
本文深入解析Java中List集合的实现原理,涵盖ArrayList的动态数组机制、LinkedList的链表结构、Vector与Stack的线程安全性及其不推荐使用的原因,对比了不同实现的性能与适用场景,帮助开发者根据实际需求选择合适的List实现。