文档章节

HashMap,Hashtable,TreeMap,LinkedHashMap 比较

RookieChen
 RookieChen
发布于 2014/05/30 15:58
字数 767
阅读 44
收藏 1
点赞 0
评论 0

先来看一下这几个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
博文 19
码字总数 3606
作品 0
杭州
LinkedHashMap和HashMap的比较使用

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

smilezhuolin ⋅ 2014/06/04 ⋅ 0

LinkedHashMap和HashMap的比较使用

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

zhwj407906450 ⋅ 2012/10/22 ⋅ 0

HashMap vs. TreeMap vs. Hashtable vs.LinkedHashMap

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

markGao ⋅ 2014/01/23 ⋅ 0

java集合框架总结(六)

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

hapier ⋅ 2016/09/09 ⋅ 0

HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMa

Map是最重要的数据结构。这篇文章中,我会带你们看看HashMap, TreeMap, HashTable和LinkedHashMap的区别。 1. Map概览 Java SE中有四种常见的Map实现——HashMap, TreeMap, Hashtable和Linke...

LCZ777 ⋅ 2014/07/30 ⋅ 0

集合(四): Map

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

牧羊人Berg ⋅ 2016/06/14 ⋅ 0

Java中的常用Map:HashMap、Hashtable、LinkedHashMap、Tre...

Java自带了各种Map类,可归为三种类型: 1.通用Map,用于在应用程序中管理映射,通常在 java.util 程序包中实现 HashMap Hashtable Properties LinkedHashMap IdentityHashMap TreeMap WeakH...

foxeye ⋅ 2013/09/30 ⋅ 0

HashMap,LinkedHashMap,TreeMap的区别

Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。 Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访...

浮躁的码农 ⋅ 2015/07/29 ⋅ 0

详解HashMap,Hashtable,LinkedHashMap,TreeMap的异同点

Map Map是是一种数据结构,它是把数据按照key-value键值对的形式保存起来,一般来说,Map的定义是key是独一无二的,即存在map中的各个键一定是不能相同的。当然,对于一般的基本数据类型和S...

断桥残雪断桥残雪 ⋅ 2015/08/14 ⋅ 0

Java容器归纳

Collection : |--SubInterface |--Set |-- SortSet |-- TreeSet 内部实际为TreeMap对象。 通过compareTo方法进行比较。 比较大的在left,小的在right端。 |-- HashSet 内部实为HashMap或Lin...

沙鹰 ⋅ 2015/08/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

开启Swarm集群以及可视化管理

在搭建的两台coreos服务器上开启swarm集群 前置条件: docker均开启2375端口 同一个局域网内 主服务器上安装Portainer容器 安装Portainer容器执行: docker run -d -p 9000:9000 --restart=a...

ykbj ⋅ 21分钟前 ⋅ 0

单例设计模式

1、单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 2、饿汉式单例类 在这个类被加载时,静态变量instance会被初始化,此时类的私有构造子会被调用 饿汉式是典型...

职业搬砖20年 ⋅ 26分钟前 ⋅ 0

前端基础(四):前端国际规范收集

字数:1142 阅读时间:5分钟 前言 由于前端技术的灵活性和杂乱性,导致网上的许多解决方案不够全面甚至是完全错误,容易起到误导作用。所以,我对搜索到的解决方案往往是存疑态度。那么,如何...

老司机带你撸代码 ⋅ 28分钟前 ⋅ 0

Failed to open/create Network-VirtualBox Host-Only

虚拟机版本 : Oracle Vm VirtualBox 5.2.12 报错时机:开网卡二,重启虚拟机报错 "Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Ada......

p至尊宝 ⋅ 31分钟前 ⋅ 0

三分钟学会如何在函数计算中使用 puppeteer

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网...

阿里云云栖社区 ⋅ 35分钟前 ⋅ 0

springMVC接收表单时 Bean对象有Double Int Char类型的处理

前台ajax提交表单price为double类型 后台controller就介绍不到 400错误 前台 实体类: public class ReleaseMapIconConfig{ private String id; private long maxValue; private long minVal......

废柴 ⋅ 37分钟前 ⋅ 0

ZOOKEEPER安装

工作需要在ubuntu上配置了一个zookeeper集群,有些问题记录下来。 1. zookeeper以来java,所以首先要安装java。但是ubuntu系统有自带的jdk,需要通过命令切换java版本: $ sudo update-alter...

恰东 ⋅ 40分钟前 ⋅ 0

linux 进程地址空间的一步步探究

我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间。其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间。 那虚拟内存空间...

HelloRookie ⋅ 40分钟前 ⋅ 0

myatis #{}与${}区别及原理

https://blog.csdn.net/wo541075754/article/details/54292751

李道福 ⋅ 43分钟前 ⋅ 0

三分钟学会如何在函数计算中使用 puppeteer

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网...

猫耳m ⋅ 44分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部