`
PeakLui
  • 浏览: 44748 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

令人头疼的==和equals

    博客分类:
  • Java
阅读更多

JAVA==equals是令人头疼的问题,今天看到一篇相关的好文章,忍不住摘了下来:

 

关于该话题网上的资料不少,但是都是说“==是比较引用,equals是比较引用的对象”,这句话我不知道有好多朋友真正的理解了,在这里我就谈谈我对这个问题的理解。

在这里我主要针对==来讲讲把,首先我们来看一段代码:

 

public static void main(String[] args) {
		String str1 = "abc";
		String str2 = new String("abc");
		String str3 = new String();
		String str4 = new String("");
		System.out.println(str1 == str2);// ①
		System.out.println(str1.equals(str2));// ②
		System.out.println(str3 == str4);// ③
		System.out.println(str3.equals(str4));// ④
		String str5 = "a";
		String str6 = "b";
		String str7 = "ab";
		String str8 = "a" + "b";
		String str9 = "a" + str6;
		System.out.println(str7 == str8);// ⑤
		System.out.println(str7 == str9);// ⑥
		System.out.println(str7 == str5 + str6);// ⑦
}

 

这段代码的答案你都知道吗?呵呵,不要骗自己,试试看吧!

程序输出结果为:
false
true
false
true
true
false
false

看完答案,我估计有些朋友多少会有点纳闷了,这里我们来逐句分析一下,前几句大部分朋友应该能理解,str1str2的定义来看,str1 = "abc"这里的"abc"是一个常量,创建str1引用的时候会先到字符常量池中看是否存在"abc"这样一个常量,没有就在常量存储空间中开辟一块空间存储"abc"再引用该常量,存在就直接引用它。str2 = new String("abc");使用了new关键字,java虚拟机会直接在堆中开辟一块内存空间来保存"abc"。所以str1str2指向的并不是同一块内存地址。但是它们各自引用的内存块中的值是一样的。==是用来比较内存空间地址(也就是引用)是否相同,equals是比较引用的内存块中的值,这样就很容易得出前四句输出的原因了!如果要想第一句输入为true,可以改为System.out.println(str1 == str2.intern());intern方法是取出字符常量池中相等的值,没有的话虚拟机自动会创建。现在我们来看一下str8 ="a"+"b";看了这句话我想问大家一个问题,常量加常量等于什么?呵呵,当然是等于常量拉,

这一点在编译时就会确定下来,创建str8的时候"a"+"b"会以"ab"的形式入池,如果发现有了就直接指向它。所以str7str8指向的根本就是同一块内存,所有==equals判断都相等。

str9就是一个常量加变量的问题了,常量加上一个变量肯定会是一个变量,所以String str9 = "a" + str6;就相当于String str9 = new String("ab");这样就可以明白最后两句的输出了,其实这个简单来说就可以用两句话来概括,

常量+常量=常量,

入池,变量+常量=变量,不入池!

 

,看完了解释,再练习一下:

 

class Test {

	public static void main(String[] args) {

		String hello = "Hello", lo = "lo";

		System.out.print((hello == "Hello") + "  ");

		System.out.print((Other.hello == hello) + "  ");

		System.out.print((hello == Other.hello) + "  ");

		System.out.print((hello == ("Hel" + "lo")) + "  ");

		System.out.print((hello == ("Hel" + lo)) + "  ");

		System.out.println(hello == ("Hel" + lo).intern());

		System.out.println("===============================================");
		String a = "abc";
		String b = "abc";
		String c = new String("abc");
		String d = c.intern();

		System.out.println(a == b);
		System.out.println(a == c);
		System.out.println(a == d);
		System.out.println(b == c);
		System.out.println(b == d);
		System.out.println(c == d);
	}
}

class Other {
	static String hello = "Hello";
}

 

 

答案:

d:\>java Test
true  true  true  true  false  true
===============================================
true
false
true
false
true
false

 

分享到:
评论

相关推荐

    java中equals和==的区别

    Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的概念,很多开发者容易混淆它们。理解这两个概念的区别是非常重要的,因为它们对编程的正确性和性能都有很大的影响。 首先,我们需要了解 Java ...

    ==和equals的区别

    Java 中的 == 和 equals 方法的区别 在 Java 中,比较值大小有两种方法:== 和 equals,这两个方法的使用场景和比较规则不同,下面我们将详细探讨它们的区别。 基本数据类型和引用数据类型 在 Java 中,有两种...

    Java中的==和equals区别

    - 对于字符串和包装类,应优先使用`equals`方法进行比较,以确保得到正确的结果。 理解`==`与`equals`之间的区别对于编写正确且高效的Java代码至关重要。希望本文能帮助您更好地掌握这一概念,并在实际开发中避免...

    java中equals和==的区别.doc

    Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的运算符,它们之间的区别是非常重要的。 首先,我们需要了解 Java 中的内存模型。在 Java 中,变量可以分为两种:基本类型(primitive type)和...

    ==和equals的比较

    C# 中的 == 和 equals 比较 在 C# 编程语言中,`==` 和 `equals` 是两个常用的比较运算符,但它们之间有很大的区别。 堆和栈的区别 在理解 `==` 和 `equals` 之前,我们需要了解堆和栈的区别。堆是一种动态分配的...

    ==运算符和Equals()方法区别

    "运算符和Equals()方法区别" 在C#语言中,`==`运算符和`Equals()`方法都是用来比较两个对象是否相等,但是它们之间存在着很大的区别。 对于值类型来说,`==`运算符和`Equals()`方法的行为是一致的,都会比较两个...

    ==与equals的比较

    "Java中的==和equals方法比较" 在Java中,`==`和`equals`是两种不同的比较方法,前者比较引用地址,而后者比较对象的实际内容。 首先,让我们来看看`==`运算符的用法。`==`运算符可以用来比较基本数据类型和引用...

    ==和equals方法究竟有什么区别

    在Java编程语言中,`==`和`equals()`方法是用来比较对象之间关系的两种常见方式,但它们在使用上有着显著的区别。 首先,`==`运算符主要用于比较基本类型(如int、char、byte等)的值是否相等,或者比较引用类型...

    equals与==之间的区别

    在Java编程语言中,`equals`方法与`==`操作符是进行...总结,`equals`方法和`==`操作符在Java中用于不同的目的,理解它们的差异可以帮助开发者更准确地进行对象比较。在处理对象比较时,应根据具体需求选择适当的方法。

    == and equals() 的比较 绝对值得看

    在Java编程语言中,了解`==`和`equals()`的区别是非常关键的,因为它们在处理不同类型的数据时有不同的行为。这两个运算符在比较基本数据类型(如int、char)时表现相同,但当涉及到对象时,它们的行为就有所不同。 ...

    【Java面试题】equals与==的区别

    【Java面试题】equals与==的区别

    知识点 比较运算符==和equals方法的比较

    在Java编程语言中,比较运算符`==`和`equals()`方法是用来检查两个对象是否相等的,但它们之间存在显著的区别。理解这些差异对于编写正确的代码至关重要。 首先,我们来看`==`运算符。它主要用于基本数据类型的比较...

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

    "=="和"equals()"是两种常用的字符串比较方法,但它们之间存在一定的区别和使用场景。这篇博客将深入探讨这两个方法的工作原理以及何时应该使用它们。 首先,"=="运算符在Java中主要用于比较基本类型变量的值,如...

    java中==和equals的区别

    对于开发的程序员小伙伴,大家肯定对于==和equals不陌生,而且会经常用到他,那么又有几个能够说清楚了==和equals是怎么回事呢?他了呢两个有什么区别呢? 比较 == 比较的是栈中的值,基本数据类型是变量值,引用...

    java 资料 equals 与== 的区别

    Java 中的equals和==的区别 Java 是一种面向对象的编程语言,其中有两种数据类型:基本数据类型和引用数据类型。基本数据类型包括整数类型、浮点数类型、字符类型、布尔类型等,共有八种;而引用数据类型则包括 ...

    java中的==和equals()方法1

    在Java编程语言中,了解如何正确使用`==`和`equals()`方法是非常关键的,因为它们在比较对象和基本类型时有不同的行为。下面将详细解释这两个方法的工作原理、使用场景以及一些常见误区。 首先,`==`运算符主要用于...

    浅谈java 中equals和==的区别

    在Java编程语言中,`equals()` 和 `==` 运算符经常被用来比较对象,但它们之间存在着显著的区别。理解这些差异对于编写正确、健壮的代码至关重要。以下是关于 `equals()` 和 `==` 在Java中的详细解释。 首先,`==` ...

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

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

    java中equals()函数的用法 equals和==的区别

    在Java编程语言中,`equals()`方法和`==`运算符是两个经常被用来比较对象是否相等的关键概念。理解它们的区别对于编写出正确、健壮的代码至关重要。 首先,`==`运算符用于基本类型(如int, char, boolean)的比较,...

Global site tag (gtag.js) - Google Analytics