`
wangjian5748
  • 浏览: 209587 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

探讨jdk标准库中Map接口的put方法

阅读更多

今天偶然之间,发现Map接口的put方法的使用问题,先看下面代码:

public class TestMap {

 public static void main(String[] args) {
  Map m1 = new HashMap();
  m1.put(null, null);
  System.out.println("m1.size="+m1.size());
  Map m2 = new TreeMap();
  m2.put(null, null);
  System.out.println("m1.size="+m2.size());
  Map m3 = new Hashtable();
  m3.put("key", null);
  
 }
}
这段代码的打印输出是:

m1.size=1
m1.size=1
Exception in thread "main" java.lang.NullPointerException
        at java.util.Hashtable.put(Hashtable.java:396)
        at TestMap.main(TestMap.java:16)

我们可以发现HashMap与TreeMap的key与value都可以为null, 而HashTable则都不可以为null,为什么会这样?最后,我查看了API文档,文档分别说明如下:

HashMap与TreeMap的返回值说明文档如下:

previous value associated with specified key, or null if there was no mapping for key. A null return can also indicate that the HashMap previously associated null with the specified key.

而HashTable的返回值说明文档如下:

the previous value of the specified key in this hashtable, or null if it did not have one.

而且HashTable的异常文档明确说明:

NullPointerException - if the key or value is null.

所以上面代码的结果应该是正确的,但是我有一点疑惑,若是key/value可以为null,那么某次我用get方法返回的值为null的话,不能确定上因为没有这个值,还是这个值确实是为null.

总之,我认为我们没有必要每次都要检测从Map取出的value,因为在很多时候都是我们自己在组织Map对象, 但是这还是带来了问题,假如我使用的某个接口返回值是Map类型,但是我们不知道该对象到底时什么具体类型,在取值时,是否需要检测取出的值.我想这要看什么情况了,不过,我想我是从来不检测这些值的.



分享到:
评论

相关推荐

    JDK8新增便利的Map默认值方法Java开发Java经验

    本文将深入探讨JDK8中Map的默认值方法及其应用。 首先,我们来看一下在JDK8之前,如何获取Map中的值并设定默认值。通常,我们需要先检查Key是否存在,如果不存在则返回一个默认值。这样的操作在循环或条件判断中...

    JDK11使用MapStruct

    JDK11使用MapStruct

    jdk1.8list转map的测试类

    list转map的测试类,用到jdk1.8的新特性,感觉用起来很方便

    mapstruct-jdk8-1.2.0.Final-API文档-中文版.zip

    赠送jar包:mapstruct-jdk8-1.2.0.Final.jar; 赠送原API文档:mapstruct-jdk8-1.2.0.Final-javadoc.jar; 赠送源代码:mapstruct-jdk8-1.2.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-jdk8-1.2.0....

    mapstruct-jdk8-1.2.0.Final-API文档-中英对照版.zip

    赠送jar包:mapstruct-jdk8-1.2.0.Final.jar; 赠送原API文档:mapstruct-jdk8-1.2.0.Final-javadoc.jar; 赠送源代码:mapstruct-jdk8-1.2.0.Final-sources.jar; 赠送Maven依赖信息文件:mapstruct-jdk8-1.2.0....

    JDK1.8中文文档 JDK1.8中文 jkd8中文文档 JDK中文版

    除此之外,JDK1.8还改进了`Map`接口,新增了`putIfAbsent()`, `remove()`, `replace()`等原子操作,以及`forEach()`方法,使得遍历和修改`Map`更加便捷。此外,`Optional`类的引入用于表示可能为null的对象,减少了...

    jdk1.8 api 中文文档

    这些知识点只是JDK 1.8 API中文文档中的一部分,实际文档中会涵盖Java SE平台的所有类和接口,以及它们的用法、构造、方法和属性。通过这份文档,开发者可以深入理解JDK 1.8的功能和用法,提升编程效率和代码质量。

    jdk8中类-接口图

    jdk8中类-接口继承图,现在包括容器,IO流,部分Exception,HashMap

    jdk8中文API文档

    JDK 8允许在接口中定义私有方法和静态方法,增强了接口的功能,使其可以包含辅助方法,而不会污染实现类的命名空间。 8. **类型推断的改进**: 类型推断的增强使得在泛型方法调用中可以省略类型参数,编译器会...

    JDK8 API 中文 文档.CHM

    6. **默认方法**:接口中新增了默认方法(default methods),允许在接口中定义实现。这使得接口可以在不破坏已有实现的情况下添加新功能,比如`Comparator`接口的`thenComparing`方法。 7. **方法引用和构造器引用...

    JDK 1.8中文API文档

    例如,`java.util.Collection`接口中的`forEach()`方法就是一个默认方法。 5. **Optional类** `Optional`类用于表示可能为`null`的值,避免了空指针异常。它提供了检查值是否存在、获取值、转换值等方法,鼓励...

    jdk 1.8 中文api文档

    8. **并发更新的Map接口增强**:例如ConcurrentHashMap,提供了新的方法,如computeIfAbsent(),putIfAbsent(),remove(),replace()等,这些方法允许在并发环境中安全地修改Map。 9. **接口静态方法**:接口可以...

    jdk1.8 JDK1.8 中文 CHM

    8. **Map接口的改进**:`Map`接口增加了几个新的方法,如`putIfAbsent()`, `remove()`, `replace()`, 和`compute()`, `merge()`,使得在并发环境中对Map的操作更加安全和便捷。 9. **类型推断的增强**:编译器现在...

    JDK8 中文帮助文档(jdk api 1.8 google.CHM)

    在接口中添加默认方法是JDK8的另一大创新,允许接口定义方法的默认实现,不破坏已有实现的兼容性。 **8. 并发更新工具类** JDK8对并发库也进行了增强,如`ConcurrentHashMap`的改进,新增`AtomicIntegerArray`、`...

    jdk8中文手册

    JDK 8允许接口定义私有方法和静态方法,使得接口可以拥有内部实现逻辑,而不影响外部接口。 通过深入学习JDK 8中文手册,开发者可以充分利用这些新特性,提升代码质量和开发效率。手册详细阐述了每个API的功能、...

    jdk_8中文文档

    JDK(Java Development Kit)是Java编程语言和平台的标准版开发工具包,它包含了编译、调试、运行Java应用程序所需的所有工具和库。JDK 8是Oracle公司发布的一个重要版本,引入了许多新特性,对于Java开发者来说具有...

    JDK13 API 中文 文档.CHM

    **JDK13 API中文文档**是Java开发者的重要参考资料,它包含了JDK13版本中的所有公共类、接口、枚举、注解等编程元素的详细说明,为开发者提供了全面的API函数用法和功能解释。这篇文档是中文版,方便了中文使用者...

    JDK1.8 API 中文文档

    4. **默认方法**:在接口中,JDK1.8引入了默认方法的概念,允许接口定义具有实现的方法,这样可以为已有的接口添加功能而不破坏现有的实现。 5. **Date和Time API增强**:Java 8对日期和时间API进行了全面重构,...

    jdk17中文说明文档

    "方便已义中文方式浏览jdk中的说明"强调了这个文档是中文翻译版,使得开发者能够更轻松地理解JDK中的各种类、接口、方法和概念,降低了学习和使用的难度。 **标签解析:** "范文/模板/素材" 这个标签可能是指这个...

    jdk1.8 api中文doc文档

    JDK 1.8对集合框架进行了增强,包括`List`、`Set`、`Map`接口的实现类。例如,`HashMap`和`ConcurrentHashMap`的性能提升,以及`LinkedList`的改进。 #### 接口默认方法 接口中可以定义默认方法,这允许在不破坏向...

Global site tag (gtag.js) - Google Analytics