Java的一些细节

字符串比较

用equals比较,不要用“==" 比较, 后者比较的是地址
且推荐当在拿一个String变量和一个常量字符串比较时,总是把常量字符串写在左边,即
“hello”.equals(hello)
这样就省了检查hello变量是否为空指针的过程(如果写成hello.equals(“hello”)时,则要检查hello是否为null,否则报异常)。

字符串null和“”

前者是空引用,后者是一个字符串,不过值是空的。

非静态成员函数的参数

每个类的非静态函数的第0个参数是一个指向对象的指针。每次调用非静态函数时,从方法区找到对应的函数,并将this指针传过去,以让函数访问到对象的非静态成员。

switch的NullPointerException问题

Java的switch目前支持如下类型:

  如果以String作为入参的话,那么当String参数为空时,会报空指针异常。所以一定要在进入switch方法体前检查参数是否为空。 (阅读阿里巴巴Java开发手册收获1)

包装类型的比较问题

int基本类型的包装类是Integer,long基本类型的包装类是Long,如果使用==进行比较的话,可能会出错,==对于操作数是引用类型时比较的是地址,特别的对于Integer包装类型,当给其类型的引用赋予一个在[-127,128]之间的值时,所有在这个区间内的被赋予了相同值的引用,指向的都是一个对象,因此用==作比较会返回true,但是在这个区间外的值,用==作比较会返回false。所以所有的包装类型进行比较时,都应该使用equals方法来比较大小。(阅读阿里巴巴Java开发手册收获2)

Double类型的精度问题

Java的double无法控制精度,需要将其转换为decimal对象,对decimal对象设置精度后,在转换回double即可实现设置double类型数据精度的目的。

字符串相加问题

Java编译器会对字符串相加会用StringBuilder进行优化,因此下方的代码

String a="abc"+"def";

等同于:

String a=(new StringBuilder()).append("abc").append("def").toString();

如果是这样的代码:

String a="abc"+null;

则a为:

abcnull

StringBuilderappend方法做了处理。会把null变为字符串"null"。

Collectors.toMap()的坑

使用此方法时,当value为null的时候,会报NPE错误

BigDecimal比较

不要使用equals比较,equals比较当两个实际上值相等的BigDecimal的在scale不一样时,也会返回false,在以字符串初始化BigDecimal时会出现这种情况。比如:

//print false
System.out.println(new BigDecimal("0.00").equals(BigDecimal.ZERO));

建议使用compareTo犯方法。
如果以非字符串形式初始化BigDecimal时则不会出现这种情况。比如:

//print true
System.out.println(new BigDecimal(0.00).equals(BigDecimal.ZERO));

原因在于以这种形式初始化的BigDecimal的scale是0,对0.00这种是做了处理的。

PS:
计算最好用BigDecimal或者double进行计算,使用float可能会出现与预期不符的情况

//print 471449.53
System.out.println(float)(47144954)/100);
//print 471449.54
System.out.println((double)(47144954)/100);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值