==测试引用相等性(它们是否是同一个对象)。
.equals()测试值的相等性(它们在逻辑上是否“相等”)。
在调用.equals()之前,Objects.equals()会检查null,因此您不必(从JDK7开始,也可以在Guava中使用)。
String.contentEquals()将String的内容与任何CharSequence的内容(自Java1.5以来可用)进行比较。
因此,如果要测试两个字符串是否具有相同的值,则可能需要使用Objects.equals()。
//ThesetwohavethesamevaluenewString("test").equals("test")//-->true//...buttheyarenotthesameobjectnewString("test")=="test"//-->false//...neitherarethesenewString("test")==newString("test")//-->false//...butthesearebecauseliteralsareinternedby//thecompilerandthusrefertothesameobject"test"=="test"//-->true//...stringliteralsareconcatenatedbythecompiler//andtheresultsareinterned."test"=="te"+"st"//-->true//...butyoushouldreallyjustcallObjects.equals()Objects.equals("test",newString("test"))//-->trueObjects.equals(null,"test")//-->falseObjects.equals(null,null)//-->true
你几乎总是想使用Objects.equals()。在极少数情况下,您知道您正在处理实习字符串,您可以使用==。
==比较对象引用。
.equals()比较String值。
有时==会给出比较String值的幻想,如下列情况:
Stringa="Test";Stringb="Test";if(a==b)===>true
这是因为当您创建任何字符串文字时,JVM首先在字符串池中搜索该字面值,如果找到匹配项,则将为新字符串指定相同的引用。因此,我们得到:
(a==b)===>是的
StringPoolb----------------->"test"<-----------------a
但是,在以下情况下==失败:
Stringa="test";Stringb=newString("test");if(a==b)===>false
在这种情况下,对于newString("test"),将在堆上创建语句newString,并且该引用将被赋予b,因此b将在堆上给出引用,而不是在String池中。
现在a指向String池中的String,而b指向堆上的String。因此我们得到:
if(a==b)===>false。
StringPool"test"<--------------------aHeap"test"<--------------------b
虽然.equals()总是比较String的值,所以在两种情况下都给出了true:
Stringa="Test";Stringb="Test";if(a.equals(b))===>trueStringa="test";Stringb=newString("test");if(a.equals(b))===>true
所以使用.equals()总是更好。
文章部分资料来源:https://lkpmff.weebly.com/ 转载请注明
相关推荐
Java字符串是编程中常见且重要的数据类型,尤其在Java中,字符串处理的效率和灵活性直接影响程序性能。本文将深入探讨Java中的三个主要字符串类:String、StringBuilder和StringBuffer,以及它们各自的特点和常用...
Java 中的 String 字符串是一种非常重要的数据类型,它被广泛应用于各种编程场景中。在 Java 中,String 字符串对象的创建有两种形式:字面量形式和使用 new 关键字的标准构造方法。在本文中,我们将深入探讨 Java ...
反斜杠(\)则相对复杂一些,因为在Java字符串中,反斜杠是一个转义字符的开始。这意味着反斜杠本身与后面跟随的字符一起构成了转义字符序列。例如,“\n”表示换行,“\t”表示制表符,而“\\”表示一个普通的反...
`时,如果字符串字面量"abc"在栈中不存在,它会被创建并放入栈中,然后两个变量都指向同一个栈中的"abc",而不是在堆中创建两个新的字符串对象。 理解堆和栈的区别对于解决Java程序中的内存问题、分析性能瓶颈以及...
老生常谈的一个梗,到2020了还在争论,你们一天天的,哎哎哎,我不是针对你一个,我是说...毕竟我和各位都是人才,java知识底蕴不能如此短浅,这题还没谢幕我们还能对面试官多哔哔几句:字符串常量池在不同版本的jvm中
如上例所示,数组`str1`、`str2`和`str3`都包含了三个字符串元素"A"、"B"和"C"。 **动态初始化**则是先声明数组,然后通过循环或其他逻辑为数组元素逐个赋值。例如: ```java String[] str4 = new String[3]; str4...
转换为字符串是JavaScript中常见的操作,无论是数字、布尔值还是字符串本身,都有`toString()`方法用于将其转换为字符串形式。例如,数字10调用`toString()`方法后会变成字符串"10",布尔值`true`会变成字符串"true...
* String getHostAddress() 返回 IP 地址字符串 获取本地地址和端口号: ``` public void testSocket() throws Exception{ Socket socket=new Socket("localhost",8088); InetAddress add=socket.getLocalAddress...
这个类提供了多种方法来获取不同类型的数据,如整数、浮点数、字符串等。在本文中,我们将深入探讨 `Scanner` 类的基本用法,并通过一个具体的实例来展示如何使用它。 首先,创建一个 `Scanner` 对象,我们需要传入...
Java字符串是Unicode编码的,但在处理字节序列时,需要明确指定编码。例如,将字符串转换为字节数组时,如果不指定编码,可能会得到意外的结果。因此,Java程序员在进行I/O操作时,必须清楚地知道数据的编码格式,以...