HashMap、TreeMap、Hashable和LinkedHashMap
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相关推荐
- Java(ArrayList和LinkedList)、(HashTable与HashMap)、(HashMap、Hashtable、LinkedHashMap和TreeMap比较)
1.ArrayList和LinkedList (1)ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. (2)对于随机访问get和set,ArrayList绝 ...
- HashMap常见键、LinkedHashMap以及TreeMap的理解
HashMap四种常见的键的类型: HashMap<String,String>.HashMap<Integer,String>.HashMap<String,Stude ...
- JAVA复习5(集合——集合的遍历 Iteratorforeach、Enumeration——HashMap、HashTable、LinkedHashMap——map的遍历)
集合的遍历 Iterator foreach 掌握 Enumeration List Set 观察两个接口 迭代器输出 Iterator Set接口 或者 List 接口 都存在 ...
- Java Collection系列之HashMap、ConcurrentHashMap、LinkedHashMap的使用及源码分析
文章目录 HashMap HashMap的存储结构 初始化 put & get put元素 get元素 扩容 遍历Map jdk1.8中的优化 ConcurrentHashMap jdk1.7 ...
- Map集合HashMap TreeMap的输出方法
Map集合HashMap TreeMap的输出方法 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51934301 ...
- HashMap TreeMap专题
刷leetcode的时候,经常性碰到需要使用HashMap或者TreeMap的场景,今天来总结一些它们的用法: TreeMap public class MapCase {public static ...
- Java之HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap简单的区别
一. HashMap 1)底层实现 数组+链表+红黑树(在JDK1.8中如果链表长度大于8的时候才转换为红黑树) 2)是否线程安全 不支持线程的同步,线程不安全,如需同步,可用Collections ...
- Map集合(HashMap,TreeMap)
Map 总想赢者必输,不怕输者必赢 首先对Map进行一个整体的理解. 查看API可以知道,Map 其实就是将键映射到值的对象,每个键最多映射到一个值. Map 与Collection接口的不同: Ma ...
- Map,HashMap,TreeMap
1. Map Map接口中,键和值一一映射,可以通过键来获取值. 在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做val ...
最新文章
- Linux命令学习手册-tr命令 2015-07-26 20:35 9人阅读 评论(0) 收藏...
- 3D开发-AR技术基础
- matlab 限幅,限幅是什么意思
- 微信开发者工具不显示二维码问题
- 28. PHP 文件上传
- 微信公众号,微信授权进不去
- 如何:使用 DataAnnotations 特性验证模型数据+MetadataType的使用,MVC的Model层数据验证 指定要与数据模型类关联的元数据类
- 【C/C++】为什么INT_MAX(整形最大值)减去INT_MIN(整形最小值)等于-1
- vue图片懒加载插件vue-lazyload监听加载失败事件的解决方案
- How to Reassign Workflow Task in Sharepoint 2007
- Gitlab修改文件上传10M大小限制
- 单片机cant通讯 c语言,基于C8051F040单片机的CAN总线通信
- ph1 android p,ph1(安卓之父ph1参数)
- 计算机音频接口,一台计算机的两个音频输出
- 关于CC的完全非线性椭圆方程一书的一些小结
- 送书 | 《从零开始学Selenium自动化测试》
- surface go升级win11
- 嵌入式ARM64 Linux内核FIT uimage方式启动
- xp局域网内共享设置
- 第一章 Windows 2000对调试技术的支持
热门文章
- redis性能测试报告
- 细说angular Form addControl方法
- docker 删除默认连接_Net Core 中 Docker应用
- python入门教程完整版(懂中文就能学会)-Python入门教程完整版(懂中文就能学会)...
- python基础代码事例-菜鸟世界 -python基础---set
- python从入门到精通书-100G Python从入门到精通全套资料!
- 自学python需要买书吗-学习Python的正确姿势—基础教学,教科书该怎么买?
- python难不难学-超级适合新手学习的python教程,入门其实不难?
- 开课吧python课程-开课吧Python课程亮相胡海泉抖音直播间
- python编程小学生学好吗-连小学生都在学的Python,究竟就业方向有哪些?