Properties没有被注意的地方
2019-05-10 06:06:44来源:博客园 阅读 ()
源起:
今天阅读源码时发现一个地方不理解:
为什么以下代码第10行 get() 之后value为null时还去 getProperty() 呢?
org.springframework.util.CollectionUtils
1 public static <K, V> void mergePropertiesIntoMap(Properties props, Map<K, V> map) { 2 if (map == null) { 3 throw new IllegalArgumentException("Map must not be null"); 4 } else { 5 String key; 6 Object value; 7 if (props != null) { 8 for(Enumeration en = props.propertyNames(); en.hasMoreElements(); map.put(key, value)) { 9 key = (String)en.nextElement(); 10 value = props.get(key); 11 if (value == null) { 12 value = props.getProperty(key); 13 } 14 } 15 } 16 17 } 18 }
跟进去发现Properties类除了继承HashTable用于存储<K, V>数据之外,自身还持有一个
protected Properties defaults;
因此就相当于可以无限嵌套了吧。。。
测试:
Properties有些需要避坑的地方稍微整理了下:
1 @Test 2 public void javaCoreProperties () { 3 // public class Properties extends Hashtable<Object,Object> 4 5 // 初始化时传入的作为default属性(Properties类型)存储 6 Properties props = new Properties(System.getProperties()); 7 // 调用内部put方法,与put仅形参类型不同 8 props.setProperty("base.date", "2019-05-09"); 9 // 相比于setProperty适用范围更广,它的形参都是Object类型 10 props.put("base.time", "14:15:00"); 11 props.put("base.object", new Date()); 12 13 System.out.println(props.get("base.date")); 14 System.out.println(props.getProperty("base.date")); 15 16 System.out.println(props.get("base.time")); 17 System.out.println(props.getProperty("base.time")); 18 19 // get与getProperty不等价 20 // get仅获取put进去的存储在父类HashTable中的数据 21 System.out.println(props.get("java.runtime.version")); 22 // getProperty会优先在查找父类HashTable中的数据,如果没有再到自己拥有的default中查找;查找方法依然是跟这里相同 23 System.out.println(props.getProperty("java.runtime.version")); 24 25 // 可以获取对象 26 System.out.println(props.get("base.object")); 27 // 获取到Value对象,判断发现不是String类型,再去default中找,依然找不到,返回null 28 System.out.println(props.getProperty("base.object")); 29 30 31 // Key和Value不能为空,否则抛出NPE,这是HashTable决定的,HashMap就没有这个限制 32 //props.put(new Object(), null); // 有校验 33 //props.put(null, 123); //计算Key的hashCode时引发 34 35 // 这个会引起java.lang.ClassCastException,因为list遍历时,会将Key和Value强制转化为String 36 //props.put(new Object(), 123); 37 props.put("007", "123"); 38 props.remove("base.object"); 39 40 props.list(System.out); 41 }
运行输出:
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
...
欢迎提出意见或建议,共同进步。
原文链接:https://www.cnblogs.com/zlrui/p/10838634.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Cookie与Session
- Mybaties简单实例测试及注意问题 2020-06-07
- Spring boot Sample 003之spring-boot-configuration-proper 2020-06-01
- 五年多的开发经验,面试栽在了MQ上,不知道你们有没有被这 2020-05-29
- 写代码注意了,打死都不要用 User 这个单词 2020-05-22
- Java连载116-IO与Properties联合应用 2020-05-19
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash