文档章节

HashMap,Hashtable,TreeMap,LinkedHashMap 比较

RookieChen
 RookieChen
发布于 2014/05/30 15:58
字数 767
阅读 54
收藏 1

先来看一下这几个map的关系图











可以看出,Hashtable,HashMap,TreeMap,LinkedHashMap 都是实现与Map借口。不同的是TreeMap实现于 SortedMap,这个就决定了TreeMap存储的数据是可以排序的。

下面用四句话来概括这四个map的用法

1.Hashtable 是安全的(synchronized)
2.LinkedHashMap  保留插入顺序
3.TreeMap 是基于红黑树的数据结构,他的键是有序的
4.HashMap 的键是无序


二 代码

  HashMap  用自定义的对象做为键

import java.util.HashMap;
import java.util.Map.Entry;

public class HashMapTest{

  public static void main(String[] args){
    HashMap<Person,Integer> hashMap = new HashMap<Person,Integer>();
    Person p1 = new Person("Rookie",10);
    Person p2 = new Person("BruceChen",20);
    Person p3 = new Person("HackerRookie", 30);
    Person p4 = new Person("HackerRookie", 30);
    
    hashMap.put(p1,10);
    hashMap.put(p2,20);
    hashMap.put(p3,30);
    hashMap.put(p4,30);

    System.out.println(hashMap.size());
    for(Entry entry : hashMap.entrySet()){
      System.out.println(entry.getKey().toString() + " - " + entry.getValue());
    }
  }

}


class Person{
  String name ;
  int    age  ;
  
  public Person(String name,int age){
     this.name = name;
     this.age  = age;
  }

  public String toString(){
     return name + " 年龄 " + age;
  }
}

  Output:

4
BruceChen 年龄 20 - 20
Rookie 年龄 10 - 10
HackerRookie 年龄 30 - 30
HackerRookie 年龄 30 - 30

   上面的测试类,有一个问题,重复的添加了两个相同的人,HashMap并没有过滤。
   要想过滤掉重复的值,需要重写Object对象的 equals() 和hashCode()

 

class Person{
  String name ;
  int    age  ;
  
  public Person(String name,int age){
     this.name = name;
     this.age  = age;
  }

  public String toString(){
     return name + " 年龄 " + age;
  }
  
  public boolean equals(Object o){
    Person p = (Person)o;
    if(p.name.equals(this.name) && p.age == this.age){
       return true;
    }
    
    return (Person)o == this;
  }
  
  public int hashCode(){
    return this.name.length();
  }
}

  Output:
   

3
Rookie 年龄 10 - 10
BruceChen 年龄 20 - 20
HackerRookie 年龄 30 - 30

  3. TreeMap

  TreeMap的排序是以键来排序的,我们以自定义对象为键来说明

 

mport java.util.TreeMap;
import java.util.Map.Entry;

public class TreeMapTest{

  public static void main(String[] args){
    TreeMap<Duck,Integer> tM = new TreeMap<Duck,Integer>();
    
    Duck d1 = new Duck("white",30);
    Duck d2 = new Duck("green",10);
    Duck d3 = new Duck("black",54);
    
    tM.put(d1, 10);
    tM.put(d2,30);
    tM.put(d3, 40);
    
    System.out.println(tM.size());
    
    for(Entry entry : tM.entrySet()){
      System.out.println(entry.getKey() + " - " + entry.getValue());
    }
  }
}

class Duck{
  String color;
  int size;
  
  public Duck(String color,int size){
    this.color = color;
    this.size = size;
  }
  
  public boolean equals(Object o){
    return ((Duck)o).color == this.color;
  }
  
  public int hashCode(){
    return this.color.length();
  }

  public String toString(){
    return this.color + " Duck";
  }
  
}

  Output:(这里抛出异常信息)

Exception in thread "main" java.lang.ClassCastException: com.breeze.test.Duck 
cannot be cast to java.lang.Comparable
    at java.util.TreeMap.put(Unknown Source)
    at com.breeze.test.TreeMapTest.main(TreeMapTest.java:16)

   因为TreeMap是以key来来排序的,而我们的Duck对象并没有相互比较的能力.在java中,要想实现比较,必须实现Comparable 借口.在TreeMap中之所以可以用string来做key,就是因为 string实现了comparable借口,现在来修改Duck对象

