“==”的作用:

判断两个变量栈内存中存储的值是否相等,如果相等返回true,如果不相等返回false。

有两种形式的比较需要用到比较运算符“==”,一是两个基本数据类型之间的比较,二是两个引用数据类型之间的比较。

1.两个基本数据类型之间的比较:

  八大基本数据类型:byte,short,int,long,double,folat,boolean,char,其中占一个字节的是byte和boolean,short和char占两个字节,int,float占四个字节,double和long占8个字节,这八种数据变量中直接存储其值,变量是在栈中存储的。

  因此:“==”比较基本数据类型时,比较的是值。

  JAVA 基本数据类型创建单个变量是不可以new的,因为new的都是对象。但创建基本数据类型数组时可以new,因为数组是对象。

int a = 5;
int b = 5;
int c = 6;
System.out.println(a == b);  // 5 == 5
System.out.println(a == c);  // 5 == 6

  创建了是三个基本数据类型的变量,他们在栈中存储的值就是其数值本身,栈中值由低到高依次为a(5)、b(5)、c(6)。因此“a==b”其本质就是“5==5”,返回true;“a==c”其本质就是“5==6”,返回false。

  因此,运行结果依次为:true  false。

2.两个引用数据类型之间的比较:

  引用数据类型都是对象,一般都是在堆中被创建,变量中存储的是堆中对象的地址引用。

  因此,“==”比较引用类型时,比较的是地址。

  • 一般的类用new来创建对象,是在堆中开辟空间来存储的,每个对象都有唯一的地址;
  • 数据类型的包装类既可以用new来创建,在堆中开辟空间存储,也可以直接创建,通过自动装箱的机制来完成对象在堆中的创建。

  这里要注意两个数据类型,一个是String类型,一个是Integer类型。具体请看案例分析:

String str1 = new String("abc");    // 0x123
String str2 = new String("abc");    // 0x262
String str3 = new String("xyz");    // 0x762
System.out.println(str1 == str2);  // 0x123 == 0x262
System.out.println(str1 == str3);  // 0x123 == 0x762

  用new创建了三个String类型的对象,创建的三个对象都在堆中,因此有不同的地址引用。三个变量在栈中存储的是三个对象的地址引用,其值各不相同。

  因此,运行结果依次为:false false。

String str1 = "abc";    // 0x111  
String str2 = "abc";    // 0x111
String str3 = "xyz";    // 0x123
System.out.println(str1 == str2);  // 0x111 == 0x111
System.out.println(str1 == str3);  // 0x111 == 0x123

  直接创建了三个String类型的对象,创建的字符串在字符串常量池中,因此创建已经存在的字符串会直接返回其地址引用。str2在栈中存储的值和str1在栈中存储的值是一样的,都是字符串“abc”在字符串常量池中的地址引用,而str3在栈中存储的是字符串“xyz”在字符串常量池中的地址引用。

  因此,运行结果一次为:true  false。

Integer s1 = new Integer(100);
Integer s2 = new Integer(100);
Integer s3 = new Integer(200);
System.out.println(s1 == s2);
System.out.println(s1 == s3);

  用new创建了三个Integer类型的对象,创建的三个对象都在堆中,因此有不同的地址引用。三个变量在栈中存储的是三个对象的地址引用,其值各不相同。

  因此,运行结果依次为:false false。

Integer n1 = 100;
Integer n2 = 100;
System.out.println(n1 == n2); Integer a1 = new Integer(100);
Integer a2 = new Integer(100);
System.out.println(a1 == a2); Integer m1 = 300;
Integer m2 = 300;
System.out.println(m1 == m2); Integer b1 = new Integer(300);
Integer b2 = new Integer(300);
System.out.println(b1 == b2);

  运行结果依次为:true  false  false false。为什么是这样呢?

  两个new的好解释,因为是在堆中创建的,每个对象有唯一的地址,因此会返回false。但第一个和第三个是啥情况呢?

  这是因为在Java中为了提高空间和时间性能,Integer类中有一个静态内部类IntegerCache,在IntegerCache类中有一个Integer数组,用以缓存当数值范围为[-128,127]时的Integer对象。所以在自动装箱的过程中,如果数值在[-128,127]内,会直接返回其地址引用,若是不在才在堆中创建对象。

equals的作用:

  在Java中许多系统提供的类都定义了equals方法,这个方法用来比较两个独立对象的内容是否相同,而不是比较引用值本身的。自定义方法的定义大致如下(以String类为例):

public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (!COMPACT_STRINGS || this.coder == aString.coder) {
return StringLatin1.equals(value, aString.value);
}
}
return false;
}

  但是,如果一个自定义的类中没有定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法定义如下:

public boolean equals(Object obj) {
return (this == obj);
}

  可以看到,如果一个类中没有显式的定义equals方法,那么equals方法的作用和“==”的作用是一样的,都是比较两个变量指向的对象是否是同一对象。

String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));

  “==”比较的是地址,str1和str2在堆中的地址是不一样的,因此结果返回false,因为String类型自定义了equals方法,此equals方法比较的是对象的内容,因此结果返回true。

  所以运行结果依次为false   true。

