JAVA 字符串比较: equals() 与 ==

关于字符串比较用equals还是用==,总结一下.

字符串为对象:

1."=="

所有"对象变量"用==作比较时比的是两个对象在堆中的引用.

2."equals()"

所有对象的equals方法继承自Object类的方法,而String重写了equals方法的比较算法,它比较的是字符串的内容,即在堆中的了符序列

3.特点

字符串是一种比较特殊的对象,这里的特殊指的是在运行期间,它的赋值直接改变引用(当然,任何对象的赋值都是直接改变的引用,只不过字符串这种东西往往让人容易理解为它是在原来的基础上操作的,尤其是+=这类操作),而不是在原来所引用的内存块中做修改.(因此有了StringBuffer类的出现)

结论:

1.

String s1 = "hello";

String s2 = "hello";

System.out.println(s1.equals(s2));  //true

System.out.println(s1 == s2);       //true

按照上面的说法,第一个true不难理解.

而第2个之所以也为true是因为,java编译器用的类似于C语言中的"文字池机制",即在源代码中所有的字符串常量声明全部放在一块内存区域,因此当一个字符串声明时赋值的是一个字符串常量,那么如果"文字池"中有这个字符串常量,编译器将直接把它的引用赋值给这个变量.

因此在用==来比较s1和s2时,将会得到true.

2.

String s1 = "hello";

String s2 = "hello";

s1 = s1 + "a";

s2 = s2 + "a";

System.out.println(s1.equals(s2));  //true

System.out.println(s1 == s2);       //false

第3,4行的赋值操作在运行期间执行,根据上面的知识点3:两个变量的引用将会发生改变.因此这时用==相比时将会得到false;

(在运行期间所得到的字符串内容,将不会放到所谓的"文字池"之中,然后如果有相同内容的变量引用相同内容,这样作的话需要每次字符串改变时需要检查它的内容,并再在文字池中查找看是否有相同内容的常量,太过浪费效率.)

("文字池机制"也许也是为什么字符串对象在作更改时,直接改变引用的一个原因,因为如果直接对引用的内存块作操作的话,另一个指向相同引用的字符串变量将也会发什么改变,发生逻辑混淆)

3.

代码略.

当字符串对象从不同地方(字符串常量;本地资源文件读取;网络传输:如表单提交;等等)获得时:除了是编译期间用相同常量赋值的字符串变量的引用相同外,其它的全部是新的引用.因此,与这种变量直接用==相比时将得到false,即使内容相同

应用结论:

1.如果是单纯的比较字符串内容的话:用equals()

2.如果确实是要比较两个变量的引用的话:用==

原文地址:https://www.cnblogs.com/MyTiramisu/p/9418453.html

时间: 2024-10-12 16:33:02

JAVA 字符串比较: equals() 与 ==的相关文章

JAVA字符串比较equals()和equalsIgnoreCase()差异

1.用equals( )方法比較两个字符串是否相等.它具有例如以下的一般形式: boolean equals(Object str) 这里str是一个用来与调用字符串(String)对象做比較的字符串(String)对象.假设两个字符串具有同样的字符和长度,它返回true.否则返回false.这样的比較是区分大写和小写的. 2.为了运行忽略大写和小写的比較,能够调用equalsIgnoreCase( )方法.当比較两个字符串时,它会觉得A-Z和a-z是一样的.其一般形式例如以下: boolean

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

Java字符串

Java字符串 String对象是不可变的.String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的对象,以包含修改后的字符串.而最初的String对象则丝毫未动. import java.util.*; public class Immutable{ public static String upcase(String s){ return s.toUpperCase(); } public static void main(String[] args){ Strin

Java 中的 ==, equals 与 hashCode 的区别与联系

一.概述 1.概念 == : 该操作符生成的是一个boolean结果,它计算的是操作数的值之间的关系 equals : Object 的 实例方法,比较两个对象的content是否相同 hashCode : Object 的 native方法 , 获取对象的哈希值,用于确定该对象在哈希表中的索引位置,它实际上是一个int型整数 二.关系操作符 == 1.操作数的值 基本数据类型变量 在Java中有八种基本数据类型: 浮点型:float(4 byte), double(8 byte) 整型:byt

Java字符串的10大热点问题,你都懂吗?

转自 威哥干JAVA http://www.codingke.com 下面我为大家总结了10条Java开发者经常会提的关于Java字符串的问题,如果你也是Java初学者,仔细看看吧: 1.如何比较字符串,应该用”==”还是equals()? 总的来说,”==”是用来比较字符串的引用地址,而equals()才是比较字符串的值.两个值相同的字符串用”==”比较结果有可能是false,而用equals()则一定为true.除非两个字符串是同一个new出来的对象,不然比较字符串值是否相同应该要用equa

深入Java字符串

深入Java字符串 Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 一.从根本上认识java.lang.String类和String池 首先,我建议先看看String类的源码实现,这是从本质上认识String类的根本出发点.从中可以看到: 1.String类是final的,不可被继承.public final class String. 2.String类是的本质是字符数组char[], 并且其值不可改变.pr

【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别

Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 System.out.println(str1==str2); 4 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一

Java中的equals和hashCode方法

本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法. equals()和hashCode()方法是用来在同一类中做比较用的,尤其是在容器里如set存放同一类对象时用来判断放入的对象是否重复.这里我们首先要明白一个问题: equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,却并不能证明他们的h

关于java字符串编译优化问题

情景一:不好的字符串拼接习惯    起因是这样的:一个大牛在写了一篇关于java字符串优化问题的讲解,他提到:不要使用strObj+otherValue的方法将otherValue转换为字符串形式,因为底层操作会让你吓一跳的.那么底层的实质是怎么样的呢?他的意思是这样的: 比如:    String s = "I have"; int  total = 12; Dog dog = new Dog();     //假设Dog类重写了toString方法 String msg = s +