Java中==规则
- 普通对象==
一般说来,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变量的时候,被赋值的变量永远指向同一块区域。请看下面的代码:
public class Hello
{
public static void main(String[] args) throws Exception
{
String s1 = "XXXX";
String s2 = new String("XXXX");
System.out.println(s1 == "XXXX");//true
System.out.println(s2 == "XXXX");//false
System.out.println(s1 == s2);//false
}
}
在讲解输出结果前,大家先树立一个概念,就是当遇到字面值的字符串的时候(如"XXXX"),它就代表了内存中的一个永远不会改变的对象。
第一行输出true,因为上面说过,"XXXX"无论出现在程序的哪个地方,它都永远是同一个对象。代码第5行将"XXXX"地址给了s1,所以s1就指向了"XXXX",所以第7行输出true。
第二行输出false,因为代码第6行使用了new关键字,实例化了一个全新的字符串对象,开辟了一块全新的空间(任何时候使用new都会开辟新空间),所以s2指向的地址和"XXXX"完全不同。
第三行输出false,因为s1指向的是"XXXX"的地址,而s2使用nwe新开辟地址,所以s1地址不等于s2地址。
- 整数数字对象==
当遇到数字对象使用==比较的时候又有一点变化,原则如下:
- 当==两边任意一边有字面值(如 100)的时候,则只会比较其真实值。
- 当==两边都没有字面值时,等号两边的任意一边变量如果使用new关键字实例化,结果为false。
- 当等号两边的变量都不是使用new关键字实例化时,有两种情况: 1 数值在-127到+128之间,比较结果为true,否则为false
请看下面的代码:
public class Hello
{
public static void main(String[] args) throws Exception
{
{
Integer a = 100;
Integer b = new Integer(100); //当==两边任意一边有字面值(如 100)的时候,则只会比较其真实值。
System.out.println(a == 100);//true
System.out.println(b == 100);//true
} {
Integer a = 100;
Integer b = new Integer(100);
//当==两边都没有字面值时,等号两边的任意一边变量如果使用new关键字实例化,结果为false。
System.out.println(a == b);//false
} {
Integer a = 100;
Integer b = 100;
//当等号两边的变量都不是使用new关键字实例化时,有两种情况:
//1 数值在-127到+128之间,比较结果为true
System.out.println(a == b); //true a = 500;
b = 500;
//2 数值在-127到128之外比较结果为false
System.out.println(a == b);//false
}
}
}
Java中的==是一个非常让人难以理解的概念。
欢迎加入QQ群参与讨论. 422683877

Java中==规则的更多相关文章
- Java中的标识符,类名和包名规则
Java中的包.类.方法.参数和变量的名称 标识符的命名规则 1.变量必须以字母.下划线(_)或美元符号($)开头 2.余下的字符可以是下划线.美元符号或任何的字母或数字 3.不能使用JavaScri ...
- [转帖]关于Java中SQL语句的拼接规则
关于Java中SQL语句的拼接规则 自学demo 的时候遇到的问题 结果应该是 '"+e.getName()+"' 注意 一共有三组标点符号 (除去 方法函数后面的括号) 实现目标 ...
- Java中动态规则的实现方式
背景 业务系统在应用过程中,有时候要处理“经常变化”的部分,这部分需求可能是“业务规则”,也可能是“不同的数据处理逻辑”,这部分动态规则的问题,往往需要可配置,并对性能和实时性有一定要求. Java不 ...
- JAVA中取余(%)规则和介绍
在java中%的含义为取余. java :a%b 数学公式a%b=a-(a/b)*b
- 慕课网-安卓工程师初养成-2-7 Java中变量的使用规则
来源:http://www.imooc.com/code/1242 不得不接受的变量小脾气: 1.Java 中的变量需要先声明后使用 2.变量使用时,可以声明变量的同时进行初始化,也可以先声明后赋值 ...
- 关于Java中SQL语句的拼接规则
实现目标语句是这个注意,这里的java变量是idd int idd; String sql = "SELECT id, piUrl FROM picinfos WHERE id BETWEE ...
- Java中变量的使用规则
不得不接受的变量小脾气: 1.Java 中的变量需要先声明后使用 2.变量使用时,可以声明变量的同时进行初始化 , 也可以先声明后赋值 3.变量中每次只能赋一个值,但可以修改多次 4.main 方法中 ...
- java中的移位运算符:<<,>>,>>>总结
java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >& ...
- 深入理解Java中的String
一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class String implements java.io.Ser ...
随机推荐
- .net下WinDbg使用说明
加载调试文件 .loadby sos mscorwks #.Net 3.5版本及以下 .loadby sos clr #.Net 4.0 WinDbg的基本命令 !threads #显示所有线程 !d ...
- 常用Java集合类总结
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 7.1.List(允许重复元素) ArrayList: 底层数据结构:Object[] 在查询(get).遍 ...
- atom编辑器社区插件推荐
atom是github出品的文本编辑器,为开发者又提供了一款易用.牛逼的文本编译器.在开始接触前端并从工作开始一直用webstrom来进行前端开发,开始使用时,被他各种强大神奇的功能给折服:支持zen ...
- 安装openvpn
1.安装服务器端openvpn yum install -y openvpn easy-rsa 如果已存在的yum源中找不安装文件,则可通过以下安装epel yum源 rpm -ivh http:/ ...
- 编译lua-5.3.5时出错解决方法
问题描述: 执行 make linux test 过程出现错误,错误信息如下: “ lua.c:82:31: fatal error: readline/readline.h: No such fil ...
- POJ 2782
#include <iostream> #include <algorithm> #define MAXN 100005 using namespace std; int _m ...
- vtk文件编写
在paraview中加载vtk文件,可以很好的显示三维空间图像,如下cpp代码: #include <iostream> #include <fstream> #include ...
- Java你不知道的那些事儿—Java隐藏特性(上)
每种语言都很强大,不管你是像我一样的初学者还是有过N年项目经验的大神,总会有你不知道的东西.就其语言本身而言,比如Java,也许你用Java开发了好几年,对其可以说是烂熟于心,但你能保证Java所有的 ...
- spring boot 自动更新静态文件和后台代码 -- 热部署
在spring boot使用的过程中, 发现我修改了静态文件, 前台刷新后, 没有任何变化, 必须重新启动, 才能看到, 这简直不能让人接受. 那有什么方法来解决这个问题呢. Baidu之后, 得到了 ...
- Java 使用pipeline对redis进行批量读写
code import redis.clients.jedis.Jedis; import redis.clients.jedis.Pipeline; import java.util.List; p ...