`
zhanggeng22
  • 浏览: 4375 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

HashMap,TreeMap,HashTable和LinkedHashMap的区别

阅读更多
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的区别

    HashMap, HashTable, LinkedHashMap, TreeMap 的区别 在 Java 中,Map 是一个非常重要的集合类,用于存储键值对。其中,HashMap, HashTable, LinkedHashMap, TreeMap 是四种常用的 Map 实现类,每种类都有其特点和...

    java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    ### Java中HashMap, LinkedHashMap, TreeMap,HashTable的区别 在Java编程语言中,`Map`接口是集合框架中的一个重要组成部分,用于存储键值对。本文将详细分析四种常用的`Map`实现类:`HashMap`, `LinkedHashMap`, ...

    Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结

    Map接口用于保存具有key-value映射关系的数据,常见的Map实现包括HashMap、TreeMap、HashTable和LinkedHashMap等。Queue是Java提供的队列实现。 本文总结了HashMap和HashTable的源码学习和面试总结,涵盖了它们的...

    java HashMap,TreeMap与LinkedHashMap的详解

    在Java编程语言中,`HashMap`、`TreeMap`和`LinkedHashMap`都是`java.util.Map`接口的实现,它们提供了不同的数据存储和访问策略。本文将深入探讨这三种数据结构的特点、工作原理以及适用场景。 1. **HashMap** `...

    HashMap vs TreeMap vs Hashtable vs LinkedHashMap

    HashMap是最常用的Map实现,它提供了快速的查找,但不保证元素的顺序,且允许null键和值。TreeMap则按Key的自然排序或自定义排序存储元素,适合需要排序的场景。HashTable是线程安全的,但效率相对较低,不推荐在单...

    第9讲 对比Hashtable、HashMap、TreeMap有什么不同?1

    了解Map的整体结构也很重要,HashMap和其他Map实现如LinkedHashMap(保持插入顺序或访问顺序的HashMap)都是从AbstractMap继承,而Hashtable则直接继承Dictionary类,这反映了它们设计上的差异和适用场景的不同。...

    HashMap底层原理.pdf

    本文将详细介绍HashMap的底层原理,包括其内部实现结构、关键字段的作用、以及JDK 1.7和JDK 1.8版本的主要区别。 首先,HashMap是基于哈希表的Map接口非同步实现,它允许使用null值和null键,这意味着HashMap在设计...

    java软件工程师基础

    - Map接口代表键值对容器,常见实现类有HashMap、Hashtable、LinkedHashMap和TreeMap。 - 自定义数据结构通常涉及实现以上接口或抽象类,以满足特定需求。 理解并熟练掌握这些基础概念,对于成为一名合格的Java...

    java面试笔记.pdf

    4. HashMap和TreeMap的区别: - TreeMap实现了SortedMap接口,基于红黑树,而HashMap基于哈希散列表实现。 - TreeMap插入、删除速度慢,因为需要维护树的平衡。 - TreeMap默认按键的升序排序,而HashMap是随机存储。...

    Java 最常见的 208 道面试题:第二模块答案

    3. **Map**:键值对的集合,如 HashMap、HashTable、LinkedHashMap、TreeMap 和 ConcurrentHashMap。 **HashMap 和 Hashtable 的区别**: - **线程安全性**:Hashtable 是线程安全的,而 HashMap 不是。在多线程...

    Java 72 道面试题及答案.docx

    Map 的实现类有:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap 等。 ArrayList 是一个基于数组的集合类,Vector 是一个同步的 ArrayList,LinkedList 是一个基于链表的集合类。HashSet 是一个...

    Java集合框架详解

    主要实现类包括HashMap、Hashtable、LinkedHashMap和TreeMap。 1. HashMap:它利用键的hashCode值存储数据,根据键快速定位到值。由于使用了哈希表的存储方式,HashMap通常能够提供较快的读写性能。它的遍历顺序是...

    Android 对Map按key和value分别排序的实例

    Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。 TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据创建映射...

    最新Java程序员面试题

    5. Map:存储键值对的接口,如HashMap、TreeMap和LinkedHashMap。 6. SortedMap:继承自Map,键按特定顺序排列,如TreeMap。 Iterator是遍历集合的基本工具,可以用于所有实现Collection接口的类。它提供next()方法...

    Java 72道面试题和答案.docx

    - Map:键值对容器,键唯一,值可重复,如HashMap、TreeMap、HashTable、LinkedHashMap和ConcurrentHashMap。 7. **底层数据结构**: - ArrayList和Vector基于Object数组实现。 - LinkedList是双向循环链表。 -...

    JAVA中常用的集合类型[归类].pdf

    - 主要实现类包括HashMap、Hashtable、LinkedHashMap、Properties和TreeMap。 - HashMap是基于哈希表的,插入和查询速度快,但不保证键的顺序。 - Hashtable与HashMap类似,但它是线程安全的,不允许null键和值。...

    【后端】java基础(4.4)java中级基础之集合——Map

    Hashtable TreeMap LinkedHashMap 我们主要来说说最常用的HashMap: 添加元素:put(key,value) HashMap map = new HashMap&lt;&gt;(); map.put("name", "大妖怪"); map.put("age", "100"); 复制代码 查询元素:get(key...

    java的一些基础知识什么这类的

    六、HashMap 和 HashTable 的区别 * HashMap 和 HashTable 都实现了 Map 接口。 * HashMap 可以接受为 null 的 key 和 value,key 为 null 的键值对放在下标为 0 的头结点的链表中,而 Hashtable 则不行。 * ...

    HashMapvs.TreeMapvs.Hashtable

    在Java编程语言中,`HashMap`、`TreeMap`和`Hashtable`是三种常见的集合类,它们都实现了`Map`接口,用于存储键值对数据。理解这些类的区别和应用场景对于提升Java开发技能至关重要。 首先,`HashMap`是Java中最...

Global site tag (gtag.js) - Google Analytics