java中equals和==的区别介绍

示例一、

 代码如下 复制代码

public class Demo {
    public static void main(String args[]) {
        String str="soka";
        String str2 = "soka";
        System.out.println("soka".equals(str));
        System.out.println(str==str2);
    }
}

输出结果:
true
true
显然equals比两者值是否相等,所以返回true;那么,第二个值真为true吗?明明两个不同变量啊!其实JVM对于

String的游戏规则是这样安排的:
以 String str=”soka”;形式赋值在java中叫直接量,它存储在常量池中而不是像new String(“soka”)一样放在压

缩堆中,以这种方式赋值后,如果第二次用类似方式声明赋值String str2=”soka”,它首先会在常量池中找“soka

”如果找到了,str也将指向”soka”这个引用。所以两者引用的同一个对象,示例中用==比较两个对象是否是同一个

引用,为true那就理所当然啦。

示例二、

 代码如下 复制代码

public class Demo {
    public static void main(String args[]) {
        String str=new String("soka");
        String str2=new String("soka");
        System.out.println("soka".equals(str));
        System.out.println(str==str2);
    }
}

输出结果:
true
false
str和str2的值显然相等,所以用equals比较为true;str和str2都以new的形式向内存申请了各自的空间,所以他俩属

于不同对象,第二条输出语句为false。

示例三、

 代码如下 复制代码

public class Demo {
    public static void main(String args[]) {
        StringBuffer sb = new StringBuffer("wel");
        StringBuffer sb2 = sb;
        sb2 = sb2.append("come");
 
        System.out.println("sb的值:"+sb+"  sb2的值:"+sb2);//1
        System.out.println(sb==sb2);//2
        System.out.println("welcome".equals(sb2));//3
    }
}

输出结果:
sb的值:welcome sb2的值:welcome
true
false
输出语句2为true大家没有疑问吧,因为sb和sb2的是同一引用。
从输出语句1可以看str2的变量值是”welcome”,那么输出语句3为什么是false呢?不急,我们先看Object基类中

equals方法的源码:

 代码如下 复制代码

boolean equals(Object o)
{    
return this==o;
}

从源码可以看出,Object中equals方法比较的就是地址/引用。是的,在java中,StringBuffer类并没有重写equals方

法,所以输出语句3中的equals是单纯从Object继承过来的,输出语句3为false就不用质疑了

时间: 2024-11-05 14:50:16

java中equals和==的区别介绍的相关文章

java中equals和==的区别

[LeetCode]–155. Min Stack 在这个问题中,我遇到了==和equals的问题,虽然试一下就能得出结果,但是我想弄明白. java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的

Java语法----Java中equals和==的区别

[正文] 平时在学Android和Java语言的时候,总是碰到"equals"和"=="这两个字符,老感觉差不多:其实还是有一些区别的,今天干脆把它们彻底弄清楚. 一.java当中的数据类型和"=="的含义: 基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean.他们之间的比较,应用双等号(==),比较的是他们的值. 引用数据类型:当他们用(==)进行比较的时候,比较的是他

java中”==”和”Equal”的区别

对于一些基本数据类型,int,long,bool,还有char!,"=="都是表示值相等的意思,没有equal方法. equal方法是object对象里面的方法,java中String不是基本数据类型,而是一个类,它们都是继承object类,还有Integer和int的区别也是Integer是一个类! 在object类中,equal方法与"=="是等同的,"=="不是表示值相等,而是比较对象的地址是否相等!Integer和String都重写了(没

字符串-java中String str1…的区别,详细见内容

问题描述 java中String str1-的区别,详细见内容 String str1,str2; str1 = "we are friends"; str2 = "we are friends"; 和 String str1 = "we are friends"; String str2 = "we are friends"; 在内存上的区别是什么? 是否有区别? 解决方案 没有区别,他们指向同一个对象 解决方案二: 就最后

java类的问题-关于java中的方法的区别

问题描述 关于java中的方法的区别 我是java菜鸟,想问一个问题关于 public static void main (String [] args){} 和static public void main (String [] args){} 的区别是什么?在jvm中是如何执行的? 解决方案 应该是没区别的吧 你要看区别 先分别编译后 后看看编译后的内容的区别吧 很多代码经过编译后效果是一样的

c#与java中byte字节的区别及转换方法

原文:c#与java中byte字节的区别及转换方法在java中  byte的范围在 [-128,127] 在C#中  byte的范围在 [0,255] 所以 java程序与C#程序 进行数据传输的时候 要先把java的byte数组转换成在[0,255]范围内的int型数组a[];再把a[]进行加密得到字符串str, 把字符串传到web服务上. 转换方法: int data[] = new int[bytes.length]; for(int i=0;i    data[i] = bytes[i]

java中的自增问题介绍_java

运行下面这段代码,其结果是什么呢? package com.test; public class Inc { public static void main(String[] args) { Inc inc = new Inc(); int i = 0; inc.fermin(i); i = i++; System.out.println(i); } void fermin(int i) { i++; } } 结果是:0 上述类似代码在C/C++中运行结果是:1,这是为什么呢?   这是因为Ja

java中equals和等号(==)的区别浅谈_java

java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类)   当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false.JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个eq

java中 == 与 equal 的区别讲解_java

废话不多说了,开门见山吧,先来看一段代码: 复制代码 代码如下: String str1 = new String("str");        String str2 = new String("str");        System.out.println("==比较 :"+ str1 == str2);        System.out.println("equal比较:"+ str1.equals(str2));