public class Test {
public Test() {}
public static void main(String[] args) {
Test a = new Test();
Test b = new Test();
Test c = a;
System.out.println(a.equals(b));
System.out.println(a.equals(c));
}
}

  自己定义的的Test类,并没有自定义equals方法,因此euqals方法和“==”的作用是一样的,比较的是对象的地址,也就是说判断两个对象是否是同一个。a和b中存储的地址分别是两个不同对象的地址,c被赋值了a中存储的地址,也就是说a和c指向的是同一个对象。

  因此,运行结果依次是:false   true。

总结一下:

  运算符“==”只是用来比较两个变量在栈中存放的值是否相同。

  equals是类的成员方法,一般用来比较两个独立对象的内容是否相同(要看具体的定义)。如果自定义的类中没有定义equals方法,则会继承Object类的equals方法,其作用与“==”相同。

Java中“==”和 equals的区别的更多相关文章

  1. java 中 ==和equals 的区别

      Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...

  2. JAVA中“==”与equals()方法区别

    equals 方法是 java.lang.Object 类的方法 有两种用法说明: ()对于字符串变量来说,使用"=="和"equals()"方法比较字符串时, ...

  3. Java中==与equals的区别及理解

    区别: "==" 比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致. 如果两个对象的引用相同时(指向同一对象时)," ...

  4. Java中==与equals()的区别

    声明转载来源:http://blog.csdn.net/striverli/article/details/52997927 ==号和equals()方法都是比较是否相等的方法,那它们有什么区别和联系 ...

  5. java 中 “==” 和 equals 的区别

    转自https://www.cnblogs.com/www123----/p/7857298.html 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new Strin ...

  6. Java 中 == 和 equals 的区别

    有一段时间,== 和 equals 的区别一直困扰着我.因为涉及到Java的内存机制,然而Java的内存机制又是比较抽象的东西,所以对那时候的我来说,实在是很难理解. == 和 equals 最大的区 ...

  7. java中==和equals的区别(转)

    java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(== ...

  8. JAVA中==与equals的区别

    equals如果没有被重写的话,和==的作用是一样的,都是判断两个对象引用是否指向同一个地址.一般重写了equals()方法就表示比较它们“实际意义上相等”,比较的是内容,而不是引用地址.Java中S ...

  9. Java中==和equals()的区别

  10. Java中“==”与equals的区别以及equals方法的重写

    一.“==”与equals的区别: (1)==代表比较双方是否相同: 基本数据类型表示值相等. 引用数据类型表示地址相等,即同一个对象. (2)Object中的equals()方法:是否为同一个对象的 ...

随机推荐

  1. extJS--尚

    ExtJS依赖JavaScript,JavaScript推荐两本书:<JavaScript高级程序设计>初阶阶段, <JavaScript设计模式>中级阶段 fun1();// ...

  2. getting session bus failed: //bin/dbus-launch terminated abnormally with the following error: Autolaunch error: X11 initialization failed.

    今天在调试dbus程序的时候,运行程序出现了getting session bus failed: //bin/dbus-launch terminated abnormally with the f ...

  3. Jmeter 常用函数(17)- 详解 __substring

    如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.htm 作用 从字符串中获取指定范围的子串 语法格式 ...

  4. Could not create an acl object: Role '16'

    解决方案: (1) 用rm命令一个一个的清除var/cache, var/page_cache, var/di, generated/文件夹下的所有文件 (2) run setup:upgradeco ...

  5. 第3篇 Scrum 冲刺博客

    1.站立会议 照骗 进度 成员 昨日完成任务 今日计划任务 遇到的困难 钟智锋 确定客户端和服务器通信的形式 重新设计项目执行流程 我的规划过于混乱,对应难以同步开发 庄诗楷 绘制棋盘 游戏窗口的制作 ...

  6. KNN手写数字识别

    import numpy as np import matplotlib .pyplot as plt from sklearn.neighbors import KNeighborsClassifi ...

  7. Logistic回归分析之二元Logistic回归

    在研究X对于Y的影响时,如果Y为定量数据,那么使用多元线性回归分析(SPSSAU通用方法里面的线性回归):如果Y为定类数据,那么使用Logistic回归分析. 结合实际情况,可以将Logistic回归 ...

  8. Java8中的Stream API

    本篇文章继续介绍Java 8的另一个新特性——Stream API.新增的Stream API与InputStream和OutputStream是完全不同的概念,Stream API是对Java中集合 ...

  9. SpringBoot2搭建基础架构——开源软件诞生4

    技术框架篇--第4篇 用日志记录“开源软件”的诞生 赤龙ERP开源地址: 点亮星标,感谢支持,加微信与开发者交流 kzca2000 码云:https://gitee.com/redragon/redr ...

  10. python_选择排序

    #选择排序 def insert_sort(li): for i in range (1,len(li)): # i表示摸到牌的下标 tem = li[i] j = i - 1 # j 是初始手中的牌 ...