今天偶然之间,发现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的默认值方法及其应用。 首先,我们来看一下在JDK8之前,如何获取Map中的值并设定默认值。通常,我们需要先检查Key是否存在,如果不存在则返回一个默认值。这样的操作在循环或条件判断中...
JDK11使用MapStruct
list转map的测试类,用到jdk1.8的新特性,感觉用起来很方便
赠送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....
赠送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还改进了`Map`接口,新增了`putIfAbsent()`, `remove()`, `replace()`等原子操作,以及`forEach()`方法,使得遍历和修改`Map`更加便捷。此外,`Optional`类的引入用于表示可能为null的对象,减少了...
这些知识点只是JDK 1.8 API中文文档中的一部分,实际文档中会涵盖Java SE平台的所有类和接口,以及它们的用法、构造、方法和属性。通过这份文档,开发者可以深入理解JDK 1.8的功能和用法,提升编程效率和代码质量。
jdk8中类-接口继承图,现在包括容器,IO流,部分Exception,HashMap
JDK 8允许在接口中定义私有方法和静态方法,增强了接口的功能,使其可以包含辅助方法,而不会污染实现类的命名空间。 8. **类型推断的改进**: 类型推断的增强使得在泛型方法调用中可以省略类型参数,编译器会...
6. **默认方法**:接口中新增了默认方法(default methods),允许在接口中定义实现。这使得接口可以在不破坏已有实现的情况下添加新功能,比如`Comparator`接口的`thenComparing`方法。 7. **方法引用和构造器引用...
例如,`java.util.Collection`接口中的`forEach()`方法就是一个默认方法。 5. **Optional类** `Optional`类用于表示可能为`null`的值,避免了空指针异常。它提供了检查值是否存在、获取值、转换值等方法,鼓励...
8. **并发更新的Map接口增强**:例如ConcurrentHashMap,提供了新的方法,如computeIfAbsent(),putIfAbsent(),remove(),replace()等,这些方法允许在并发环境中安全地修改Map。 9. **接口静态方法**:接口可以...
8. **Map接口的改进**:`Map`接口增加了几个新的方法,如`putIfAbsent()`, `remove()`, `replace()`, 和`compute()`, `merge()`,使得在并发环境中对Map的操作更加安全和便捷。 9. **类型推断的增强**:编译器现在...
在接口中添加默认方法是JDK8的另一大创新,允许接口定义方法的默认实现,不破坏已有实现的兼容性。 **8. 并发更新工具类** JDK8对并发库也进行了增强,如`ConcurrentHashMap`的改进,新增`AtomicIntegerArray`、`...
JDK 8允许接口定义私有方法和静态方法,使得接口可以拥有内部实现逻辑,而不影响外部接口。 通过深入学习JDK 8中文手册,开发者可以充分利用这些新特性,提升代码质量和开发效率。手册详细阐述了每个API的功能、...
JDK(Java Development Kit)是Java编程语言和平台的标准版开发工具包,它包含了编译、调试、运行Java应用程序所需的所有工具和库。JDK 8是Oracle公司发布的一个重要版本,引入了许多新特性,对于Java开发者来说具有...
**JDK13 API中文文档**是Java开发者的重要参考资料,它包含了JDK13版本中的所有公共类、接口、枚举、注解等编程元素的详细说明,为开发者提供了全面的API函数用法和功能解释。这篇文档是中文版,方便了中文使用者...
4. **默认方法**:在接口中,JDK1.8引入了默认方法的概念,允许接口定义具有实现的方法,这样可以为已有的接口添加功能而不破坏现有的实现。 5. **Date和Time API增强**:Java 8对日期和时间API进行了全面重构,...
"方便已义中文方式浏览jdk中的说明"强调了这个文档是中文翻译版,使得开发者能够更轻松地理解JDK中的各种类、接口、方法和概念,降低了学习和使用的难度。 **标签解析:** "范文/模板/素材" 这个标签可能是指这个...
JDK 1.8对集合框架进行了增强,包括`List`、`Set`、`Map`接口的实现类。例如,`HashMap`和`ConcurrentHashMap`的性能提升,以及`LinkedList`的改进。 #### 接口默认方法 接口中可以定义默认方法,这允许在不破坏向...