一、背景
今天碰到两段有意思的代码,分享一下。你认为的“理所当然"是对的?
二、出乎意料的代码一
直接上代码:
public static void main(String[] args) {
TimeTest test = new TimeTest();
test.timeTest();
}
public void timeTest() throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse("1900-01-01 08:00:00");
System.out.println(simpleDateFormat.format(date));
}
输出结果是啥?额?是1900-01-01 08:00:00吗?运行一下:
额,发生了什么?怎么多了5分钟43秒?
关键信息:1927年12月31日的时候,上海的时区发生了变化。时钟往回走了5分52秒。因此,"1927-12-31 23:54:08"实际上发生了两次,而 Java 取的是第二次的的时刻,因此存在差异。那为啥是43秒,JDK的算法问题。
三、 出乎意料的代码二
直接上代码
public static void main(String[] args) {
TimeTest test = new TimeTest();
test.strTest();
}
public void strTest(){
String[] str = new String[]{"Hello", "World!"};
List list = Arrays.asList(str);
str[0] = "ninhao";
System.out.println(list);
}
这段输出啥?很明显嘛,[Hello, World!]。Really?
说明:asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。因此
第一种情况: list.add("yangguanbao"); 运行时异常。
第二种情况: str[0] = "gujin"; 那么 list.get(0) 也会随之修改。
参考文献:《阿里巴巴Java开发手册1.4.0》