码迷,mamicode.com
首页 > 编程语言 > 详细

java面试 (六)

时间:2019-11-02 16:06:09      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:指针   实例   math   构造参数   ring   ltm   turn   情况下   collect   

1 String.split(String regex), 传入的参数是正则表达式,有一些特殊字符(比如.[]()\| 等)需要转义。

2  关于枚举类型,一般用作常量,理想情况下,枚举中的属性字段是私有的,并在私有构造函数中赋值,没有对应的 Setter 方法,最好加上 final 修饰符。

public enum PersonSex2 {
MALE("", "man"),
FEMALE("", "female");

// value/description用final,因为一般枚举类型被用作常量,不可以修改
private final String value; // value可以是其他类型,一般用int
private final String description; // description 一般用String。

// 构造函数用private,是因为不想在外部被实例化。
private PersonSex2(String value, String description) {
this.value = value;
this.description = description;
}

// 只有get方法,没有set方法,是因为不会setter。
public String getValue() {
return value;
}

public String getDescription() {
return description;
}
}

 3 返回空数组和空集合而不是 null

  返回 null ,需要调用方强制检测 null ,否则就会抛出空指针异常。返回空数组或空集合,有效地避免了调用方因为未检测 null 而抛出空指针异常,还可以删除调用方检测 null 的语句使代码更简洁。

    public static List<String> getResults() {
        return new ArrayList<>(0);
    }

    public static List<String> getResultList() {
        return Collections.emptyList();
    }

    public static Map<String, String> getResultMap() {
        return Collections.emptyMap();
    }

 4 禁止使用构造方法 BigDecimal(double)

  浮点数进行计算,有精度损失,不准确,如下(Java中float的精度为6-7位有效数字。double的精度为15-16位):

 

System.out.println(0.05 + 0.01);
System.out.println(1.0 - 0.42);
System.out.println(4.015 * 100);
System.out.println(123.3 / 100);

0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
很有可能造成我们手中有0.06元,却无法购买一个0.05元和一个0.01元的商品。因为如上所示,他们两个的总和为0.060000000000000005。这无疑是一个很严重的问题,尤其是当电商网站的并发量上去的时候,出现的问题将是巨大的。可能会导致无法下单,或者对账出现问题
 
在《Effective Java》中提到一个原则,那就是float和double只能用来作科学计算或者是工程计算,但在商业计算中我们要用java.math.BigDecimal,通过使用BigDecimal类我们可以解决上述问题。
 
我们在使用BigDecimal时,使用它的BigDecimal(String)构造器创建对象才有意义。其他的如BigDecimal b = new BigDecimal(1)这种,还是会发生精度丢失的问题 BigDecimal a = new BigDecimal(1.01);
 BigDecimal b = new BigDecimal(1.02);
 BigDecimal c = new BigDecimal("1.01");
 BigDecimal d = new BigDecimal("1.02");
 
System.out.println(a.add(b)); // a和b是用float构造的,也有精度损失
System.out.println(c.add(d)); // c和d是用String 类型构造的,没有精度损失
2.0300000000000000266453525910037569701671600341796875 2.03
long可以准确存储19位数字,而double只能准备存储16位数字。double由于有exp位(次方),可以存16位以上的数字,但是需要以低位的不精确作为代价。如果需要高于19位数字的精确存储,则必须用BigInteger来保存,当然会牺牲一些性能。所以我们一般使用BigDecimal来解决商业运算上丢失精度的问题的时候,声明BigDecimal对象的时候一定要使用它构造参数为String的类型的构造器。
  float和double只能用来做科学计算和工程计算。商业运算中我们要使用BigDecimal
在实际中,DB中存储的一般是float和doubel类型的,需要转换成为String再用,所以这里从网上抄袭了一个工具类,仅供参考:
/**
 * @author: Ji YongGuang.
 * @date: 19:50 2017/12/14.
 */
public class BigDecimalUtil {

    private BigDecimalUtil() {

    }

    public static BigDecimal add(double v1, double v2) {// v1 + v2
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2);
    }

    public static BigDecimal sub(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2);
    }

    public static BigDecimal mul(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2);
    }

    public static BigDecimal div(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        // 2 = 保留小数点后两位   ROUND_HALF_UP = 四舍五入
        return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);// 应对除不尽的情况
    }
}

 

java面试 (六)

标签:指针   实例   math   构造参数   ring   ltm   turn   情况下   collect   

原文地址:https://www.cnblogs.com/liufei1983/p/11782304.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!