[Java] equals与==的区别

版权声明:请尊重个人劳动成果,转载注明出处,谢谢!

  • == 是一个运算符。 
    equals则是string对象的方法。
  • Java中 值类型 是存储在内存中的中。 
    引用类型在栈中仅仅是存储引用类型变量的地址,而其本身则存储在中。所以字符串的内容相同,引用地址不一定相同,有可能创建了多个对象。
  • ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
  • equals将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。即堆中的内容是否相同。==比较的是2个对象的地址(栈中),而equals比较的是2个对象的内容(堆中)。所以当equals为true时,==不一定为true。

下面是String类equals方法源码,它复写了类 Object 中的 equals方法。

    public boolean equals(Object anObject) {
965         if (this == anObject) {
966             return true;
967         }
968         if (anObject instanceof String) {
969             String anotherString = (String)anObject;
970             int n = value.length;
971             if (n == anotherString.value.length) {
972                 char v1[] = value;
973                 char v2[] = anotherString.value;
974                 int i = 0;
975                 while (n-- != 0) {
976                     if (v1[i] != v2[i])
977                         return false;
978                     i++;
979                 }
980                 return true;
981             }
982         }
983         return false;
984     }

  上面已经说到equals是比较两个对象的内容,我们可以看到方法中,先是比较两个String对象是否为同一对象,如果是就直接返回true(两个对象为同一对象那他们的内容必然相等)。 
如果不是同一对象,先确定传入的对象是否是String类型,如果是,则比较两对象的字符序列(String类内部存储是用char[]实现的,可以查看源码了解),遍历过程中只要有一个字符不相同,就返回false,否则返回true。这里注意比较次数为第一个String对象的长度n,而不是传入的String对象参数的长度。

时间: 2025-01-30 06:23:49

[Java] equals与==的区别的相关文章

java equals和==的区别详解_java

大概说equals和==都比较的是什么: 1. boolean tem = a == b; 首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容.因为栈是用来存放地址或是java中八大基本类型中自动变量的字面值(自动变量就是用int a = 1;这种形式来定义的变量).如果是自动变量比较值的话肯定是用==来比较,因为equals()是一个方法,所以必须由对象调用才可以用于比较.而自动变量既不是类的实例也不是类的引用所以不能用equals()方法. 2.boolean tem

java equals和=,==的区别详细介绍_java

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

编程语言 c++应用方向-C++,VB,Java等编程语言的区别及应用领域

问题描述 C++,VB,Java等编程语言的区别及应用领域 作为一个新手,我想知道Visual C++和Visual Basic,Java的区别,我学的是C++,但是不知道用C++可以做些什么,希望有高手指明一下方向. 解决方案 我个人认为,C更接近底层设备,也就是说一般c用来和硬件打交道,java更适合一些应用程序的编写,学习C++其实就是从C到java的一个过渡!面向过程编程到面向对象编程的过度! 解决方案二: c++语言是面向对象的编程语言,它认为世间一切都是由对象(object)组装起来

java equals 方法的重载和复写

问题描述 java equals 方法的重载和复写 public class Person { private String name; public Person(String name){ this.name = name; } public String getName() { return name; } public boolean equals(Object other) { Person person = (Person)other; System.out.println("执行复

c#中 ==与equals有什么区别

c#中 ==与equals有什么区别 对于值类型.引用类型来说比较过程怎样的? using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class Person { private string name; public string Name { get { return name; } set { name = value; } } public Pe

对于java equals方法的疑惑。

问题描述 对于java equals方法的疑惑. String s1 = new String("123"); String s2 = new String("123"); System.out.println(s1.equals(s2)); Test t1=new Test("123"); Test t2=new Test("123"); System.out.println(t1.equals(t2)); 为何上面输出的是

java基础-JAVA equals方法被调用时字符串和对象的顺序

问题描述 JAVA equals方法被调用时字符串和对象的顺序 如图所示 equals方法中对象在前还是字符串在前? 是标准还是建议? 解决方案 一般建议是字符串在前,这样能够避免当你的对象为[null] 的时候,报空指针异常. 解决方案二: 字符串在前,避免当你的对象为[null] 的时候,报空指针异常

Equals和==的区别 公共变量和属性的区别小结_实用技巧

Equals 和==的区别 C#中有两种不同的相等:引用相等和值相等 == 是比较两个变量的值是否相同或两个引用是不是指向同一个内存地址. Equals()方法是比较两个对象指向内存空间里的内容是不是相同.也就是比较两个"引用类型" 是否是对同一对象的引用,即两个对象的内容是否相同. 公共变量和属性的区别 变量对于类本身而言,称为域. 属性是类的外部显示出来的特性,只是公开属性,如何进行赋值(set)和如何进行取值(get)都进行了封装,对于类外部是不可见的.对于外部使用者来说只能够使

浅谈java中Math.random()与java.util.random()的区别_java

今天突然想起来,java产生随机数的问题,上机试了一下,找到了一点区别,在这里总结一下: 直接调用Math.random()是产生一个[0,1)之间的随机数, 如果用 java.util.Random random=new Random();random.nextInt() 这样产生一个长整型的随机数并且与上一次是一样的,如果过一会再产生就不会一样了,例如: for (int i = 0; i < 10; i++) { Random random=new Random(); Thread.sle