`
银辰宇
  • 浏览: 4575 次
文章分类
社区版块
存档分类
最新评论

老生常谈:如何比较Java中的字符串?

阅读更多

  ==测试引用相等性(它们是否是同一个对象)。

  .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中,字符串处理的效率和灵活性直接影响程序性能。本文将深入探讨Java中的三个主要字符串类:String、StringBuilder和StringBuffer,以及它们各自的特点和常用...

    老生常谈Java String字符串(必看篇)

    Java 中的 String 字符串是一种非常重要的数据类型,它被广泛应用于各种编程场景中。在 Java 中,String 字符串对象的创建有两种形式:字面量形式和使用 new 关键字的标准构造方法。在本文中,我们将深入探讨 Java ...

    老生常谈java路径中的反斜杠和斜杠的区别

    反斜杠(\)则相对复杂一些,因为在Java字符串中,反斜杠是一个转义字符的开始。这意味着反斜杠本身与后面跟随的字符一起构成了转义字符序列。例如,“\n”表示换行,“\t”表示制表符,而“\\”表示一个普通的反...

    老生常谈之Java中堆和栈的概念和区别

    `时,如果字符串字面量"abc"在栈中不存在,它会被创建并放入栈中,然后两个变量都指向同一个栈中的"abc",而不是在堆中创建两个新的字符串对象。 理解堆和栈的区别对于解决Java程序中的内存问题、分析性能瓶颈以及...

    String s = new String(” a “) 到底产生几个对象?

    老生常谈的一个梗,到2020了还在争论,你们一天天的,哎哎哎,我不是针对你一个,我是说...毕竟我和各位都是人才,java知识底蕴不能如此短浅,这题还没谢幕我们还能对面试官多哔哔几句:字符串常量池在不同版本的jvm中

    老生常谈java中的数组初始化

    如上例所示,数组`str1`、`str2`和`str3`都包含了三个字符串元素"A"、"B"和"C"。 **动态初始化**则是先声明数组,然后通过循环或其他逻辑为数组元素逐个赋值。例如: ```java String[] str4 = new String[3]; str4...

    老生常谈javascript的类型转换

    转换为字符串是JavaScript中常见的操作,无论是数字、布尔值还是字符串本身,都有`toString()`方法用于将其转换为字符串形式。例如,数字10调用`toString()`方法后会变成字符串"10",布尔值`true`会变成字符串"true...

    老生常谈Java网络编程TCP通信(必看篇)

    * String getHostAddress() 返回 IP 地址字符串 获取本地地址和端口号: ``` public void testSocket() throws Exception{ Socket socket=new Socket("localhost",8088); InetAddress add=socket.getLocalAddress...

    老生常谈Scanner的基本用法

    这个类提供了多种方法来获取不同类型的数据,如整数、浮点数、字符串等。在本文中,我们将深入探讨 `Scanner` 类的基本用法,并通过一个具体的实例来展示如何使用它。 首先,创建一个 `Scanner` 对象,我们需要传入...

    老生常谈计算机中的编码问题(必看篇)

    Java字符串是Unicode编码的,但在处理字节序列时,需要明确指定编码。例如,将字符串转换为字节数组时,如果不指定编码,可能会得到意外的结果。因此,Java程序员在进行I/O操作时,必须清楚地知道数据的编码格式,以...

Global site tag (gtag.js) - Google Analytics