• 普通对象==

一般说来,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. C#开发邮件收发(同步)

    发邮件界面: 收邮件界面: 先分析邮件发送类 邮件发送类使用smtp协议,这里以QQ邮箱为例 using System; using System.Collections.Generic; using ...

  2. TextBox Ctrl+A不能全选的问题

    问题: 当TextBox控件在设置了MultiLine=True之后,Ctrl+A 无法全选,十分影响使用体验. 对于这个问题不明所以,不知道是Bug,还是故意而为之... 解决1: 添加KeyDow ...

  3. 【BZOJ4827】 [Hnoi2017]礼物

    BZOJ4827 [Hnoi2017]礼物 Solution 如果一串数的增加,不就等于另一串数减吗? 那么我们可以把答案写成另一个形式: \(ans=\sum_{i=1}^n(x_i-y_i+C)^ ...

  4. 【kuangbin专题】计算几何_凸包

    1.poj1113 Wall 题目:http://poj.org/problem?id=1113 题意:用一条线把若干个点包起来,并且线距离任何一个点的距离都不小于r.求这条线的最小距离是多少? 分析 ...

  5. MySQL 中文字符集排序

    SELECT 字段名 FROM 表 ORDER BY CONVERT(字段名 USING gbk) ASC;

  6. 使用 kafkat 在线扩缩容 kafka replicas

    本文档应用环境为 kafka-0.8.2.0, 其余版本请先行测试 场景 线上很多 kafka 的 topic 的副本数为1,这样的设置丧失了 kafka 高可用的特性,所以我们需要把 topic 的 ...

  7. js的相关函数封装(正则表达式,获取url参数,时间格式化)

    一:// 验证中文名称 function isChinaName(name) { var pattern = /^[\u4E00-\u9FA5]{1,6}$/ return pattern.test( ...

  8. flask框架--模板

    今天又是一个精彩又无聊的一天,不过随着知识的缓慢的增加我的内心也充满了干劲,虽然前进的有些缓慢 但我不会这么容易放弃的,一定要相信自己,不要灰心 好了 ~ 不说废话了 , 我自己听的都有些受不了了 . ...

  9. Service Fabric学习-从helloworld开始(无状态服务)

    原先做服务器程序, 都是部署在xx云上, 也没理解云是个啥, 不就是个服务器(虚拟机)租赁商吗? 好吧, 其实这个是IaaS, 而接下来要学习的ServiceFabric(以下简称SF)是PaaS. ...

  10. 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 1、两层神经网络的单样本向量化表示与多样本向量化表示

    如上图所示的两层神经网络, 单样本向量化:                                                                                ...