Java语法细节 - try_finally和set相关

try-catch-finally的关系

​ 在try-block中即使出现了异常,finally也会被执行,需要注意的是,如果在try-block中return的是引用类型,在finally中对该引用类型进行修改,会导致最终的return类型也被修改。

try {

//即使有return语句,finally也会被执行

returnb;

} catch (Exception e) {

// TODO: handle exception

}

finally {
     System.out.println("finally block 会覆盖try中的return!");
     return 1000;    //不建议在finally中进行return,现在的编译器会对该行为发出警告信息,如果返回值为引用类型,那么finally中的操作还会改变预期的返回值

}

TreeSet和HashSet的实现原理和区别

​ 这两个实际上都是调用的TreeMap和HashMap来实现的,因为map的key值是唯一的,所以jdk便利用这一特性实现了set相关的功能

BigDecimal中的一些坑

​ BigDecimal在构造方法中,传入Integer和String会表现出和预期不一样的结果,具体如下面的代码所示:

BigDecimal one = new BigDecimal("1.0");    //有冒号,下面才会出现这种情况,无冒号则按照预期工作
BigDecimal two = new BigDecimal("1.00");   //无冒号的话,会被退化为1
System.out.println(one);   //=> 1.0
System.out.println(two);   //=> 1.00

//注意,是不相等的
System.out.println("equals:" + one.equals(two));  //=> false

//比较出来的结果是0,也就是相等
System.out.println("compareTo:" + ((Comparable<? super BigDecimal>)one).compareTo(two));

//也就是说,对于BigDecimal的equal和CompareTo方法,两者的表现是不一样的。

当BigDecimal在HashSet/HashMap和TreeSet/TreeMap中使用时

​ HashSet/HashMap和TreeSet/TreeMap两者在比较的时候,使用了不同的方式,因此在Hash和Tree中,

HashSet<BigDecimal> hashSet = new HashSet<BigDecimal>();
hashSet.add(one);
hashSet.add(two);
System.out.println("HASHSET:" + hashSet);    // hashset里面会有one和two,因为hashset调用的是equals方法

TreeSet<BigDecimal> treeSet = new TreeSet<BigDecimal>();
treeSet.add(one);
treeSet.add(two);

System.out.println("TREESET:" + treeSet);   //但是treeset里面只有一个,因为treeset去重时使用的是compareTo

//导致这样的结果根本原因是TreeMap和HashMap在加入key-value时对key的判断,TreeMap使用compareTo,但是HashMap使用的却是equals
//注意BigDecimal的一些特殊行为:
BigDecimal one = new BigDecimal("1.0")   =>实际值为1.0
BigDecimal one = new BigDecimal(1.0)   =>实际值为1
posted @ 2019-04-14 23:15  不晓得叫什么  阅读(214)  评论(0编辑  收藏  举报