目录
字符串比较
用equals比较,不要用“==" 比较, 后者比较的是地址
且推荐当在拿一个String变量和一个常量字符串比较时,总是把常量字符串写在左边,即
“hello”.equals(hello)
这样就省了检查hello变量是否为空指针的过程(如果写成hello.equals(“hello”)时,则要检查hello是否为null,否则报异常)。
字符串null和“”
前者是空引用,后者是一个字符串,不过值是空的。
非静态成员函数的参数
每个类的非静态函数的第0个参数是一个指向对象的指针。每次调用非静态函数时,从方法区找到对应的函数,并将this指针传过去,以让函数访问到对象的非静态成员。
switch的NullPointerException问题
Java的switch目前支持如下类型:
包装类型的比较问题
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
StringBuilder
的append
方法做了处理。会把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);