Java 集合-Map接口和三个子类实现
发布日期:2022-04-02 18:15:42 浏览次数:8 分类:博客文章

本文共 5018 字,大约阅读时间需要 16 分钟。

2017-10-31 22:05:59

  • Map

将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

HashMap是基于散列表实现的,插入、删除和定位元素时间复杂度平均能达到O(1)。

TreeMap基于红黑树(一种自平衡二叉查找树)实现的,时间复杂度平均能达到O(log n)。

Map的数据结构针对键值有效和值无关

*常用方法

public static void main(String[] args) {        Map
map = new HashMap
(); //添加元素 //如果键是第一次存储,则返回null //如果键不是第一次了,则替换旧的值,并返回旧的值 map.put("刘亦菲","20"); map.put("章子怡", "22"); map.put("田馥甄", "24"); map.put("陈绮贞","22"); //remove(key),根据键值进行删除,返回值,如果不存在,返回null map.remove("章子怡"); //containsKey() map.containsKey("刘亦菲"); //get(key)根据键得到值,如果没有返回null System.out.println(map.get("刘亦菲")); //keySet(),获取所有键值组成的集合 Set
set = map.keySet(); for(String s:set) { System.out.println(s+" "); } //values,获取所有值组成的集合 Collection
collection= map.values(); for(String s:collection) System.out.println(s); //输出 System.out.println(map); }

Map集合的遍历:

A:首先获得所有的键的集合,通过键的集合来获取值;

B:直接获得键值对的集合

public class MapDemo2 {    public static void main(String[] args) {        Map
map = new HashMap
(); //添加元素 //如果键是第一次存储,则返回null //如果键不是第一次了,则替换旧的值,并返回旧的值 map.put("刘亦菲","20"); map.put("章子怡", "22"); map.put("田馥甄", "24"); map.put("陈绮贞","22"); //遍历方法1:通过键来找值 Set
set= map.keySet(); for(String s:set) { String value= map.get(s); System.out.println(s+"="+value); } //遍历方法2:直接得到键值对的集合 Set
> set2 = map.entrySet(); for(Map.Entry
m:set2){ System.out.println(m.getKey()+"="+m.getValue()); } }}

Map的三个子类实现:

          HashMap

          LinkedHashMap

          TreeMap

~ HashMap

HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

注意,此实现不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。

注意:HashMap底层依赖hashcode和equals,在键值为对象的时候需要重写这两个方法,这两个方法都可以通过右键直接生成。

*构造方法

*常用方法

public class MapDemo2 {    public static void main(String[] args) {        HashMap
map = new HashMap
(); //添加元素 //如果键是第一次存储,则返回null //如果键不是第一次了,则替换旧的值,并返回旧的值 map.put("刘亦菲","20"); map.put("章子怡", "22"); map.put("田馥甄", "24"); map.put("陈绮贞","22"); //遍历方法1:通过键来找值 Set
set= map.keySet(); for(String s:set) { String value= map.get(s); System.out.println(s+"="+value); } //遍历方法2:直接得到键值对的集合 Set
> set2 = map.entrySet(); for(Map.Entry
m:set2){ System.out.println(m.getKey()+"="+m.getValue()); } }}

 

~ LinkedHashMap

LinkedHashMap:是Map接口的哈系表和链表的实现,具有可预知的迭代顺序。

用法和HashMap完全一致。

public class MapDemo2 {    public static void main(String[] args) {        LinkedHashMap
map = new LinkedHashMap
(); //添加元素 //如果键是第一次存储,则返回null //如果键不是第一次了,则替换旧的值,并返回旧的值 map.put("刘亦菲","20"); map.put("章子怡", "22"); map.put("田馥甄", "24"); map.put("陈绮贞","22"); //遍历方法1:通过键来找值 Set
set= map.keySet(); for(String s:set) { String value= map.get(s); System.out.println(s+"="+value); } //遍历方法2:直接得到键值对的集合 Set
> set2 = map.entrySet(); for(Map.Entry
m:set2){ System.out.println(m.getKey()+"="+m.getValue()); } }}

 

~ TreeMap

TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。

此实现为 containsKeygetputremove 操作提供受保证的 log(n) 时间开销。这些算法是 Cormen、Leiserson 和 Rivest 的 Introduction to Algorithms 中的算法的改编。

注意,此实现不是同步的。如果多个线程同时访问一个映射,并且其中至少一个线程从结构上修改了该映射,则其必须 外部同步。

注意:类为键值的话需要注意,如果是无参构造,则类需要实现Comparable接口;或者使用带比较器的构造方法。

public class Demo3 {    public static void main(String[] args) {        TreeMap
treeMap = new TreeMap<>(new Comparator
() { @Override public int compare(Student o1, Student o2) { // 主要条件,这样的话是递增排序 int num = o1.getAge() - o2.getAge(); // 次要条件 int num2 = num==0?o1.getName().compareTo(o2.getName()):num; return num2; } }); Student s1 = new Student("刘亦菲", 29); Student s2 = new Student("章子怡", 25); Student s3 = new Student("刘亦菲", 28); treeMap.put(s1,"01"); treeMap.put(s2,"02"); treeMap.put(s3,"03"); Set
set= treeMap.keySet(); for(Student s:set) { String value= treeMap.get(s); System.out.println(s+"="+value); } }}

 

~ Hashtable 和 HashMap 的区别

Hashtable:线程安全,效率低。不允许null键和null值;(显然这养的命名是不规范的,但是由于其出现太早,改的话很不方便,于是就没有修改)

HashMap:线程不安全,效率高。允许null键和null值;(是用来替代Hashtable的)

 

转载地址:https://www.cnblogs.com/hyserendipity/p/7764017.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java 常用对象-Math类
下一篇:Java 常用对象-Object类

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月04日 15时04分06秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Sharding-Sphere,Sharding-JDBC_介绍_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记001 2019-04-26
Sharding-Sphere,Sharding-JDBC_分库分表介绍_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记002 2019-04-26
C++_类和对象_对象特性_构造函数的分类以及调用---C++语言工作笔记041 2019-04-26
C++_类和对象_对象特性_拷贝构造函数调用时机---C++语言工作笔记042 2019-04-26
C++_类和对象_对象特性_构造函数调用规则---C++语言工作笔记043 2019-04-26
C++_类和对象_对象特性_深拷贝与浅拷贝---C++语言工作笔记044 2019-04-26
AndroidStudio_java.util.ConcurrentModificationException---Android原生开发工作笔记237 2019-04-26
AndroidStudio_android中实现对properties文件的读写操作_不把properties文件放在assets文件夹中_支持读写---Android原生开发工作笔记238 2019-04-26
弹框没反应使用Looper解决_the caller should invoke Looper.prepare() and Looper.loop()---Android原生开发工作笔记239 2019-04-26
Command line is too long. Shorten command line for Application---微服务升级_SpringCloud Alibaba工作笔记0067 2019-04-26
AndroidStudio_android实现双击_3击_监听实现---Android原生开发工作笔记240 2019-04-26
C++_类和对象_对象特性_初始化列表---C++语言工作笔记045 2019-04-26
C++_类和对象_对象特性_静态成员函数---C++语言工作笔记047 2019-04-26
AndroidStudio安卓原生开发_SwipeRefreshLayout_下拉刷新控件---Android原生开发工作笔记119 2019-04-26
AndroidStudio安卓原生开发_UI高级_DrawerLayout_侧滑菜单控件---Android原生开发工作笔记120 2019-04-26
AndroidStudio安卓原生开发_UI高级_Shape的使用_虚线_直线_矩形_渐变_径向渐变_线性渐变_扫描渐变---Android原生开发工作笔记122 2019-04-26
AndroidStudio安卓原生开发_UI高级_StateListDrawable状态选择器_按钮按下和抬起显示不同颜色---Android原生开发工作笔记124 2019-04-26
AndroidStudio_你的主机中的软件中止了一个已建立的连接---Android原生开发工作笔记123 2019-04-26
AndroidStudio安卓原生开发_UI高级_自定义主题和样式---Android原生开发工作笔记129 2019-04-26
AndroidStudio安卓原生开发_Activity和AppCompatActivity的区别认识---Android原生开发工作笔记127 2019-04-26