hashmap

HashMap与HashTable的区别

a 夏天 提交于 2020-02-04 07:58:44
(仅列出重要的) 1,Hashtable既不支持Null key也不支持Null value;   HashMap中,null可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为null。 2,Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步   HashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。   虽然HashMap不是线程安全的,但是它的效率会比Hashtable要好很多。这样设计是合理的。在我们的日常使用当中,大部分时间是单线程操作的。HashMap把这部分操作解放出来了。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap。       ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。 3,Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。   创建时,如果给定了容量初始值,那么Hashtable会直接使用你给定的大小,而HashMap会将其扩充为2的幂次方大小

HashMap底层实现

萝らか妹 提交于 2020-02-04 07:55:01
\quad HashMap底层实现采用了哈希表,这是一种非常重要的数据结构。对于我们以后理解很多技术都非常有帮助(比如:redis数据库的核心技术和HashMap一样)。 \quad 数据结构中由数组和链表来实现对数据的存储,他们各有特点。 \quad (1) 数组:占用空间连续。寻址容易,查询速度快。但是,增加和删除效率非常低。 \quad (2) 链表:占用空间不连续。寻址困难,查询速度慢。但是,增加和删除效率非常高。 \quad 那么,我们能不能结合数组和链表的优点(即查询快,增删效率也高)呢? 答案就是“哈希表”。 哈希表的本质就是“数组+链表”。 ▪ Hashmap基本结构讲解 \quad 哈希表的基本结构就是“数组+链表”。我们打开HashMap源码,发现有如下核心内容: /** * The table, initialized on first use, and resized as * necessary. When allocated, length is always a power of two. * (We also tolerate length zero in some operations to allow * bootstrapping mechanics that are currently not needed.) */ transient

HashMap 和 HashTable差别

别等时光非礼了梦想. 提交于 2020-02-04 07:53:31
代码版本 JDK每一版本都在改进。本文讨论的HashMap和HashTable基于JDK 1.7.0_67。源码见这里 1. 时间 HashTable产生于JDK 1.1,而HashMap产生于JDK 1.2。从时间的维度上来看,HashMap要比HashTable出现得晚一些。 2. 作者 以下是HashTable的作者: 以下代码及注释来自java.util.HashTable * @author Arthur van Hoff * @author Josh Bloch * @author Neal Gafter 以下是HashMap的作者: 以下代码及注释来自java.util.HashMap * @author Doug Lea * @author Josh Bloch * @author Arthur van Hoff * @author Neal Gafter 可以看到HashMap的作者多了大神Doug Lea。不了解Doug Lea的,可以看这里。 3. 对外的接口(API) HashMap和HashTable都是基于哈希表来实现键值映射的工具类。讨论他们的不同,我们首先来看一下他们暴露在外的API有什么不同。 3.1 Public Method 下面两张图,我画出了HashMap和HashTable的类继承体系,并列出了这两个类的可供外部调用的公开方法。

HashMap和HashTable到底哪不同?

♀尐吖头ヾ 提交于 2020-02-04 07:45:38
          HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案。 /*--> */ /*--> */ 代码版本 JDK每一版本都在改进。本文讨论的HashMap和HashTable基于JDK 1.7.0_67。 1. 时间 HashTable产生于JDK 1.1,而HashMap产生于JDK 1.2。从时间的维度上来看,HashMap要比HashTable出现得晚一些。 2. 作者 以下是HashTable的作者: 以下代码及注释来自java.util.HashTable* @author Arthur van Hoff* @author Josh Bloch* @author Neal Gafter 以下是HashMap的作者: 以下代码及注释来自java.util.HashMap* @author Doug Lea* @author Josh Bloch* @author Arthur van Hoff* @author Neal Gafter 可以看到HashMap的作者多了大神Doug Lea。不了解Doug Lea的,可以看https://en.wikipedia.org/wiki/Doug_Lea。 3. 对外的接口(API)

hashmap与hashtable区别

做~自己de王妃 提交于 2020-02-04 07:44:11
0.继承不同,HashMap继承AbstractMap,HashTable继承Dictionary 1.HashMap是非synchronized的,HashTable则是同步的 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。 2.HashMap可以接受null(HashMap可以接受为null的键值(key)和值(value) ——其实是第一个原因的果,而Hashtable则不行)。 public synchronized V put(K key, V value) { // Make sure the value is not null if (value == null) { throw new NullPointerException(); } 3.HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove(

java并发之hashmap

假装没事ソ 提交于 2020-02-04 07:30:01
在Java开发中经常会使用到hashmap,对于hashmap又了解多少,经常听到的一句话是hashmap是线程不安全的,那为什么是线程不安全的,如何才能保证线程安全,JDK又给我们提供了那些线程安全的类,这些问题是今天讨论的问题, 一、hashmap为什么线程不安全 说到hashmap为什么线程不安全,首先要理解线程安全的定义。简单来讲,指的就是两个以上的线程操作同一个hashmap对象,不会发生资源争抢,hashmap中的数据不会错乱。根据以上的说法,我们大体上看下hashmap的源码,分析下其常用方法put、get的源码。 1、hashmap定义(基于JDK1.8) 经常使用hashmap的方式如下, HashMap map1=new HashMap(); 使用最简单粗暴的方式创建一个HashMap的对象,那么在底层是如何创建的,查看源码如下, /** * Constructs an empty <tt>HashMap</tt> with the default initial capacity * (16) and the default load factor (0.75). */ public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted 根据上面的提示

Java-Class-C:java.util.HashMap

北城余情 提交于 2020-02-04 07:28:58
ylbtech-Java-Class-C:java.util.HashMap 1. 返回顶部 1.1、 import java.util.HashMap; import java.util.Map; 1.2、 Map newMap = new HashMap(); 2、 2. 返回顶部 3. 返回顶部 4. 返回顶部 1、 /* * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package java.util; import java.io.IOException; import java.io.InvalidObjectException; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.function.BiConsumer; import java.util

Hashtable和HashMap的区别

佐手、 提交于 2020-02-04 07:25:38
HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别。 1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。 2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。 3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。 4.HashTable使用Enumeration,HashMap使用Iterator。 以上只是表面的不同,它们的实现也有很大的不同。 5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。 6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的: int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length;

Java hashtable和hastmap的区别

强颜欢笑 提交于 2020-02-04 07:23:19
1、 继承和实现区别    Hashtable是基于陈旧的Dictionary类 ,完成了Map接口;HashMap是Java 1.2引进的Map接口的一个实现( HashMap继承于AbstractMap ,AbstractMap完成了Map接口)。   2、 线程安全不同    HashTable的方法是同步的,HashMap是未同步 ,所以在多线程场合要手动同步HashMap。   3、 对null的处理不同    HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以) 。即 HashTable不允许null值其实在编译期不会有任何的不一样,会照样执行,只是在运行期的时候Hashtable中设置的话回出现空指针异常。 HashMap允许null值是指可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断 。   4、 方法不同   HashTable有一个 contains(Object value),功能和containsValue(Object value)功能一样 。   5、

Difference between Pair and Hashmap?

青春壹個敷衍的年華 提交于 2020-02-04 03:47:47
问题 What is the necessity to introduce Pair class when Hashmap can do the same job? I see Pair being introduced to Java version 8 回答1: Your choice of which class to use is not just a message to your computer. It's also a message to future developers - people who will maintain your code in the future, or even you yourself in a few months time. By choosing whether to declare a particular variable as either HashMap or Pair , you're telling those future developers something. It's EITHER This variable