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


相关文章
|
3天前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
23 3
|
3月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
81 2
|
20天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
37 5
|
2月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
43 4
|
2月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
37 2
|
2月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
2月前
|
Java 开发者
|
2月前
|
存储 Java API
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
47 1