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