源起:

今天阅读源码时发现一个地方不理解:

为什么以下代码第10行 get() 之后value为null时还去 getProperty() 呢?

org.springframework.util.CollectionUtils

   public static <K, V> void mergePropertiesIntoMap(Properties props, Map<K, V> map) {
if (map == null) {
throw new IllegalArgumentException("Map must not be null");
} else {
String key;
Object value;
if (props != null) {
for(Enumeration en = props.propertyNames(); en.hasMoreElements(); map.put(key, value)) {
key = (String)en.nextElement();
value = props.get(key);
if (value == null) {
value = props.getProperty(key);
}
}
} }
}

跟进去发现Properties类除了继承HashTable用于存储<K, V>数据之外,自身还持有一个

protected Properties defaults;

因此就相当于可以无限嵌套了吧。。。

测试:

Properties有些需要避坑的地方稍微整理了下:

     @Test
public void javaCoreProperties () {
// public class Properties extends Hashtable<Object,Object> // 初始化时传入的作为default属性(Properties类型)存储
Properties props = new Properties(System.getProperties());
// 调用内部put方法,与put仅形参类型不同
props.setProperty("base.date", "2019-05-09");
// 相比于setProperty适用范围更广,它的形参都是Object类型
props.put("base.time", "14:15:00");
props.put("base.object", new Date()); System.out.println(props.get("base.date"));
System.out.println(props.getProperty("base.date")); System.out.println(props.get("base.time"));
System.out.println(props.getProperty("base.time")); // get与getProperty不等价
// get仅获取put进去的存储在父类HashTable中的数据
System.out.println(props.get("java.runtime.version"));
// getProperty会优先在查找父类HashTable中的数据,如果没有再到自己拥有的default中查找;查找方法依然是跟这里相同
System.out.println(props.getProperty("java.runtime.version")); // 可以获取对象
System.out.println(props.get("base.object"));
// 获取到Value对象,判断发现不是String类型,再去default中找,依然找不到,返回null
System.out.println(props.getProperty("base.object")); // Key和Value不能为空,否则抛出NPE,这是HashTable决定的,HashMap就没有这个限制
//props.put(new Object(), null); // 有校验
//props.put(null, 123); //计算Key的hashCode时引发 // 这个会引起java.lang.ClassCastException,因为list遍历时,会将Key和Value强制转化为String
//props.put(new Object(), 123);
props.put("007", "123");
props.remove("base.object"); props.list(System.out);
}

运行输出:

2019-05-09
2019-05-09
14:15:00
14:15:00
null
1.8.0_144-b01
Thu May 09 15:09:02 CST 2019
null
-- listing properties --
base.time=14:15:00
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=C:\DevBaseFiles\Java\jdk1.8.0_144\jre...
java.vm.version=25.144-b01
base.date=2019-05-09
java.vm.vendor=Oracle Corporation
...

欢迎提出意见或建议,共同进步。

Properties没有被注意的地方的更多相关文章

  1. Android读写properties配置文件

    写这篇文章之前可以成功运行,文章后就各种找不到文件.所以并没有采用此种方式,后期完善.详见下篇解决方案. 配置文件读取很容易,修改需要注意权限,比如assets目录下就不允许修改. 配置文件的创建: ...

  2. xml文件 加载properties文件的两种方法与注意事项

    1.遇到的问题: 配置redisSpringContext.xml 时,遇到 properties加载失败,提示BeanDefinitionStoreException  和   java.lang. ...

  3. C#播放wav文件

    C#使用HWQPlayer类播放wav文件 类的代码: using System.IO; using System.Runtime.InteropServices; namespace HoverTr ...

  4. JDBC学习2:为什么要写Class.forName("XXX")?

    Class.forName(String name) 接上一篇JDBC.本来这个内容是放在前面的一篇里面的一起的,后来发现越写越多,想想看就算了,还是单独开一篇文章好了,这样也能写得更加详细点. 上一 ...

  5. tomcat中设置多项目共享jar;类包

    随着服务器上的tomcat部署的项目越来越多,最近在部署一个新的项目的时候出现内存溢出的错误 Exception in thread "main" java.lang.OutOfM ...

  6. Sping Boot入门到实战之入门篇(三):Spring Boot属性配置

    该篇为Sping Boot入门到实战系列入门篇的第三篇.介绍Spring Boot的属性配置.   传统的Spring Web应用自定义属性一般是通过添加一个demo.properties配置文件(文 ...

  7. mybatis常用配置

    前面两篇博客我们简单介绍了mybatis的使用,但是在mybatis的配置问题上我们只是使用了最基础的配置,本文我们就来说说其他一些常用的配置.如果小伙伴对mybatis尚不了解,可以先参考这两篇博客 ...

  8. tomcat和iis共用80端口的简明手册

    ​​对于使用tomcat-connector实现iis与tomcat实现80端口共用的问题,网上的信息异常混乱,很多地方误人子弟,浪费时间.本文给出简明手册式的做法: 首先列出我们需要做的事项: 1. ...

  9. jmeter用Windows电脑分布式部署

    当然,java环境.jmeter安装我这里就不说了. 使用1个controller(imac电脑),2个agent(Windows7 系统) 一.agent配置(Windows7系统) 1.电脑环境变 ...

随机推荐

  1. 树的深度优先遍历和广度优先遍历的原理和java实现代码

    import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode le ...

  2. ie67 display:inline-block 失效解决方法

    先将其转化为块状,在转化为inline,*号为css hcak,代表针对IE67 display: inline-block; *display: block; *display: inline;

  3. leetcode 677. Map Sum Pairs

    Implement a MapSum class with insert, and sum methods. For the method insert, you'll be given a pair ...

  4. ad广告下拉收起代码

    1. [代码][JavaScript]代码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...

  5. Android Platform Version与API Level的对应表

    Platform Version API Level VERSION_CODE Notes Android 6.0 23 M Platform Highlights Android 5.1 22 LO ...

  6. linux oracle命令行窗口命令上下翻阅

    1.上传rlwrap-0.37.tar.gz到/stage   cd /stage/ 解压tar xzvf rlwrap-0.37.tar.gz cd rlwrap-0.37 ./configure ...

  7. ekhtml使用总结

    ekhtml是一个高效SAX方式的HTML解析库. 文件说明 官网下载ekhtml-0.3.2.tar.gz文件解压后,内部包括源码.测试文件.文档.编译脚本等. 如需编译成静态库或动态库后进行集成, ...

  8. SQLite学习手册(开篇)

    一.简介: SQLite是目前最流行的开源嵌入式数据库,和很多其他嵌入式存储引擎相比(NoSQL),如BerkeleyDB.MemBASE等,SQLite可以很好的支持关系型数据库所具备的一些基本特征 ...

  9. 【转】git修改文件后,提交到远程仓库

    原文地址:https://blog.csdn.net/nly19900820/article/details/73613654 修改文件后,怎么提交到远程仓库1.git status 查看git是否有 ...

  10. Bootstrap-CL:字体图标(Glyphicons)

    ylbtech-Bootstrap-CL:字体图标(Glyphicons) 1.返回顶部 1. Bootstrap 字体图标(Glyphicons) 本章将讲解字体图标(Glyphicons),并通过 ...