• 普通对象==

一般说来,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地址。

  • 整数数字对象==

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

  1. 当==两边任意一边有字面值(如 100)的时候,则只会比较其真实值。
  2. 当==两边都没有字面值时,等号两边的任意一边变量如果使用new关键字实例化,结果为false。
  3. 当等号两边的变量都不是使用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中==规则的更多相关文章

  1. Java中的标识符,类名和包名规则

    Java中的包.类.方法.参数和变量的名称 标识符的命名规则 1.变量必须以字母.下划线(_)或美元符号($)开头 2.余下的字符可以是下划线.美元符号或任何的字母或数字 3.不能使用JavaScri ...

  2. [转帖]关于Java中SQL语句的拼接规则

    关于Java中SQL语句的拼接规则 自学demo 的时候遇到的问题 结果应该是 '"+e.getName()+"' 注意 一共有三组标点符号 (除去 方法函数后面的括号) 实现目标 ...

  3. Java中动态规则的实现方式

    背景 业务系统在应用过程中,有时候要处理“经常变化”的部分,这部分需求可能是“业务规则”,也可能是“不同的数据处理逻辑”,这部分动态规则的问题,往往需要可配置,并对性能和实时性有一定要求. Java不 ...

  4. JAVA中取余(%)规则和介绍

    在java中%的含义为取余. java :a%b 数学公式a%b=a-(a/b)*b

  5. 慕课网-安卓工程师初养成-2-7 Java中变量的使用规则

    来源:http://www.imooc.com/code/1242 不得不接受的变量小脾气: 1.Java 中的变量需要先声明后使用 2.变量使用时,可以声明变量的同时进行初始化,也可以先声明后赋值 ...

  6. 关于Java中SQL语句的拼接规则

    实现目标语句是这个注意,这里的java变量是idd int idd; String sql = "SELECT id, piUrl FROM picinfos WHERE id BETWEE ...

  7. Java中变量的使用规则

    不得不接受的变量小脾气: 1.Java 中的变量需要先声明后使用 2.变量使用时,可以声明变量的同时进行初始化 , 也可以先声明后赋值 3.变量中每次只能赋一个值,但可以修改多次 4.main 方法中 ...

  8. java中的移位运算符:<<,>>,>>>总结

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  9. 深入理解Java中的String

    一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class String implements java.io.Ser ...

随机推荐

  1. 【BZOJ2882】 工艺(SAM)

    传送门 BZOJCH 洛谷 Solution 这个东西要求的不就是最小表示法吗? 把原串复制一遍然后都加到后缀自动机里面去. 用个map跑一下,这样子可以保证每一次选的是最小字典序的. 然后跑\(n\ ...

  2. Android---------------解决bug的关键点

    一.抛出异常,打出异常的的堆信息 System.err.print("ceshi");      e.printStackTrace();     Log.i("cesh ...

  3. vscode卡死问题

    网上有人说是和淘宝镜像冲突,也不知啥原因,接下来一下操作会好点: 文件->首选项->设置,搜索search.followSymlinks,把对勾去掉就行 1.修复vs code 造成 rg ...

  4. Python运维脚本整理

    Python 实现的自动化服务器管理 import sys import os import paramiko ssh = paramiko.SSHClient() ssh.set_missing_h ...

  5. cmd命令关闭占用程序的端口

    遇到的问题: 在重新启动tomcat服务时,启动失败,显示的信息大概为:Error running 'cus_manager_system': Unable to open debugger port ...

  6. flask_ Mongodb 的语法-排序

    MOngoDB的排序是挺有用的   ,跟MySQL有明显的区别 .. 它的原生语法的第一个参数为条件限定,第二个参数为排序字段 db.news.find({},{'_id':1})   #1是升序  ...

  7. 【xsy2194】Philosopher set+线段树合并

    题目大意:给你一个长度为$n$的序列,有$m$次操作,每次操作是以下两种之一: 对某个区间内的数按照升序/降序排序,询问某个区间内数的积在十进制下首位数字是多少. 数据范围:$n,m≤2\times ...

  8. ThreadLocal是否会引发内存泄露的分析 good

    这篇文章,主要解决一下疑惑: 1. ThreadLocal.ThreadLocalMap中提到的弱引用,弱引用究竟会不会被回收? 2. 弱引用什么情况下回收? 3. JAVA的ThreadLocal和 ...

  9. Silverlight中使用MVVM(3)—进阶

    这篇主要引申出Command结合MVVM模式在应用程序中的使用 我们要做出的效果是这样的 就是提供了一个简单的查询功能将结果绑定到DataGrid中,在前面的基础上,这个部分相对比较容易实现了 我们在 ...

  10. [Java初探08]__简单学习Java类和对象

    前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...