`

深入了解JAVA中的equals 和 ==

    博客分类:
  • java
阅读更多
简介:equals和==都是Object的功能,equals和==都表示比较两个对象的引用是否相等,但是有些类

重写了equals方法,使得它比较两个对象的值是否相等,这些重写了equals方法的类有String,Date

和所有基本类型的封装类.下面以String类来介绍equals和==.
1.equals和== :  判断两个引用是否指向同一对象,即是否指向同一片内存区域.

2.equals和==的使用对象:
equals :  只能用于类类型.
==     :  既能用于类类型,又能用于基本类型.

3.要真正了解equals和==,需要了解内存的分配及堆栈(堆和栈的特征不在本文的讨论范围).
内存的分配:
(1) 当我们创建一个基本类型时,例如:int i=5;系统会在栈中查找是否存在5这个值存在,如果存

在,则把i指向5;如果不存在,
则系统会在栈中创建一个5,再将i指向它.
举例:
short s=8;
int i=8;
long l=7;

System.out.println( s==i ); // true
System.out.println( s==l ); // false
当执行short s=8;时,系统会先查找栈中是否已经存在8,如果存在就把s指向它;如果不存在就新创

建一个8,然后再用s指向
新创建的8; 当执行int  i=8;时,系统会做同样的事,所以s和i都是指向同一片内存的,而long 

l=7;则与s和i 指向的不同.
(2) 当我们创建一个类类型时,系统会在栈中创建一个引用,再在堆中分配适当的内存,然后再将该

引用指向这片分配的内存.如果设有初始值系统还会把初始值存入该内存中.类类型是通过new 关

键字来创建的,所以系统不会像基本类型一样先查找是否有该初始值,而是直接在堆中创建一个新

值.
举例:
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println( sb1==sb2 ); // false
System.out.println( sb1.equals(sb2) ); // false
由于StringBuffer没有重写Object类的equals()方法,所以==和equals()的行为都是一样的。

举例:
String s1=new String("abc");
String s2=new String("abc");
System.out.println( s1==s2 ); // false
System.out.println( s1.equals(s2) ); // true
当执行String s1=new String("abc");时,系统会在堆中新创建一个"abc",而当执行String

s2=new String("abc");时,系统会再次新创建一个"abc".因此s1和s2不是指向同一片内存,所以

s1==s2为false;因为String重写了Object的equals()方法,而s1和s2的值都为"abc",所以

s1.equals(s2)为true.

注意:String是一个特殊的类类型,让我们看下例.
举例:
String s1="abc";
String s2= "abc";
System.out.println( s1==s2 ); // true
System.out.println( s1.equals(s2) ); // true
这是因为当String类型没有用new 创建时, "abc"不是存放在堆里,而是存放在栈里. 没有用new

创建String类型对象和创建基本类型的原理是一样,当执行String s1= "abc";时,系统会先查找栈

中是否存在"abc",如果存在就将s1指向它,否则就新创建一个"abc",然后用s1指向它;创建String

s2= "abc";也是如此,所以s1和s2指向的是同一片内存区域.这也就是为什么s1==s2会是true.
分享到:
评论

相关推荐

    Java基础复习(内附String中equals与==区别的分析)

    本篇复习将重点讨论String类中的`equals()`方法和`==`运算符的区别,这对于理解对象比较和字符串操作至关重要。 首先,`==`运算符在Java中用于比较基本类型(如int、char)的值,而在比较对象时,它实际上是检查两...

    java中equals和==的区别.pdf

    首先,我们要了解Java中的内存模型。基本数据类型(如int、char)的值直接存储在栈内存中,而引用类型的变量(如对象)在栈中存储的是指向堆内存中对象实例的引用。因此,当我们比较两个引用类型的变量时,`==` 操作...

    java中equals和的比较.doc

    在Java编程语言中,`equals`方法和`==`操作符都是用来比较对象之间是否相等的重要工具,但它们之间存在显著的区别。理解这些差异对于编写高效且无误的代码至关重要。 #### 二、基本概念 1. **==(双等号)**: - ...

    Java中equals方法隐藏的陷阱

    本文将深入探讨Java中`equals`方法的一些常见陷阱,并提供相应的解决方案。 #### 1. `equals`方法签名定义错误 `equals`方法的标准定义是在`java.lang.Object`类中,其签名是`public boolean equals(Object obj)`...

    字符串比较之 “==”和 “equals”

    在Java编程语言中,字符串是比较常见的数据类型,用于存储文本信息。在处理字符串时,我们经常需要比较两个字符串是否相等。...通过了解这些基础知识,开发者可以更好地处理和比较Java中的字符串。

    Java常见笔试、面试题目深度剖析 相等性(==及equals方法)详解

    本篇文章将深入剖析“==”运算符和equals()方法的区别与联系,帮助你在Java的笔试和面试中更好地应对相关问题。 首先,“==”运算符在Java中用于比较基本类型变量的值是否相等,例如int、char或boolean。对于引用...

    JAVA Integer == equal 比较 doc 比较大小 是否相等

    本文将深入探讨 Java 中的 Integer 比较,了解为什么使用 "==" 运算符可能会出错,并解释如何正确地使用 equals() 方法来比较 Integer 对象。 Java 中的 Integer 对象 在 Java 中,Integer 是一个不可变的类,它...

    java学习equals

    在"java学习equals"这个主题中,我们将深入探讨`equals()`方法的用法、重写以及其与`==`操作符的区别。 首先,`==`操作符在Java中主要用于比较基本类型变量的值,如int、char等,而对于对象,它则比较的是两个引用...

    深入探讨Java中的String类.pdf

    Java 中的 String 类有很多特点和用途,本文将深入探讨 Java 中的 String 类。 一、String 类的本质 Java 中的 String 类是一个特殊的类,它是一个 immutable 类,也就是说,一旦创建了 String 对象,它的值就不能...

    hashcode和equals的分析

    在深入探讨`hashCode`方法之前,我们需要了解Java集合框架的基本概念。Java集合框架主要包括两大类集合:`List`和`Set`。 - **List**:这是一个有序集合,允许元素重复。 - **Set**:这是一个不允许元素重复的无序...

    JAVA面试题和答案.docx

    在Java面试中,深入理解JDK与JRE的区别以及`==`和`equals()`方法的差异至关重要。首先,我们来详细解析这两个知识点。 1. **JDK与JRE的区别** JDK(Java Development Kit)是Java开发工具包,它包含了JRE(Java ...

    深入理解Java中HashCode方法

    深入理解Java中HashCode方法 Java中的hashCode方法是每个类都需要实现的重要方法之一,它的主要作用是将对象的数据转换为一个32位的整数,用于标识对象的唯一性。在Java的所有类中,Object类是最顶层的父类,它定义...

    MLDN魔乐JAVA_09深入引用、this关键字、对象比较.rar

    在深入学习这些概念的过程中,你将了解到如何有效地管理和操作对象,以及如何在类的设计中利用`this`来提高代码的清晰度和可读性。通过实例练习和案例分析,你将掌握如何正确比较对象,避免出现常见的错误,如误用`=...

    JAVA中实现“相等”比较的深入分析.zip

    在Java编程语言中,"相等"比较是一个基础但至关重要的概念。这涉及到对象的平等性和引用的平等性,...通过阅读《JAVA中实现“相等”比较的深入分析.pdf》这篇文档,您将能够更全面地了解这个主题,并提升您的编程技能。

    基于Java字符串 "==" 与 "equals" 的深入理解

    在Java编程语言中,字符串(String)是一个特殊的数据类型,它用于表示文本。...了解这一点对于避免Java编程中的常见错误至关重要。在实际开发中,应根据需求选择合适的比较方式,以确保代码的准确性和可读性。

    200道java基础题及答案终极版.pdf

    同时,在回答这类问题时,展示对Java类库的深入了解也是非常加分的。例如,String类的equals方法就被重写了,以便能够比较两个String对象的内容是否相等,而不是它们的引用是否相同。 此外,本文提到的内容还包括...

    2021 - JAVA秋招基础知识点面试题

    了解JVM对深入理解Java程序的运行至关重要。 9. JAVA多线程: 多线程是Java面试中的高频知识点,包括线程的创建和管理、线程的生命周期、线程的同步与协作、锁机制等。理解Java中的synchronized关键字和java.util....

Global site tag (gtag.js) - Google Analytics