写点什么

Java 基础:集合框架之 Map

  • 2022 年 6 月 23 日
  • 本文字数:4563 字

    阅读完需:约 15 分钟

前言

Map 接口的层次结构图:

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集合中的元素为:3truetruezhangsanlisilili集合中的元素为:0true
复制代码


示例代码(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=zhangsan2=lisi3=wangwu4=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------->zhangsan2------->lisi3------->wangwu4------->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 都不可以为 nullHashMap 的 Key 和 value 都可以为 nullHashTable 是线程安全的,使用较少底层也是哈希表数据结构,初始化容量为 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()); } }}
复制代码


运行结果:


43333-->king1111-->wangwu4444-->lihua2222-->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); }}
复制代码


运行结果:


wowowowomamawww.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); } }}
复制代码


运行结果:


langlangmakewangwuzhangsan=============================14200300600
复制代码

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); } }}
复制代码


运行结果:


abcabdabgabvfangwangzheng
复制代码


发布于: 刚刚阅读数: 4
用户头像

该来的总会来,或迟或早。🎈 2022.06.13 加入

有JAVA方面3年学习经验,csdn/51cto等平台优质作者,华为云云享专家、阿里云受邀专家博主,擅长JAVA,大数据等方面的技术等。

评论

发布
暂无评论
Java基础:集合框架之Map_map_百思不得小赵_InfoQ写作社区