mport java.util.TreeMap;
import java.util.Map.Entry;

public class TreeMapTest{

  public static void main(String[] args){
    TreeMap<Duck,Integer> tM = new TreeMap<Duck,Integer>();
    
    Duck d1 = new Duck("white",30);
    Duck d2 = new Duck("green",10);
    Duck d3 = new Duck("black",54);
    
    tM.put(d1, 10);
    tM.put(d2,30);
    tM.put(d3, 40);
    
    System.out.println(tM.size());
    
    for(Entry entry : tM.entrySet()){
      System.out.println(entry.getKey() + " - " + entry.getValue());
    }
  }
}

class Duck implements Comparable<Duck>{
  String color;
  int size;
  
  public Duck(String color,int size){
    this.color = color;
    this.size = size;
  }
  
  public boolean equals(Object o){
    return ((Duck)o).color == this.color;
  }
  
  public int hashCode(){
    return this.color.length();
  }

  public String toString(){
    return this.color + " Duck";
  }
  
  @Override
  public int compareTo(Duck d){
    return d.size - this.size;
  }
  
  
}

 Output:

 

3
black Duck - 40
white Duck - 10
green Duck - 30

3.Hasthtable 和 HashMap如出一辙,不同的是,HashMap的值是可以为null的,也不是synchroized

4。LinkedHashMap 继承自HashMap,它使插入linked里的数据,保留插入时的顺序。

© 著作权归作者所有

共有 人打赏支持
RookieChen
粉丝 2
博文 20
码字总数 3606
作品 0
杭州
LinkedHashMap和HashMap的比较使用

LinkedHashMap和HashMap的比较使用 由于现在项目中用到了LinkedHashMap,并不是太熟悉就到网上搜了一下。 运行结果如下: LinkedHashMap 6=apple 3=banana 2=pear HashMap* 2=pear 6=apple 3...

smilezhuolin
07/03
0
0
LinkedHashMap和HashMap的比较使用

由于现在项目中用到了LinkedHashMap,并不是太熟悉就到网上搜了一下。 ? 运行结果如下: LinkedHashMap 6=apple 3=banana 2=pear HashMap* 2=pear 6=apple 3=banana 分析:LinkedHashmap 的特点...

zhwj407906450
2012/10/22
0
0
HashMap vs. TreeMap vs. Hashtable vs.LinkedHashMap

Map概览 Java SE中有四种常见的Map实现——HashMap, TreeMap, Hashtable和LinkedHashMap。如果我们使用一句话来分别概括它们的特点,就是: HashMap就是一张hash表,键和值都没有排序。 Tree...

markGao
2014/01/23
0
0
java集合框架总结(六)

一、Map 简介 Map 用于保存具有映射关系的数据,因此 Map 集合里保存着两组值,一组值用于保存 Map 里的 Key,另外一组用于保存 Map 里的 Value Map 中的 key 和 value 都可以是任何引用类型...

hapier
2016/09/09
15
0
集合(四): Map

更多实现类的源码分析请点击链接地址。。。。。。。 一: java.util.Map<k,v> Map用于保存具有映射关系的数据,因此Map集合(键值对的集合)里保存着两组值,一组值用于保存Map里的key,另外一...

牧羊人Berg
2016/06/14
46
0

没有更多内容

加载失败,请刷新页面

加载更多

python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
1
1
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
12
0
Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
昨天
1
0
我为什么用GO语言来做区块链?

Go语言现在常常被用来做去中心化系统(decentralised system)。其他类型的公司也都把Go用在产品的核心模块中,并且它在网站开发中也占据了一席之地。 我们在决定做Karachain的时候,考量(b...

HiBlock
昨天
1
0
大数据学习脑图以及入门教程!

近些年,大数据的火热可谓是技术人都知道啊,很多人呢,也想学习大数据相关,所以,这里分享几个大数据脑图,希望可以让你清楚明白从哪里入门大数据,知道该学习以及掌握哪些知识点; 大数据...

董黎明
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部