数值型数据的String和char比较
雷点1
刷leetcode时,比较String和char数值型数据时遇到的问题。
String [] s = new String[] {“1”,“2”, "3"};
char c = '3';
if(Integer.valueOf(s[2]) == Integer.valueOf(c)){
return 2;
}
return 1;
结果返回1。
首先我们来巩固一下Integer.valueOf()的参数有哪些类型。
1.Integer.valueOf(String s)
2.Integer.valueOf(String s ,int radix)
3.Integer.valueOf(int i)
因为Integer.valueOf(char)这个方法本身不存在,Java会进行隐式类型转换(char类型比int型精度低),把char类型的数据当成int类型的数据来处理,所以’3’其实会被转化成它的ASCII码,因此就不相等了。
雷点2
这个雷点是我很久之前遇到过的,也是再回顾一下,场景是将char数组和String存储的int数值进行比较。如果这个数值是-128-127范围内的不会有什么问题,但是如果超过这个范围,会出现一个很有意思的情况。
假设我们最终都得到了一个Integer数据
Integer i1 = 128;
Integer i2 = 128;
System.out.println(i1 == i2); // 结果是false
System.out.println(i1.equals(i2)); // 结果true
首先看i1 == i2,在Java中对于基本数据类型,比较的是它们的值,而非基本数据类型比较的是它们的地址。再结合Integer的创建过程,对于-128 - 127数值,Integer类会直接将它放到cache数组内,而大于这个值的则需要进行扩容,并开辟一个新的空间。因此,这两个对象的存储地址不同,对应的结果就为true。
i1.equals(i2)这是Object中的方法,默认是比较地址值,但在Integer、String等类中被重载申明了,Integer类中比较的是大小,所以结果为true。