1.Map概览
Java SE中有四种常见的Map实现——HashMap,TreeMap,Hashtable,LinkedHashMap。如果我们使用一句话来概括它们的特点,就是:
HashMap就是一张hash表,键和值都没有排序。
TreeMap以红-黑树结构为基础,键值按顺序排序
LinkedHashMap保存了插入时的顺序。
Hashtable是同步的(而HashMap是不同步的)。所以如果在线程安全的环境下应该多使用
HashMap,而不是hashtable,因为Hashtable对线程的同步有额外的开销
2.HashMap
如果HashMap的键(key)是自定义的对象,那么需要按规则定义它的equals()和hashCode()方法
public class TestHashMap {
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);
System.out.println(hashMap.size());
for(Map.Entry<Dog,Integer> entry:hashMap.entrySet()){
System.out.println(entry.getKey().toString() + " - "
+ entry.getValue());
}
}
}
class Dog{
String color;
Dog(String c){
color=c;
}
public String toString(){
return color+" dog";
}
}
输出:
4
white dog - 5
black dog - 15
red dog - 10
white dog - 20
注意,我们错误的将"white dogs"添加了两次,但是HashMap却接受了两只" white dogs"。这不合理(因为HashMap的键不应该重复),我们会搞不清楚真正有多少白色的存在。Dog类应该定义如下:
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";
}
}
现在输出结果如下:
3
red dog - 10
white dog - 20
black dog - 15
输出结果如上是因为HashMap不允许有两个相等的元素存在。默认情况下(也就是类没有实现hashCode()和equals()方法时),会使用Object类中的这两个方法。Object类中的hashCode()对于不同的对象会返回不同的整数,而只有两个引用指向的同样的对象时equals()才会返回true。
3. TreeMap
TreeMap的键按顺序排序。让我们先看个例子看看什么叫作"键按顺序排列"
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 TestTreeMap {
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: collection.Dog cannot
be cast to java.lang.Comparable
at java.util.TreeMap.put(Unknown Source)
at collection.TestHashMap.main(TestHashMap.java:35)
因为TreeMap按照键的顺序进行排列对象,所以键的对象之间需要能够比较,所以就要实现
Comparable接口。你可以使用String作为键,String已经实现了Comparable接口。
class Dog implements Comparable<Dog>{
String color;
int size;
Dog(String c, int s) {
color = c;
size = s;
}
public String toString(){
return color + " dog";
}
@Override
public int compareTo(Dog o) {
return o.size - this.size;
}
}
public class TestTreeMap {
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
结果根据键的排列顺序进行输出,在我们的例子中根据size排序的。
如果我们将“Dog d4 = new Dog(“white”, 10);”替换成“Dog d4 = new
Dog(“white”, 40);”,那么输出会变成:
white dog - 20
red dog - 10
black dog - 15
white dog - 5
这是因为TreeMap使用compareTo()方法来比较键值的大小,size不相等的狗是不同的狗。
4. Hashtable
Java文档写到:
HashMap类和Hashtable类几乎相同,不同之处在于HashMap是不同步的,也不允许接受null键和null值。
5. LinkedHashMap
LinkedHashMap is a subclass of HashMap. That means it inherits the features of HashMap. In addition, the linked list preserves the insertion-order.
Let’s replace the HashMap with LinkedHashMap using the same code used for HashMap.
LinkedHashMap是HashMap的子类,所以LinkedHashMap继承了HashMap的一些属性,他在HashMap基础上增加的特性就是保存了插入对象的顺序。
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 TestHashMap {
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
white dog - 20
black dog - 15
分享到:
相关推荐
HashMap, HashTable, LinkedHashMap, TreeMap 的区别 在 Java 中,Map 是一个非常重要的集合类,用于存储键值对。其中,HashMap, HashTable, LinkedHashMap, TreeMap 是四种常用的 Map 实现类,每种类都有其特点和...
### Java中HashMap, LinkedHashMap, TreeMap,HashTable的区别 在Java编程语言中,`Map`接口是集合框架中的一个重要组成部分,用于存储键值对。本文将详细分析四种常用的`Map`实现类:`HashMap`, `LinkedHashMap`, ...
Map接口用于保存具有key-value映射关系的数据,常见的Map实现包括HashMap、TreeMap、HashTable和LinkedHashMap等。Queue是Java提供的队列实现。 本文总结了HashMap和HashTable的源码学习和面试总结,涵盖了它们的...
在Java编程语言中,`HashMap`、`TreeMap`和`LinkedHashMap`都是`java.util.Map`接口的实现,它们提供了不同的数据存储和访问策略。本文将深入探讨这三种数据结构的特点、工作原理以及适用场景。 1. **HashMap** `...
HashMap是最常用的Map实现,它提供了快速的查找,但不保证元素的顺序,且允许null键和值。TreeMap则按Key的自然排序或自定义排序存储元素,适合需要排序的场景。HashTable是线程安全的,但效率相对较低,不推荐在单...
了解Map的整体结构也很重要,HashMap和其他Map实现如LinkedHashMap(保持插入顺序或访问顺序的HashMap)都是从AbstractMap继承,而Hashtable则直接继承Dictionary类,这反映了它们设计上的差异和适用场景的不同。...
本文将详细介绍HashMap的底层原理,包括其内部实现结构、关键字段的作用、以及JDK 1.7和JDK 1.8版本的主要区别。 首先,HashMap是基于哈希表的Map接口非同步实现,它允许使用null值和null键,这意味着HashMap在设计...
- Map接口代表键值对容器,常见实现类有HashMap、Hashtable、LinkedHashMap和TreeMap。 - 自定义数据结构通常涉及实现以上接口或抽象类,以满足特定需求。 理解并熟练掌握这些基础概念,对于成为一名合格的Java...
4. HashMap和TreeMap的区别: - TreeMap实现了SortedMap接口,基于红黑树,而HashMap基于哈希散列表实现。 - TreeMap插入、删除速度慢,因为需要维护树的平衡。 - TreeMap默认按键的升序排序,而HashMap是随机存储。...
3. **Map**:键值对的集合,如 HashMap、HashTable、LinkedHashMap、TreeMap 和 ConcurrentHashMap。 **HashMap 和 Hashtable 的区别**: - **线程安全性**:Hashtable 是线程安全的,而 HashMap 不是。在多线程...
Map 的实现类有:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap 等。 ArrayList 是一个基于数组的集合类,Vector 是一个同步的 ArrayList,LinkedList 是一个基于链表的集合类。HashSet 是一个...
主要实现类包括HashMap、Hashtable、LinkedHashMap和TreeMap。 1. HashMap:它利用键的hashCode值存储数据,根据键快速定位到值。由于使用了哈希表的存储方式,HashMap通常能够提供较快的读写性能。它的遍历顺序是...
Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。 TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据创建映射...
5. Map:存储键值对的接口,如HashMap、TreeMap和LinkedHashMap。 6. SortedMap:继承自Map,键按特定顺序排列,如TreeMap。 Iterator是遍历集合的基本工具,可以用于所有实现Collection接口的类。它提供next()方法...
- Map:键值对容器,键唯一,值可重复,如HashMap、TreeMap、HashTable、LinkedHashMap和ConcurrentHashMap。 7. **底层数据结构**: - ArrayList和Vector基于Object数组实现。 - LinkedList是双向循环链表。 -...
- 主要实现类包括HashMap、Hashtable、LinkedHashMap、Properties和TreeMap。 - HashMap是基于哈希表的,插入和查询速度快,但不保证键的顺序。 - Hashtable与HashMap类似,但它是线程安全的,不允许null键和值。...
Hashtable TreeMap LinkedHashMap 我们主要来说说最常用的HashMap: 添加元素:put(key,value) HashMap map = new HashMap<>(); map.put("name", "大妖怪"); map.put("age", "100"); 复制代码 查询元素:get(key...
六、HashMap 和 HashTable 的区别 * HashMap 和 HashTable 都实现了 Map 接口。 * HashMap 可以接受为 null 的 key 和 value,key 为 null 的键值对放在下标为 0 的头结点的链表中,而 Hashtable 则不行。 * ...
在Java编程语言中,`HashMap`、`TreeMap`和`Hashtable`是三种常见的集合类,它们都实现了`Map`接口,用于存储键值对数据。理解这些类的区别和应用场景对于提升Java开发技能至关重要。 首先,`HashMap`是Java中最...