文档章节

java8 HashMap 性能质疑

p
 plus2015
发布于 2017/07/29 13:45
字数 351
阅读 46
收藏 0

我们都知道java8对HashMap的实现进行了优化(链表超过一定长度则采用红黑树处理),但以下简单的代码证明:java8中HashMap存在严重的性能问题。

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

/**
 * java8 在hashCode不均匀的情形下 性能极差(相比6与7)
 * java8对于链表长度太长(默认超过8)时,链表就转换为红黑树,利用红黑树快速增删改查的特点提高HashMap的性能
 * 为什么采用红黑树反而起来相反的效果?
 * <p>
 * Created by donghq on 17/7/28.
 */
public class TestJava8HashMap {

    public static final int TIMES = 40000;  //4万


    public static void main(String[] args) {
        Map<User, String> users = new HashMap<User, String>(TIMES);
        User u;
        long b = System.currentTimeMillis();
        for (int i = 0; i < TIMES; i++) {
            u = new User(String.valueOf(i), i);
            users.put(u, String.valueOf(i));
        }
        long e = System.currentTimeMillis();
        System.out.println("put耗时: " + (e - b) + " ms");

        b = System.currentTimeMillis();
        for (int i = 0; i < TIMES; i++) {
            u = new User(String.valueOf(i), i);
            users.get(u);
        }
        e = System.currentTimeMillis();
        System.out.println("get耗时: " + (e - b) + " ms");
    }
}

class User {

    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        User user = (User) o;

        if (age != user.age) return false;
        return name != null ? name.equals(user.name) : user.name == null;
    }

    @Override
    public int hashCode() {
        //int result = name != null ? name.hashCode() : 0;
        //result = 31 * result + age;
        //使hashCode 极不均匀
        return 1;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

以下是测试结果:

 

© 著作权归作者所有

p
粉丝 1
博文 4
码字总数 674
作品 0
大兴
私信 提问
java集合框架(一):HashMap

有大半年没有写博客了,虽然一直有在看书学习,但现在回过来看读书基本都是一种知识“输入”,很多时候是水过无痕。而知识的“输出”会逼着自己去找出没有掌握或者了解不深刻的东西,你要把一...

chenzanjin
2017/10/25
194
2
深入剖析 Java 7 中的 HashMap 和 ConcurrentHashMap

本文将深入剖析 Java7 中的 HashMap 和 ConcurrentHashMap 的源码,解析 HashMap 线程不安全的原理以及解决方案,最后以测试用例加以验证。 1 Java7 HashMap HashMap 的数据结构: 从上图中可...

简祥
2018/09/16
41
0
java8: hashmap性能提升

HashMap是一个高效通用的数据结构,它在每一个Java程序中都随处可见。先来介绍些基础知识。你可能也知道,HashMap使用key的hashCode()和equals()方法来将值划分到不同的桶里。桶的数量通常要...

xinyitianii
2014/06/17
391
0
为什么选择 Java 8 ?

本文是 DZone 指南 Java 生态系统的专题文章。点击链接可阅读更多见解深刻的文章、行业统计信息,系 OneAPM工程师编译整理。 在很多情况下,Java8 都能提升应用性能,而无需任何改变或性能调...

OneAPM蓝海讯通
2015/11/04
167
0
集合源码解析-HashMap

1 概述 2 HashMap的数据结构 [站外图片上传中...(image-191a9-1514436143996)] 如图,HashMap的主结构类似于一个数组,添加值时通过key确定储存位置.每个位置是一个Node(图中黑点)的数据结构,...

芥末无疆sss
2017/12/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
41分钟前
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部