源起:

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

为什么以下代码第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. 运用Links方法安装插件

    方法如下: (1)在Eclipse的安装目录下新建两个文件夹:一个用来存放插件,取名为myplugins:另一个用来存放link文件,取名为links. (2)将下载的插件解压缩到myplugins目 ...

  2. Android 源码架构

    我们都知道Android系统是一个开源工程,在网上可以下载到源代码. 一般在网上搜索一下,就会找到各种下载源代码的方法,比如使用Git和Repo,android源代码下载的网址是http://andr ...

  3. spring boot---WebFilter注解 实现自定义登录过滤器

    https://my.oschina.net/wangnian/blog/647976 http://www.jianshu.com/p/05c8be17c80a

  4. oracle:通过shell来运行rman命令

    每次都手工输入一批rman命令来进行备份等操作是很繁琐的事,有什么简便的方法吗?可以的,你可以把这批rman命令写在 shell命令里面,需要的时候,运行一下sh即可.下面是一个简单的实例: RMAN ...

  5. iOS 堆和栈的区别和联系

    堆和栈的区别主要有以下五点: 1.管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来讲,释放工作由程序员控制,容易产生memory leak(内存泄露). 2.申请大小: 栈是向低地 ...

  6. linux的存储结构

    在linux中存储结构如下: Linux系统中的文件存储结构 那么在linux中每个目录都是什么含义呢 在linux中相对路径和绝对路径是必须要了解的一个概念 绝对路径(absolute path): ...

  7. 初学者遇到的PostgreSQL字符集问题的解决

    当初学者在使用PostgreSQL数据库,输入中文时,会遇到“ERROR:  invalid byte sequence for encoding "UTF8": 0xd6d0”的 ...

  8. 模态对话框 DoModal的用法 (vs2008)与非模态对话框

    Windows对话框分为两类:模态对话框和非模态对话框. 模态对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互. ...

  9. Where Amazing Happens

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission( ...

  10. CodeForces 719A Vitya in the Countryside (水题)

    题意:根据题目,给定一些数字,让你判断是上升还是下降. 析:注意只有0,15时特别注意一下,然后就是14 15 1 0注意一下就可以了. 代码如下: #pragma comment(linker, & ...