- 浏览: 332894 次
- 性别:
- 来自: 安徽
文章分类
最新评论
-
fanjf:
因为不是太懂,所以摘录!
DataStage---向目的库插入时出现问题:MLOG$ -
fanjf:
oracle 位图索引:位图索引: 解决某一表数据很多,但某一 ...
【转】 mysql 添加列,修改列,删除列。 -
fanjf:
创建索引:CREATE TABLE mm (m1 CHAR(1 ...
【转】 mysql 添加列,修改列,删除列。 -
fanjf:
查询mysql 的表emp 的约束:
SELECT * FR ...
【转】 mysql 添加列,修改列,删除列。 -
fanjf:
为什么 update 不报错,结果为空?
关于MYSQL 检查check约束
1、 继承和实现区别
Hashtable是基于陈旧的Dictionary类,完成了Map接口;HashMap是Java 1.2引进的Map接口的一个实现(HashMap继承于AbstractMap,AbstractMap完成了Map接口)。
HashMap类对应的Java API包是:java.util;
类定义:public class HashMap extends AbstractMap implements Map, Cloneable, Serializable ;
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、HashTable使用Enumeration,HashMap使用Iterator。
6、HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
7、哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);
static int hash(Object x) {
int h = x.hashCode();
h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}
static int indexFor(int h, int length) {
return h & (length-1);
}
区别 |
Hashtable |
Hashmap |
继承、实现 |
Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable,Serializable |
HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable,Serializable
|
线程同步 |
已经同步过的可以安全使用 |
未同步的,可以使用Colletcions进行同步Map Collections.synchronizedMap(Map m) |
对null的处理
|
Hashtable table = new Hashtable(); table.put(null, "Null"); table.put("Null", null); table.contains(null); table.containsKey(null); table.containsValue(null); 后面的5句话在编译的时候不会有异常,可在运行的时候会报空指针异常具体原因可以查看源代码 public synchronized V put(K key, V value) { // Make sure the value is not null if (value == null) { throw new NullPointerException(); } |
HashMap map = new HashMap(); map.put(null, "Null"); map.put("Null", null); map.containsKey(null); map.containsValue(null); 以上这5条语句无论在编译期,还是在运行期都是没有错误的. 在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为 null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。 |
增长率 |
protected void rehash() { int oldCapacity = table.length; Entry[] oldMap = table; int newCapacity = oldCapacity * 2 + 1; Entry[] newMap = new Entry[newCapacity]; modCount++; threshold = (int)(newCapacity * loadFactor); table = newMap; for (int i = oldCapacity ; i-- > 0 ;) { for (Entry<K,V> old = oldMap[i] ; old != null ; ) { Entry<K,V> e = old; old = old.next; int index = (e.hash & 0x7FFFFFFF) % newCapacity; e.next = newMap[index]; newMap[index] = e; } } }
|
void addEntry(int hash, K key, V value, int bucketIndex) { Entry<K,V> e = table[bucketIndex]; table[bucketIndex] = new Entry<K,V>(hash, key, value, e); if (size++ >= threshold) resize(2 * table.length); }
|
哈希值的使用 |
HashTable直接使用对象的hashCode,代码是这样的: public synchronized boolean containsKey(Object key) { Entry tab[] = table; int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length; for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) { if ((e.hash == hash) && e.key.equals(key)) { return true ; } } return false ; } |
HashMap重新计算hash值,而且用与代替求模 public boolean containsKey(Object key) { Object k = maskNull(key); int hash = hash(k.hashCode()); int i = indexFor(hash, table.length); Entry e = table[i]; while (e != null) { if (e.hash == hash && eq(k, e.key)) return true; e = e.next; } return false; }
|
发表评论
-
JAVA 统一追加扩展名类
2014-07-07 15:34 980最近有人反应某云盘,无法上传视频,我也倍受困扰,后来发现MD ... -
java中替换字符以及回车换行
2014-02-14 13:47 1910[java] view plaincopy 1. / ... -
[转]java中替换字符以及回车换行
2013-11-13 09:18 3399//第一种方式 import java.util.r ... -
Caused by: java.lang.OutOfMemoryError: PermGen space
2013-07-30 16:43 677Caused by: java.lang.OutOfMemo ... -
nested exception is java.sql.BatchUpdateException: 批处理中出现错误: ORA-00972: 标识符过长
2013-07-30 16:21 4437最近开发项目,跑批处理遇到一个问题: 2013-07-28 ... -
软件架构师必读书籍--------软件架构师推荐书籍系列
2012-09-23 17:02 4091一、架构篇 1. 《Softw ... -
【异常】Error configuring application listener of class xxx.xxx.xxx
2012-04-01 11:26 4762严重: Error configuring applicati ... -
Java复制、移动、删除、获取大小文件
2012-03-31 11:12 1799利用Apache Commons IO工具包(commons- ... -
Java中的Enum简单例子
2012-03-31 11:12 1326package com.util.enumclass; /* ... -
Java中的Enum的使用与分析
2012-03-30 11:28 938示例: package com.util.enumclass ... -
分享文件一个上传工具类
2012-03-30 10:57 961最近在搭建一个项目,需要用到很多通用的工具类,自己也写了几个。 ... -
缩放图片工具类,创建缩略图、伸缩图片比例
2012-03-30 10:54 861支持将Image的宽度、高度缩放到指定width、height ... -
Java创建、重命名、删除文件和文件夹
2012-03-30 10:52 1641package test.file; import java ... -
Java操作文件工具类
2012-03-30 10:48 1084JAVA API关于操作文件基础类太少,而且缺乏很多使 ... -
java获得实例对象的几种方法
2012-03-29 17:49 1028// 1.new Dog d1 = new Dog ... -
【异常】net.sf.hibernate.NonUniqueObjectException
2012-03-22 16:06 859net.sf.hibernate.NonUniqueObjec ... -
Java虚拟机原理
2012-03-22 15:47 823一、什么是Java虚拟机 ... -
【异常】org.springframework.orm.hibernate3.HibernateQueryException
2012-03-20 10:44 2997今天新同事遇到一个异常,通过如下方法做一个单元测试: /** ... -
【异常】javax.imageio.IIOException: Can't get input stream from URL!
2012-03-19 11:42 9653Exception in thread "main& ... -
Error reading tld listeners java.lang.NullPointerException
2012-03-16 17:40 1562在学习【FreeMarker整合Spring 3.0】时把相应 ...
相关推荐
在Java编程中,`HashMap`与`HashTable`作为两种常用的数据结构,经常被用来存储键值对数据。尽管它们在功能上相似,但在实现细节、性能表现以及使用场景方面存在显著差异。本文将深入探讨两者之间的区别,帮助读者更...
`HashMap` 和 `HashTable` 都是 Java 集合框架中非常重要的数据结构,它们都实现了 `Map` 接口,用于存储键值对。尽管它们在功能上有很多相似之处,但在实现细节和性能特性上存在显著差异。 #### 二、主要区别 1. ...
本文总结了Java集合专题中的HashMap和HashTable,涵盖了它们的源码学习和面试总结。HashMap是一种基于哈希表的集合类,它的存储结构是一个数组,每个元素是一个单链表的头节点,链表用来解决hash地址冲突问题。...
在Java编程语言中,`HashMap`和`HashTable`是两种非常重要的数据结构,它们都实现了`Map`接口,并提供了键值对的存储方式。这两种数据结构虽然相似,但在实现细节和使用场景上存在显著差异。下面将详细介绍`HashMap`...
在Java集合框架中,`HashMap`, `HashTable` 和 `HashSet` 是三个重要的数据结构,它们分别实现了`Map`接口和`Set`接口,提供了不同的功能来满足不同的编程需求。本文将重点分析这三种数据结构之间的区别,特别是针对...
HashMap和HashTable是Java中两个常用的数据结构,都是基于哈希表实现的,但它们之间存在着一些关键的区别。本文将深入探讨HashMap和HashTable的底层原理,并总结常见的面试题。 HashMap的底层原理 HashMap是Java中...
在Java编程语言中,`HashMap`和`Hashtable`是两种非常重要的数据结构,它们都用于存储键值对。然而,在实际应用过程中,这两种数据结构有着本质的不同,下面将详细介绍这些差异。 #### 1. 历史背景及实现原理 - **...
HashMap和Hashtable的区别Java开发Java经验技巧共2页.pdf.zip
在Java编程语言中,`HashMap`和`HashTable`都是实现键值对存储的数据结构,但它们之间存在一些显著的区别,这些区别主要体现在线程安全性、性能、null值处理以及一些方法特性上。以下是对这两个类的详细分析: 1. ...
Java面试题11.HashMap和HashTable的区别.mp4
HashMap 和 Hashtable 是 Java 集合框架中两个重要的映射数据结构,它们都实现了 Map 接口,但具有显著的差异。以下将详细介绍这两个类的主要区别: 1. 线程安全性: - HashMap 不是线程安全的,这意味着在多线程...
### Java中HashMap, LinkedHashMap, TreeMap,HashTable的区别 在Java编程语言中,`Map`接口是集合框架中的一个重要组成部分,用于存储键值对。本文将详细分析四种常用的`Map`实现类:`HashMap`, `LinkedHashMap`, ...
hashMap和Hashtable的区别1
java面试题精讲视频MP4Java面试题11.HashMap和HashTable的区别提取方式是百度网盘分享地址
HashMap是Java中常用的一种数据结构,它基于哈希表实现,提供快速的键值对存储和检索。HashMap的核心原理是通过散列函数将键对象转换为哈希码,然后使用这个哈希码来确定键值对在内部数组中的位置。哈希函数的设计...
HashMap和HashTable的区别?但是如果想线程安全有想效率高?
在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...
在Java编程语言中,HashMap和Hashtable都是用于存储键值对的数据结构,它们都实现了Map接口。然而,两者之间存在一些显著的区别,这些差异主要体现在线程安全性、空值支持、继承结构以及方法实现等方面。以下是关于...
在Java编程语言中,`HashMap`和`HashTable`是两种常用的集合类,它们都是用于存储键值对的数据结构。这两个类都实现了`Map`接口,但它们之间存在一些显著的区别,这些差异主要体现在线程安全性、null值处理、迭代...
在Java编程语言中,`Hashtable` 和 `HashMap` 都是用来存储键值对的数据结构。这两种数据结构虽然相似,但是在实现细节上存在显著差异。 1. **Hashtable**:作为 `Dictionary` 类的子类,`Hashtable` 是 Java 最早...