万万没想到之代码出错了?

一、背景

今天碰到两段有意思的代码,分享一下。你认为的“理所当然"是对的?

二、出乎意料的代码一

直接上代码:

    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的算法问题。

具体解释:我被这个浏览了 746000 次的问题惊住了!

三、 出乎意料的代码二

直接上代码

    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》

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值