陷阱1:equals
- 避免空指针:
1 2
String str = null; if("value".equals(str)){...}
-
进一步:
1
Objects.equals(str,"value");
陷阱2: float, BigDecemal
-
float 不能使用 == 来比较大小,如:
1 2 3 4 5
float a = 1.0f - 0.9f; float b = 0.9f - 0.8f; System.out.println(a);// 0.100000024 System.out.println(b);// 0.099999964 System.out.println(a == b);// false
-
解决方案:
1 2 3
BigDecimal a = new BigDecimal("1.0"); BigDecimal b = new BigDecimal("0.9"); System.out.println(a.compareTo(b));// 1
-
BigDecimal 注意事项:
- 为防止精度损失,禁止使用 BigDecimal(double) 的方式把 double 值转化为 BigDecimal 对象。
- 使用 BigDecimal(String) 的方式初始化,或者 BigDecimal.valueof()。
-
摘自:Java 疑难点
陷阱3: Arrays.asList
-
陷阱:使用
Arrays.asList()
把数组转为集合的时候,返回的是 Arrays 的内部 ArrayList, 而这个 ArrayList 并没有实现 add / remove / clear 方法,所以调用它们会报 UnsupportedOperationException 异常。 -
解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// 方法1: List list = new ArrayList<>(Arrays.asList("a","b","c")); // 方法2,使用 Guava: List<String> il = ImmutableList.of("a","b"); List<String> il = ImmutableList.copyOf(aStringArray); List<String> l1 = Lists.newArrayList(anotherListOrCollection); List<String> l2 = Lists.newArrayList(aStrignArray); List<String> l3 = Lists.newArrayList("a","b","c"); // 方法3,使用 Apache Commons Collections: List<String> list = new ArrayList<String>(); CollectionUtils.addAll(list, str);
-
摘自:Java 疑难点
陷阱4: ArrayList.subList
-
陷阱:使用
ArrayList.subList()
返回的 List 是一个实现了 AbstractList 的内部类 – SubList,而这个 SubList 并没有自己的 array,而是直接引用了外部 ArrayList 的一部分,所以称之为“视图”。所以对 SubList 或者外部 ArrayList 的增删操作都会相互影响,甚至报错。 -
解决方案
1 2
// 需要对 subList 作出修改,又不想影响原 list,可以创建 list 的拷贝 sublist = Lists.newArrayList(subList);