注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

HashMap  

2010-08-06 14:49:57|  分类: JAVA集合容器 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
HashMap(1.2)
 HashMap是基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。
 (除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
 此 实现假定哈希函数将元素正确分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。
 迭代 集合视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)的和成比例
 所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。
 HashMap的实例有两个参数影响其性能:初始容量 和加载因子容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。
 
加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。
 当哈希表中的条目数超出了加载因子与当前容量的乘积时,通过调用 rehash 方法将容量翻倍。
 通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷。
 加载因子过高虽然减少了空间开销,但同时也增加了查询成本
 (在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。
 在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地降低 rehash 操作次数。
 如果最大条目数小于初始容量乘以加载因子,则不会发生 rehash 操作。
 如果很多映射关系要存储在 HashMap 实例中,则相对于按需执行自动的 rehash 操作以增大表的容量来说,
 使用足够大的初始容量创建它将使得映射关系能更有效地存储。
 注意,此实现不是同步的。如果多个线程同时访问此映射,而其中至少一个线程从结构上修改了该映射, 则它必须 保持外部同步。
 (结构上的修改是指添加或删除一个或多个映射关系的操作;仅改变与实例已经包含的键关联的值不是结构上的修改。)
 这一般通过对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,
 则应该使用 Collections.synchronizedMap 方法来“包装”该映射。最好在创建时完成这一操作, 以防止对映射进行意外的不同步访问,如下所示:
 Map m = Collections.synchronizedMap(new HashMap(...));
 由所有此类的“集合视图方法”所返回的迭代器都是快速失败 的:在迭代器创建之后,
 如果从结构上对映射进行修改,除非通过迭代器自身的 remove 或 add 方法,其他任何时间任何方式的修改,
 迭代器都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,
 而不冒在将来不确定的时间任意发生不确定行为的风险。
 注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时,不可能作出任何坚决的保证。
 快速失败迭代器尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常程序的方式是错误的,
 正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。 
 注意1:允许使用null值和null键。
 注意2:此实现不是同步的。不是线程安全的。
 注意3:这里的键也是个对象(本质上是使用它的hashCode())。
 注意4:如果插入重复的元素,后面的会覆盖前面的。如例1所示。
 注意5:除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同,关于更多的内容可以查考Hashtable
实例1
import java.util.Comparator;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Random;
public class Test {
 /**
  * @param args
  */

 public static void main(String[] args) {
  HashMap<Integer,People> map=new HashMap();
  People p1=new People("robin",1,28);
  People p2=new People("robin",2,30);
  map.put(new Integer(100), p1);
  map.put(new Integer(100), p2);
  for(People p:map.values())
  {
   System.out.println(p);
  }

 }
}
class People{
 String name;
 int id;
 int age;
 public People(String name,int id)
 {
  this(name,id,0);
 }
 public People(String name,int id,int age)
 {
  this.name=name;
  this.id=id;
  this.age=age;
 }
 public String toString()
 {
  return id+name+age;
 }
 public boolean equals(Object o)
 {
  if(o==null)
   return false;
  if(!(o instanceof People))
   return false;
  People p=(People)o;
  boolean res=name.equals(p.name);
  if(res)
   System.out.println("name "+name+" is double");
  else
   System.out.println(name+" vS "+p.name);
  return res;
 }
 public int hashCode()
 {
  return name.hashCode();
 }
}
  评论这张
 
阅读(1169)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017