博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中==规则
阅读量:5064 次
发布时间:2019-06-12

本文共 2626 字,大约阅读时间需要 8 分钟。

  • 普通对象==

一般说来,java中的==指的是比较两个对象的内存地址是否相同。同时,在java中,一旦使用new关键字,则说明在内存中开辟了一段空间,用于存储对象。

假设我们有一个Person类,请看下面的代码:

class Person{}public class Hello{    public static void main(String[] args) throws Exception    {        Person p1 = new Person();        Person p2 = new Person();        Person p3 = p1;        System.out.println(p1 == p2);//false        System.out.println(p1 == p3);//true        System.out.println(p2 == p3);//false    }}

第一个输出false,因为p1和p2都用new关键是生成了实例,p1和p2分别指向两块内存空间。

第二个输出true,因为p1将地址赋值给了p3,p1和p3同时指向一块空间。

第三个输出false,因为p3指向的是p1开辟的空间,p1和p3完全等价。p2指向另一块空间,p2==p3显然不成立。

 

  • String中的==

这是一般意义上的类和实例的内存分配规则。然后当遇到String类的时候,会有一点点变化。因为Java中String的不可变原则,使得用字面值“XXX”复制给一个String变量的时候,被赋值的变量永远指向同一块区域。请看下面的代码:

1 public class Hello 2 { 3     public static void main(String[] args) throws Exception 4     { 5         String s1 = "XXXX"; 6         String s2 = new String("XXXX"); 7         System.out.println(s1 == "XXXX");//true 8         System.out.println(s2 == "XXXX");//false 9         System.out.println(s1 == s2);//false10     }11 }

在讲解输出结果前,大家先树立一个概念,就是当遇到字面值的字符串的时候(如"XXXX"),它就代表了内存中的一个永远不会改变的对象

第一行输出true,因为上面说过,"XXXX"无论出现在程序的哪个地方,它都永远是同一个对象。代码第5行将"XXXX"地址给了s1,所以s1就指向了"XXXX",所以第7行输出true。

第二行输出false,因为代码第6行使用了new关键字,实例化了一个全新的字符串对象,开辟了一块全新的空间(任何时候使用new都会开辟新空间),所以s2指向的地址和"XXXX"完全不同。

第三行输出false,因为s1指向的是"XXXX"的地址,而s2使用nwe新开辟地址,所以s1地址不等于s2地址。

 

  • 整数数字对象==

当遇到数字对象使用==比较的时候又有一点变化,原则如下:

  1. 当==两边任意一边有字面值(如 100)的时候,则只会比较其真实值。
  2. 当==两边都没有字面值时,等号两边的任意一边变量如果使用new关键字实例化,结果为false。
  3. 当等号两边的变量都不是使用new关键字实例化时,有两种情况: 1 数值在-127到+128之间,比较结果为true,否则为false

 

请看下面的代码:

1 public class Hello 2 { 3     public static void main(String[] args) throws Exception 4     { 5         { 6             Integer a = 100; 7             Integer b = new Integer(100); 8              9             //当==两边任意一边有字面值(如 100)的时候,则只会比较其真实值。10             System.out.println(a == 100);//true11             System.out.println(b == 100);//true12         } 13         14         {15             Integer a = 100;16             Integer b = new Integer(100);17             //当==两边都没有字面值时,等号两边的任意一边变量如果使用new关键字实例化,结果为false。18             System.out.println(a == b);//false19         }20         21         {22             Integer a = 100;23             Integer b = 100;24             //当等号两边的变量都不是使用new关键字实例化时,有两种情况:25             //1 数值在-127到+128之间,比较结果为true26             System.out.println(a == b); //true27             28             a = 500;29             b = 500;30             //2 数值在-127到128之外比较结果为false31             System.out.println(a == b);//false32         }33     }34 }

Java中的==是一个非常让人难以理解的概念。

 

欢迎加入QQ群参与讨论. 422683877

转载于:https://www.cnblogs.com/kuillldan/p/7536483.html

你可能感兴趣的文章
Objective - C基础: 第四天 - 10.SEL类型的基本认识
查看>>
Android TextView加上阴影效果
查看>>
《梦断代码》读书笔记(三)
查看>>
Java8 Lambda表达应用 -- 单线程游戏server+异步数据库操作
查看>>
[Unity3D]Unity3D游戏开发MatchTarget的作用攀登效果实现
查看>>
AngularJS学习篇(一)
查看>>
关于Xshell无法连接centos6.4的问题
查看>>
css3动画——基本准则
查看>>
输入月份和日期,得出是今年第几天
查看>>
pig自定义UDF
查看>>
Kubernetes 运维学习笔记
查看>>
spring security 11种过滤器介绍
查看>>
代码实现导航栏分割线
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
【AS3代码】播放FLV视频流的三步骤!
查看>>
枚举的使用
查看>>
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
日志框架--(一)基础篇
查看>>
关于源程序到可运行程序的过程
查看>>
转载:mysql数据库密码忘记找回方法
查看>>