Java 陷阱

Posted by hurshi on 2019.07.29

陷阱1:equals

  1. 避免空指针:
    1
    2
    
     String str = null;
     if("value".equals(str)){...}
    
  2. 进一步:

    1
    
    Objects.equals(str,"value");
    

陷阱2: float, BigDecemal

  1. 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
    
  2. 解决方案:

    1
    2
    3
    
    BigDecimal a = new BigDecimal("1.0");
    BigDecimal b = new BigDecimal("0.9");
    System.out.println(a.compareTo(b));// 1
    
  3. BigDecimal 注意事项:

    1. 为防止精度损失,禁止使用 BigDecimal(double) 的方式把 double 值转化为 BigDecimal 对象。
    2. 使用 BigDecimal(String) 的方式初始化,或者 BigDecimal.valueof()。
  4. 摘自:Java 疑难点

陷阱3: Arrays.asList

  1. 陷阱:使用Arrays.asList()把数组转为集合的时候,返回的是 Arrays 的内部 ArrayList, 而这个 ArrayList 并没有实现 add / remove / clear 方法,所以调用它们会报 UnsupportedOperationException 异常。

  2. 解决方案:

    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);
    
  3. 摘自:Java 疑难点

陷阱4: ArrayList.subList

  1. 陷阱:使用ArrayList.subList()返回的 List 是一个实现了 AbstractList 的内部类 – SubList,而这个 SubList 并没有自己的 array,而是直接引用了外部 ArrayList 的一部分,所以称之为“视图”。所以对 SubList 或者外部 ArrayList 的增删操作都会相互影响,甚至报错。

  2. 解决方案

    1
    2
    
    // 需要对 subList 作出修改,又不想影响原 list,可以创建 list 的拷贝
    sublist = Lists.newArrayList(subList);
    
  3. 摘自:为什么要谨慎使用ArrayList中的subList方法