Java集合框架详述之Map集合

有时候,不是因为你没有能力,也不是因为你缺少勇气,只是因为你付出的努力还太少,所以,成功便不会走向你。而你所需要做的,就是坚定你的梦想,你的目标,你的未来,然后以不达目的誓不罢休的那股劲,去付出你的努力,成功就会慢慢向你靠近。

导读:本篇文章讲解 Java集合框架详述之Map集合,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

推荐阅读:
Java集合框架详述之(Collection,List,Set)
十三、Java异常处理机制详解(建议收藏保存)。
先不要知道它是为什么,得先知道它能干什么!!!!!

前言

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
集合中的元素为: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

一起加油,一起努力,一起秃见成效!!
今天的分享就到这里啦!!~感谢大家的观看,希望对大家有帮助的话麻烦给个丝滑三连击。(点赞+转发+关注)

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/144933.html

(0)

相关推荐

  • C#(Csharp)笔记十一——C#循环

    导读:本篇文章讲解 C#(Csharp)笔记十一——C#循环,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    技术随笔 2023年2月15日
    00
  • boost 之计算机的时间-chrono

    追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

    导读:本篇文章讲解 boost 之计算机的时间-chrono,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

    技术随笔 2023年4月2日
    00
  • Linux学习之网络相关命令

    勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

    导读:本篇文章讲解 Linux学习之网络相关命令,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

    技术随笔 2023年5月8日
    00
  • php学习笔记-代码基本语法-day01

    导读:本篇文章讲解 php学习笔记-代码基本语法-day01,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    技术随笔 2023年1月30日
    00
  • 逆置链表(python)

    导读:本篇文章讲解 逆置链表(python),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    技术随笔 2023年2月2日
    00
  • nodejs使用初体验

    导读:本篇文章讲解 nodejs使用初体验,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    技术随笔 2023年1月30日
    00
  • Python利用openpyxl处理excel文件

    导读:本篇文章讲解 Python利用openpyxl处理excel文件,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    技术随笔 2023年1月15日
    00
  • 【二】ElasticSearch核心概念 与 IK 分词器

    导读:本篇文章讲解 【二】ElasticSearch核心概念 与 IK 分词器,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    技术随笔 2023年1月6日
    00
  • 零基础学JavaWeb开发(八)之 UDP协议和TCP协议

    导读:本篇文章讲解 零基础学JavaWeb开发(八)之 UDP协议和TCP协议,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    技术随笔 2023年2月18日
    00
  • 我们在操作复杂的查询语句时,经常使用的一些语句

    导读:本篇文章讲解 我们在操作复杂的查询语句时,经常使用的一些语句,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

    技术随笔 2023年2月12日
    00

发表回复

登录后才能评论