Map是最重要的数据结构之一。开始会告诉怎么用HashMap、TreeMap、Hashtable和LinkedHashMap

1、Map概述

在Java SE中有4种Map的实现:HashMap、TreeMap、Hashtable和LinkedHashMap.

HashMap:用哈希表实现,键和值无序

TreeMap:用红黑树实现,键是有序的

LinkedHashMap:维护插入顺序

Hashtable:与HashMap比较是同步

2、HashMap

HashMap的键是自定对象,equals()和hashCode()需要实现

import java.util.HashMap;
import java.util.Map.Entry;class Dog {String color;Dog(String c) {color = c;}public String toString(){ return color + " dog";}
}public class Main {public static void main(String[] args) {HashMap<Dog, Integer> hashMap = new HashMap<Dog, Integer>();Dog d1 = new Dog("red");Dog d2 = new Dog("black");Dog d3 = new Dog("white");Dog d4 = new Dog("white");hashMap.put(d1, 10);hashMap.put(d2, 15);hashMap.put(d3, 5);hashMap.put(d4, 20);//print sizeSystem.out.println(hashMap.size());//loop HashMapfor (Entry<Dog, Integer> entry : hashMap.entrySet()) {System.out.println(entry.getKey().toString() + " - " + entry.getValue());}}
}

输出为:

4
red dog - 10
black dog - 15
white dog - 20
white dog - 5

注意到,添加两次white dogs,但是HashMap仍然加进去了。这样没有意义,因为现在容易混淆真正的有多少white dogs

import java.util.HashMap;
import java.util.Map.Entry;class Dog {String color;Dog(String c) {color = c;}public String toString(){ return color + " dog";}public boolean equals(Object o){return ((Dog)o).color == this.color;}public int hashCode(){return color.length();}
}public class Main {public static void main(String[] args) {HashMap<Dog, Integer> hashMap = new HashMap<Dog, Integer>();Dog d1 = new Dog("red");Dog d2 = new Dog("black");Dog d3 = new Dog("white");Dog d4 = new Dog("white");hashMap.put(d1, 10);hashMap.put(d2, 15);hashMap.put(d3, 5);hashMap.put(d4, 20);//print sizeSystem.out.println(hashMap.size());//loop HashMapfor (Entry<Dog, Integer> entry : hashMap.entrySet()) {System.out.println(entry.getKey().toString() + " - " + entry.getValue());}}
}

输出为:

3
red dog - 10
white dog - 20
black dog - 15

原因是HashMap不允许有同一的元素。默认情况下,hashCode()和equals()是用的超类Object的方法。默认的hashCode()方法是对不同的对象赋一个不同的值。equals()是如果两个引用指向的是同一个对象就认为是相等,返回true

3、TreeMap

TreeMap是根据键排序的。

import java.util.TreeMap;
import java.util.Map.Entry;class Dog {String color;Dog(String c) {color = c;}public boolean equals(Object o) {return ((Dog) o).color == this.color;}public int hashCode() {return color.length();}public String toString(){  return color + " dog";}
}public class Main {public static void main(String[] args) {Dog d1 = new Dog("red");Dog d2 = new Dog("black");Dog d3 = new Dog("white");Dog d4 = new Dog("white");TreeMap<Dog, Integer> treeMap = new TreeMap<Dog, Integer>();treeMap.put(d1, 10);treeMap.put(d2, 15);treeMap.put(d3, 5);treeMap.put(d4, 20);for (Entry<Dog, Integer> entry : treeMap.entrySet()) {System.out.println(entry.getKey() + " - " + entry.getValue());}}
}

输出为:

Exception in thread "main" java.lang.ClassCastException: Dog cannot be cast to java.lang.Comparableat java.util.TreeMap.put(Unknown Source)at Main.main(Main.java:31)

因为TreeMap是键排序的,键对象必须是可比较的。也是为什么要实现Comparable接口。

import java.util.TreeMap;
import java.util.Map.Entry;class Dog implements Comparable<Dog>{String color;int size;Dog(String c, int s) {color = c;size = s;}public String toString(){   return color + " dog";}public boolean equals(Object o) {return ((Dog) o).color == this.color;}public int compareTo(Dog b){return b.size - this.size;}
}public class Main {public static void main(String[] args) {Dog d1 = new Dog("red", 30);Dog d2 = new Dog("black", 20);Dog d3 = new Dog("white", 10);Dog d4 = new Dog("white", 10);TreeMap<Dog, Integer> treeMap = new TreeMap<Dog, Integer>();treeMap.put(d1, 10);treeMap.put(d2, 15);treeMap.put(d3, 5);treeMap.put(d4, 20);for (Entry<Dog, Integer> entry : treeMap.entrySet()) {System.out.println(entry.getKey() + " - " + entry.getValue());}}
}

输出为:

red dog - 10
black dog - 15
white dog - 20

4、Hashtable

HashMap与Hashtable相当一致,除了异步和允许null

5、LinkedHashMap

LinkedHashMap是HashMap的子类,意味着继承了HashMap的特征。另外,维持了插入的顺序

import java.util.TreeMap;
import java.util.Map.Entry;
import java.util.LinkedHashMap;class Dog {String color;Dog(String c) {color = c;}public boolean equals(Object o) {return ((Dog) o).color == this.color;}public int hashCode() {return color.length();}public String toString(){  return color + " dog";}
}public class Main {public static void main(String[] args) {Dog d1 = new Dog("red");Dog d2 = new Dog("black");Dog d3 = new Dog("white");Dog d4 = new Dog("white");LinkedHashMap<Dog, Integer> linkedHashMap = new LinkedHashMap<Dog, Integer>();linkedHashMap.put(d1, 10);linkedHashMap.put(d2, 15);linkedHashMap.put(d3, 5);linkedHashMap.put(d4, 20);for (Entry<Dog, Integer> entry : linkedHashMap.entrySet()) {System.out.println(entry.getKey() + " - " + entry.getValue());}       }
}

输出为:

red dog - 10
black dog - 15
white dog - 20


HashMap、TreeMap、Hashable和LinkedHashMap相关推荐

  1. Java(ArrayList和LinkedList)、(HashTable与HashMap)、(HashMap、Hashtable、LinkedHashMap和TreeMap比较)

    1.ArrayList和LinkedList (1)ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.  (2)对于随机访问get和set,ArrayList绝 ...

  2. HashMap常见键、LinkedHashMap以及TreeMap的理解

    HashMap四种常见的键的类型: HashMap<String,String>.HashMap<Integer,String>.HashMap<String,Stude ...

  3. JAVA复习5(集合——集合的遍历 Iteratorforeach、Enumeration——HashMap、HashTable、LinkedHashMap——map的遍历)

    集合的遍历 Iterator   foreach  掌握   Enumeration List    Set    观察两个接口 迭代器输出 Iterator Set接口 或者 List 接口 都存在 ...

  4. Java Collection系列之HashMap、ConcurrentHashMap、LinkedHashMap的使用及源码分析

    文章目录 HashMap HashMap的存储结构 初始化 put & get put元素 get元素 扩容 遍历Map jdk1.8中的优化 ConcurrentHashMap jdk1.7 ...

  5. Map集合HashMap TreeMap的输出方法

    Map集合HashMap TreeMap的输出方法     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51934301 ...

  6. HashMap TreeMap专题

    刷leetcode的时候,经常性碰到需要使用HashMap或者TreeMap的场景,今天来总结一些它们的用法: TreeMap public class MapCase {public static ...

  7. Java之HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap简单的区别

    一. HashMap 1)底层实现  数组+链表+红黑树(在JDK1.8中如果链表长度大于8的时候才转换为红黑树) 2)是否线程安全 不支持线程的同步,线程不安全,如需同步,可用Collections ...

  8. Map集合(HashMap,TreeMap)

    Map 总想赢者必输,不怕输者必赢 首先对Map进行一个整体的理解. 查看API可以知道,Map 其实就是将键映射到值的对象,每个键最多映射到一个值. Map 与Collection接口的不同: Ma ...

  9. Map,HashMap,TreeMap

    1. Map Map接口中,键和值一一映射,可以通过键来获取值. 在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做val ...

最新文章

  1. Linux命令学习手册-tr命令 2015-07-26 20:35 9人阅读 评论(0) 收藏...
  2. 3D开发-AR技术基础
  3. matlab 限幅,限幅是什么意思
  4. 微信开发者工具不显示二维码问题
  5. 28. PHP 文件上传
  6. 微信公众号,微信授权进不去
  7. 如何:使用 DataAnnotations 特性验证模型数据+MetadataType的使用,MVC的Model层数据验证 指定要与数据模型类关联的元数据类
  8. 【C/C++】为什么INT_MAX(整形最大值)减去INT_MIN(整形最小值)等于-1
  9. vue图片懒加载插件vue-lazyload监听加载失败事件的解决方案
  10. How to Reassign Workflow Task in Sharepoint 2007
  11. Gitlab修改文件上传10M大小限制
  12. 单片机cant通讯 c语言,基于C8051F040单片机的CAN总线通信
  13. ph1 android p,ph1(安卓之父ph1参数)
  14. 计算机音频接口,一台计算机的两个音频输出
  15. 关于CC的完全非线性椭圆方程一书的一些小结
  16. 送书 | 《从零开始学Selenium自动化测试》
  17. surface go升级win11
  18. 嵌入式ARM64 Linux内核FIT uimage方式启动
  19. xp局域网内共享设置
  20. 第一章 Windows 2000对调试技术的支持

热门文章

  1. redis性能测试报告
  2. 细说angular Form addControl方法
  3. docker 删除默认连接_Net Core 中 Docker应用
  4. python入门教程完整版(懂中文就能学会)-Python入门教程完整版(懂中文就能学会)...
  5. python基础代码事例-菜鸟世界 -python基础---set
  6. python从入门到精通书-100G Python从入门到精通全套资料!
  7. 自学python需要买书吗-学习Python的正确姿势—基础教学,教科书该怎么买?
  8. python难不难学-超级适合新手学习的python教程,入门其实不难?
  9. 开课吧python课程-开课吧Python课程亮相胡海泉抖音直播间
  10. python编程小学生学好吗-连小学生都在学的Python,究竟就业方向有哪些?