1 接口类中的方法和变量都不要加任何的修饰符号,public也不要加。因为经过编译的class文件会自动加上这些
public interface CalInterface { float PI = 3.14159f;//定义用于表示圆周率的常量PI float getArea(float r);//定义一个用于计算面积的方法getArea() float getCircumference(float r);//定义一个用于计算周长的方法getCircumference() }
public abstract interface CalInterface { public static final float PI = 3.14159F; public abstract float getArea(float paramFloat); public abstract float getCircumference(float paramFloat); }
2 Float型,DOUBLE型计算问题
如果涉及到小数运算,对于float和double型,不能够使用‘+’,'-' '=='等运算。必须转成BigDecimal
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
BigDecimal c = new BigDecimal("0.8");
BigDecimal x = a.subtract(b);
BigDecimal y = b.subtract(c);
if (x.compareTo(y) == 0) {
System.out.println("true");
}
如上所示 BigDecimal 的等值比较应使用 compareTo()方法,而不是 equals()方法。
说明:equals()方法会比较值和精度(1.0 与 1.00 返回结果为 false),而 compareTo()则会忽略精度。
禁止使用构造方法 BigDecimal(double)的方式把 double 值转化为 BigDecimal 对象。
说明:BigDecimal(double)存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。
如:BigDecimal g = new BigDecimal(0.1F); 实际的存储值为:0.10000000149
正例:优先推荐入参为 String 的构造方法,或使用 BigDecimal 的 valueOf 方法,此方法内部其实执行了
Double 的 toString,而 Double 的toString 按 double 的实际能表达的精度对尾数进行了截断。
BigDecimal recommend1 = new BigDecimal("0.1"); BigDecimal recommend2 = BigDecimal.valueOf(0.1);
3 集合变成数组
List<String> list = new ArrayList<>(2);
list.add("guan");
list.add("bao");
String[] array = list.toArray(new String[0]);
注意,toArray方法入参必须是长度是0,通过自适应创建性能是最好的
4 数组变集合
String[] str = new String[] { "chen", "yang", "hao" };
List list = Arrays.asList(str);
注意,返回的List是
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable {
该ArrayList是Arrays的内部类,它不支持add,remove,clearall等方法