文档章节

HashMap,Hashtable,TreeMap,LinkedHashMap 比较

RookieChen
 RookieChen
发布于 2014/05/30 15:58
字数 767
阅读 61
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

[springBoot系列]--springBoot注解大全

一、注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让spring Boot扫描到Configuration类并把它加......

Jack088
10分钟前
0
0
tomcat编译超过64k大小的jsp文件报错原因

  今天遇到一个问题,首先是在tomcat中间件上跑的web项目,一个jsp文件,因为代码行数实在是太多了,更新了几个版本之后编译报错了,页面打开都是报500的错误,500的报错,知道http协议返回...

SEOwhywhy
31分钟前
2
0
flutter http 请求客户端

1、pubspec文件管理Flutter应用程序的assets(资源,如图片、package等)。 在pubspec.yaml中,通过网址“https://pub.dartlang.org/packages/http#-installing-tab-”确认版本号后,将http(0...

渣渣曦
32分钟前
0
0
Django基本命令及moduls举例

一、Django基本命令 1.创建项目 django-admin.py startproject mysite 创建后的项目结构:- mysite - mysite #对整个程序进行配置 - init #导入包专用- settings ...

枫叶云
47分钟前
7
0
zabbix安装

rpm -ivh http://repo.webtatic.com/yum/el6/latest.rpm 安装jdk rpm -ivh (自行在网上下载rpm包) 安装php并修改相应参数 yum -y install php56w php56w-gd php56w-mysqlnd php56w-bcmath......

muoushi
48分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部