Java基础01——==与equals、自动装箱

64 阅读2分钟

​​​本文已参与「新人创作礼」活动,一起开启掘金创作之路。

==和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没有指向对象实例,因此编译后使用空引用调用了方法,导致产生了空指针异常。