自动装拆箱,equals()与“==”用法总结
本文最后更新于9 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
  1. 当两边比较的操作数都是八大基本数据类型时,’==’比较的就是左右两边的值;当比较的对象都是引用数据类型(即对象)时,’==’比较的还是两边对象地址的值是否相同,此时宏观上可以理解为两边比较的就是”对象”本身;
  2. equals()方法必须接受一个(Oject obj)形参(也即引用数据类型),所以基本数据类型不存在equals方法,int i = 1; 不管形参如何,i.equals()都一定会报错
  3. 在未被重写前,equals()方法的底层实现就是return (this== obj) ,对两个引用数据类型(即对象)之间的比较与’==’原理相同(即比较地址),返回相同结果;
  1. 对于基本数据类型对应的所有八个包装类以及其他自定义对象,当涉及到运算符之间的操作(如+ – 等算术运算符,==等逻辑运算符,赋值等其他组运算符)时,由于对象之间不能直接运算,所以都会触发自动装箱或拆箱操作,具体要看两边的对象类型而定;
  1. 只有当运算符作用于包装类时(例如 Integer a = 1; a + 1;),才会触发自动拆箱;运算不会触发装箱(比如 int + Integer,是 Integer 拆箱,而不是 int 装箱)
  2. 自动装箱的两种常见场景:赋值 和 方法调用
  1. 如果‘==’两边的对象类型为基本数据类型和对应的包装类,此时也一定会对包装类触发自动拆箱来比较两边操作数的值(而不是自动装箱)
  2. 当equals()实际用于String,Integer等包装类时会在包装类内部被重写,重写后的效果就变成了比较”对象里的内容的值”而不是对象地址,此时结果可能与’==’不同;
  3. 对于以下代码:
Integer a = 1;  // 赋值运算符 , 此时一定会触发自动装箱操作,下面的b-h同理
Integer b = 2;  
Integer c = 3; 
Integer d = 3;
Integer e = 321; 
Integer f = 321; 
Long g = 3L; 
Long h = 2L; 

//True,因为 3属于[-128, 127] 的 Integer 缓存范围,两者指向同一个缓存对象
System.out.println(c==d);
//False,因为 321超出了缓存范围,此时自动装箱会创建两个不同的对象,地址不同  
System.out.println(e==f);   

//True a+b包装类相加触发自动拆箱计算结果为基本数据类型int 3,对包装类c再次触发自动拆箱,左右值相同
System.out.println(c==(a+b)); 
/* True 重写后的equals()先判断(a+b)是不是Integer的实例->自动装箱(Integer) (a+b)再判断值 与c是否相等,结果相同。
实际上比较的是`c`(Integer对象)和`拆a+拆b`后的自动装箱后的Integer对象(缓存对象)*/
System.out.println(c.equals(a+b)); 
//True a+b包装类相加触发自动拆箱->结果为int 3,JVM提升为long,包装类c触发自动拆箱为3L,左右值相同

System.out.println(g==(a+b)); 
//False 重写后的equals直接判断(a+b)的结果(int 3)是否是 Long格式,不是直接返回 false
System.out.println(g.equals(a+b)); 
//True a+h自动拆箱->int+long->自动提升为long 3->自动装箱为Long,与g中存储的内容3L类型和值均一致
System.out.println(g.equals(a+h));,
  1. 再比如,对于如下代码
Integer i1 = 100;
Integer i2 = 100; 
Integer i3 = 200; 
Integer i4 = 200; 
Integer one=new Integer(100); 
Integer two=new Integer(100); 

System.out.println(i1==i2); //True,因为 100属于[-128, 127] 的 Integer 缓存范围,两者指向同一个缓存对象
System.out.println(i3==i4); //False,因为 200超出了缓存范围,此时自动装箱会创建两个不同的对象,地址不同
System.out.println(one==two); //False,因为两边都是新创建的对象,即使内部存储的值一致但地址不同
System.out.println(i1==100); //True 为了比较值必须对i1执行自动拆箱,两者值均为100 
System.out.println(i1==one); //False 包装类与包装类的地址比较,i1是缓存对象,one是新创建对象,地址不同
啥也不是散会
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