本文已参与「新人创作礼」活动,一起开启掘金创作之路。
==和equals的区别?
== :比较两个基本数据类型的值
,比较两个引用类型的地址
。
equals :(Object类的方法)比较两个引用类型的地址
(基于== ),java重写了Srting类、Integer类、Date类的equals()方法,比较的是值
。
装箱与拆箱
自动装箱:
装箱:把基本数据类型转换为对应的包装类类型。
自动装箱:基本类型的数据处于需要对象的环境中时,编译器自动调用类的valueOf() 将其转为 “对象” 。
注意Integer的预缓存对象
Integer i = 5; //代码
Integer i = Integer.valueOf(5);//编译器转换,自动装箱
只需Integer i = 5这样的语句就能实现基本数据类型转换成包装类,这是因为编译器为我们执行了Integer i = Integer.valueOf(5)这样的操作,这就是Java的自动装箱。
注意:特殊情况 -128和127
(Byte,Short,Integer,Long等包装类)Integer.valueOf(int/String num);源代码如下
“valueOf()会返回一个Integer(整型)对象,当被处理的字符串或数字在**-128和127**(包含边界)之间时,返回预先缓存的对象。”,因此用该方法获得[-128,127]的对象,相同的数值获得是相同的对象。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
自动拆箱:
拆箱:把包装类类型转换为对应的基本数据类型。
自动拆箱:包装类的对象所处代码环境需要基本数据类型时,编译器自动调用对象的intValue() 、doubleValue() 等方法将其转为基本数据类型。 注意空指针
Integer i = 5;
int j = i; //代码
int j = i.intValue()//编译器转换,自动拆箱
注意:可能导致空指针异常的情况,一个包装类类型的变量指向了null,自动拆箱时,编译器依然会自动调用对应的方法,不会识别出问题,但运行时会报空指针异常的错误。
public class Test1 {
public static void main(String[] args) {
Integer i = null;
int j=i;
//在编译时期是合法的,但是在运行时期会有错误,因为其相当于:
int j = i.intValue();
}
}
null表示i没有指向对象实例,因此编译后使用空引用调用了方法,导致产生了空指针异常。