首页 > 其他分享 >为什么HashMap的key允许空值,而Hashtable却不允许

为什么HashMap的key允许空值,而Hashtable却不允许

时间:2023-04-13 10:01:01浏览次数:36  
标签:hash HashMap value Hashtable key 允许 null

结论:HashMap对象的key、value值均可为null。

           Hashtable对象的key、value值均不可为null。

且两者的的key值均不能重复,若添加key相同的键值对,后面的value会自动覆盖前面的value,但不会报错。

1.从源码分析

HashMap从源码分析:

 

 HashMap在put的时候会调用hash()方法来计算key的hashcode值,可以从hash算法中看出当key==null时返回的值为0。因此key为null时,hash算法返回值为0,不会调用key的hashcode方法。

HashTable从源码分析:

上面可以看出当Hashtable存入的value为null时,抛出NullPointerException异常。如果value不为null,而key为空,在执行到int  hash = key.hashCode()时同样会抛出NullPointerException异常

2.从设计师角度分析
Hashtable是Java中的遗留类,现在不怎么用了,这里HashMap vs Hashtable有个解释。也许Hashtable类的设计者当时认为null作为key 和value 是没有什么用的。

HashMap是之后的版本引进的类,它的接口Map表达的意义更为广泛,也许HashMap的设计者认为null作为key和value是有实际意义的,所以才允许为null.

当然实际项目中,真的是有value为null的情况的。key为null的情况比较少见,但不代表没有。HashMap允许null为key和value应当是类的设计者思考让这个类更有用的设计吧。

标签:hash,HashMap,value,Hashtable,key,允许,null
From: https://www.cnblogs.com/yzx-sir/p/17312314.html

相关文章

  • asp.net webform 允许跨域
    voidApplication_BeginRequest(objectsender,EventArgse){//允许跨域请求的域名列表,可以根据需求进行修改string[]allowedOrigins=newstring[]{"http://example1.com","http://example2.com"};//获取请求来源stringorigin=HttpContex......
  • 【Java 并发】【十】【JUC数据结构】【七】ConcurrentHashMap前置篇HashMap原理
    1 前言前几节我们分析了一些并发安全的数据结构,分别是CopyOnWrite系列的CopyOnWriteArrayList、BlockingQueue阻塞队列系列的LinkedBlockingQueue、ArrayBlockingQueue、DelayQueue。接下来我们要讲解一个很重要的并发安全的数据结构,ConcurrentHashMap。在Java的数据结构里面平......
  • 配置Mysql允许远程访问
    配置Mysql允许远程访问 把Mysql安装在服务器上,然后在本地访问,发现提示Host'***'isnotallowedtoconnecttothisMySQLserver,错误提示很明确,就是目标主机上的Mysql服务不允许连接。1.打开命令提示符,执行Mysql-uroot-proot命令(如果提示Mysql不是内部或外部命令什么......
  • HashMap排序方法,少见的toArray转为Array 泛型数组 排序,而非ArrayList
        HashMap<String,Integer>hm=newHashMap<>();    hm.put("a",1);    hm.put("c",2);    hm.put("b",3);         Set<Entry<String,Integer>>entrySet=hm.entrySet();      ......
  • concurrentHashMap为什么是线程安全的?
    ConcurrentHashMap是线程安全的。它可以被多个线程同时使用而不需要额外的同步措施(比如使用synchronized)来保证线程安全。这是因为ConcurrentHashMap内部使用了一些非常高效的机制来保证线程安全,包括:分段锁:ConcurrentHashMap将数据分成多个段,每个段都有自己的锁。这样,在多线程......
  • SimpleHTTPServer跨域允许
    fromhttp.serverimportSimpleHTTPRequestHandlerimportsocketserverclassCORSRequestHandler(SimpleHTTPRequestHandler): defend_headers(self): self.send_header('Access-Control-Allow-Origin','*') self.send_header('Access-Con......
  • 对list中的字段进行自定义排序,最后放在LinkedHashMap中
    List<ProjectVO>projectList=dbProjectService.getProjectList();这里面如果第一个字段是如下的顺序:"成都分公司","北京分公司","上海分公司","深圳分公司","广州分公司","重庆分公司"Map<String,List<ProjectVO>>map=projectL......
  • 表单校验 不允许输入中文方法
     //检验不能为中文  checkData(rule,value,callback){   if(value){    if(/[\u4E00-\u9FA5]/g.test(value)){     callback(newError("不能包含中文!"));    }else{     callback();    }   }......
  • 项目一众筹网06_02给用户分配角色、执行用户角色的分配、提交的 只是我们选中的解决、
    项目一众筹网06_02项目一众筹网06_02文章目录项目一众筹网06_0209-Admin分配Role-执行分配-handler方法(执行角色分配的后端代码开始)隐藏域的东西,不用传,点击submit(提交)的时候就会传过去,如下图允许参数是空值10-Admin分配Role-执行分配-Service方法==重复问题==11-Admin分配Role-执行......
  • HashMap
    HashMap变化HashMap1.7在JDK1.7到JDK1.8的时候,对HashMap做了优化首先JDK1.7的HashMap当出现Hash碰撞的时候,最后插入的元素会放在前面,这个称为“头插法”JDK7用头插是考虑到了一个所谓的热点数据的点(新插入的数据可能会更早用到),但这其实是个伪命题,因为JDK7中rehash的时......