简体   繁体   English

如何比较 Java 中的字符串?

[英]How do I compare strings in Java?

I've been using the == operator in my program to compare all my strings so far.到目前为止,我一直在我的程序中使用==运算符来比较我所有的字符串。 However, I ran into a bug, changed one of them into .equals() instead, and it fixed the bug.但是,我遇到了一个错误,将其中一个改为.equals() ,并修复了错误。

Is == bad? ==不好吗? When should it and should it not be used?什么时候应该使用,什么时候不应该使用? What's the difference?有什么不同?

== tests for reference equality (whether they are the same object). ==测试引用相等性(它们是否是同一个对象)。

.equals() tests for value equality (whether they are logically "equal"). .equals()测试值是否相等(它们在逻辑上是否“相等”)。

Objects.equals() checks for null before calling .equals() so you don't have to (available as of JDK7, also available in Guava ). Objects.equals()在调用.equals()之前检查null所以你不必(从 JDK7 开始可用,在Guava中也可用)。

Consequently, if you want to test whether two strings have the same value you will probably want to use Objects.equals() .因此,如果您想测试两个字符串是否具有相同的值,您可能需要使用Objects.equals()

// These two have the same value
new String("test").equals("test") // --> true 

// ... but they are not the same object
new String("test") == "test" // --> false 

// ... neither are these
new String("test") == new String("test") // --> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" // --> true 

// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true

// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true

You almost always want to use Objects.equals() .您几乎总是想使用Objects.equals() In the rare situation where you know you're dealing with interned strings, you can use == .在您知道自己正在处理实习字符串的极少数情况下,您可以使用==

From JLS 3.10.5.JLS 3.10.5。 String Literals : 字符串文字

Moreover, a string literal always refers to the same instance of class String .此外,字符串文字总是引用String类的同一个实例。 This is because string literals - or, more generally, strings that are the values of constant expressions ( §15.28 ) - are "interned" so as to share unique instances, using the method String.intern .这是因为字符串文字——或者更一般地说,作为常量表达式值的字符串( 第 15.28 节)——是“内部的”,以便使用方法String.intern共享唯一实例。

Similar examples can also be found in JLS 3.10.5-1 .类似的例子也可以在JLS 3.10.5-1中找到。

Other Methods To Consider其他需要考虑的方法

String.equalsIgnoreCase() value equality that ignores case. String.equalsIgnoreCase()忽略大小写的值相等。 Beware, however, that this method can have unexpected results in various locale-related cases, see this question .但是请注意,此方法在各种与语言环境相关的情况下可能会产生意外结果,请参阅此问题

String.contentEquals() compares the content of the String with the content of any CharSequence (available since Java 1.5). String.contentEquals()String的内容与任何CharSequence的内容(从 Java 1.5 开始可用)进行比较。 Saves you from having to turn your StringBuffer, etc into a String before doing the equality comparison, but leaves the null checking to you.使您不必在进行相等比较之前将您的 StringBuffer 等转换为字符串,但将空值检查留给您。

== tests object references, .equals() tests the string values. ==测试对象引用, .equals()测试字符串值。

Sometimes it looks as if == compares values, because Java does some behind-the-scenes stuff to make sure identical in-line strings are actually the same object.有时它看起来好像==比较值,因为 Java 做了一些幕后工作以确保相同的内联字符串实际上是同一个对象。

For example:例如:

String fooString1 = new String("foo");
String fooString2 = new String("foo");

// Evaluates to false
fooString1 == fooString2;

// Evaluates to true
fooString1.equals(fooString2);

// Evaluates to true, because Java uses the same object
"bar" == "bar";

But beware of nulls!但要注意空值!

== handles null strings fine, but calling .equals() from a null string will cause an exception: ==可以很好地处理null字符串,但是从空字符串调用.equals()会导致异常:

String nullString1 = null;
String nullString2 = null;

// Evaluates to true
System.out.print(nullString1 == nullString2);

// Throws a NullPointerException
System.out.print(nullString1.equals(nullString2));

So if you know that fooString1 may be null, tell the reader that by writing因此,如果您知道fooString1可能为空,请告诉读者,通过编写

System.out.print(fooString1 != null && fooString1.equals("bar"));

The following are shorter, but it's less obvious that it checks for null:以下内容更短,但它检查 null 的情况不太明显:

System.out.print("bar".equals(fooString1));  // "bar" is never null
System.out.print(Objects.equals(fooString1, "bar"));  // Java 7 required

== compares Object references. ==比较对象引用。

.equals() compares String values. .equals()比较字符串值。

Sometimes == gives illusions of comparing String values, as in following cases:有时==会产生比较字符串值的错觉,例如以下情况:

String a="Test";
String b="Test";
if(a==b) ===> true

This is because when you create any String literal, the JVM first searches for that literal in the String pool, and if it finds a match, that same reference will be given to the new String.这是因为当您创建任何字符串字面量时,JVM 首先会在字符串池中搜索该字面量,如果找到匹配项,则会对新字符串提供相同的引用。 Because of this, we get:正因为如此,我们得到:

(a==b) ===> true (a==b) ===> 真

                       String Pool
     b -----------------> "test" <-----------------a

However, == fails in the following case:但是, ==在以下情况下会失败:

String a="test";
String b=new String("test");
if (a==b) ===> false

In this case for new String("test") the statement new String will be created on the heap, and that reference will be given to b , so b will be given a reference on the heap, not in String pool.在这种情况下,对于new String("test")语句 new String 将在堆上创建,并且该引用将提供给b ,因此b将在堆上而不是字符串池中获得引用。

Now a is pointing to a String in the String pool while b is pointing to a String on the heap.现在a指向字符串池中的字符串,而b指向堆上的字符串。 Because of that we get:因此我们得到:

if(a==b) ===> false.如果(a==b)===> 错误。

                String Pool
     "test" <-------------------- a

                   Heap
     "test" <-------------------- b

While .equals() always compares a value of String so it gives true in both cases:虽然.equals()总是比较 String 的值,所以它在两种情况下都为真:

String a="Test";
String b="Test";
if(a.equals(b)) ===> true

String a="test";
String b=new String("test");
if(a.equals(b)) ===> true

So using .equals() is always better.所以使用.equals()总是更好。

The == operator checks to see if the two strings are exactly the same object. ==运算符检查两个字符串是否是完全相同的对象。

The .equals() method will check if the two strings have the same value. .equals()方法将检查两个字符串是否具有相同的值。

Strings in Java are immutable. Java 中的字符串是不可变的。 That means whenever you try to change/modify the string you get a new instance.这意味着每当您尝试更改/修改字符串时,您都会获得一个新实例。 You cannot change the original string.您不能更改原始字符串。 This has been done so that these string instances can be cached.这样做是为了可以缓存这些字符串实例。 A typical program contains a lot of string references and caching these instances can decrease the memory footprint and increase the performance of the program.一个典型的程序包含大量的字符串引用,缓存这些实例可以减少内存占用并提高程序的性能。

When using == operator for string comparison you are not comparing the contents of the string, but are actually comparing the memory address.使用 == 运算符进行字符串比较时,您不是在比较字符串的内容,而是在实际比较内存地址。 If they are both equal it will return true and false otherwise.如果它们都相等,则返回 true ,否则返回 false 。 Whereas equals in string compares the string contents.而字符串中的equals比较字符串内容。

So the question is if all the strings are cached in the system, how come == returns false whereas equals return true?所以问题是如果所有的字符串都缓存在系统中,为什么==返回 false 而 equals 返回 true? Well, this is possible.嗯,这是可能的。 If you make a new string like String str = new String("Testing") you end up creating a new string in the cache even if the cache already contains a string having the same content.如果你创建一个像String str = new String("Testing")这样的新字符串,你最终会在缓存中创建一个新字符串,即使缓存已经包含一个具有相同内容的字符串。 In short "MyString" == new String("MyString") will always return false.简而言之, "MyString" == new String("MyString")将始终返回 false。

Java also talks about the function intern() that can be used on a string to make it part of the cache so "MyString" == new String("MyString").intern() will return true. Java 还讨论了函数 intern() 可用于字符串以使其成为缓存的一部分,因此"MyString" == new String("MyString").intern()将返回 true。

Note: == operator is much faster than equals just because you are comparing two memory addresses, but you need to be sure that the code isn't creating new String instances in the code.注意: == 运算符比 equals 快得多,因为您正在比较两个内存地址,但您需要确保代码没有在代码中创建新的 String 实例。 Otherwise you will encounter bugs.否则你会遇到错误。

String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true

Make sure you understand why.确保你明白为什么。 It's because the == comparison only compares references;这是因为==比较只比较引用; the equals() method does a character-by-character comparison of the contents. equals()方法对内容进行逐个字符的比较。

When you call new for a and b , each one gets a new reference that points to the "foo" in the string table.当您为ab调用 new 时,每个都会获得一个指向字符串表中"foo"的新引用。 The references are different, but the content is the same.参考文献不同,但内容相同。

Yea, it's bad...是的,很糟糕……

== means that your two string references are exactly the same object. ==表示您的两个字符串引用是完全相同的对象。 You may have heard that this is the case because Java keeps sort of a literal table (which it does), but that is not always the case.您可能听说过这种情况,因为 Java 保留了某种文字表(它确实如此),但情况并非总是如此。 Some strings are loaded in different ways, constructed from other strings, etc., so you must never assume that two identical strings are stored in the same location.一些字符串以不同的方式加载,由其他字符串构造等等,所以你绝不能假设两个相同的字符串存储在同一个位置。

Equals does the real comparison for you. Equals 为您进行真正的比较。

Yes, == is bad for comparing Strings (any objects really, unless you know they're canonical).是的, ==不适合比较字符串(实际上是任何对象,除非您知道它们是规范的)。 == just compares object references. ==只是比较对象引用。 .equals() tests for equality. .equals()测试是否相等。 For Strings, often they'll be the same but as you've discovered, that's not guaranteed always.对于字符串,它们通常是相同的,但正如您所发现的,这并不总是得到保证。

Java have a String pool under which Java manages the memory allocation for the String objects. Java 有一个字符串池,Java 在该池下管理字符串对象的内存分配。 See String Pools in Java请参阅Java 中的字符串池

When you check (compare) two objects using the == operator it compares the address equality into the string-pool.当您使用==运算符检查(比较)两个对象时,它会将地址相等性与字符串池进行比较。 If the two String objects have the same address references then it returns true , otherwise false .如果两个 String 对象具有相同的地址引用,则返回true ,否则返回false But if you want to compare the contents of two String objects then you must override the equals method.但是如果你想比较两个 String 对象的内容,那么你必须重写equals方法。

equals is actually the method of the Object class, but it is Overridden into the String class and a new definition is given which compares the contents of object. equals实际上是 Object 类的方法,但是它被重写到 String 类中,并给出了一个新的定义来比较 object 的内容。

Example:
    stringObjectOne.equals(stringObjectTwo);

But mind it respects the case of String.但请注意它尊重字符串的情况。 If you want case insensitive compare then you must go for the equalsIgnoreCase method of the String class.如果您想要不区分大小写的比较,那么您必须使用 String 类的 equalsIgnoreCase 方法。

Let's See:让我们来看看:

String one   = "HELLO"; 
String two   = "HELLO"; 
String three = new String("HELLO"); 
String four  = "hello"; 

one == two;   // TRUE
one == three; // FALSE
one == four;  // FALSE

one.equals(two);            // TRUE
one.equals(three);          // TRUE
one.equals(four);           // FALSE
one.equalsIgnoreCase(four); // TRUE

I agree with the answer from zacherates.我同意zacherates的回答。

But what you can do is to call intern() on your non-literal strings.但是你可以做的是在你的非文字字符串上调用intern()

From zacherates example:从 zacherates 示例:

// ... but they are not the same object
new String("test") == "test" ==> false 

If you intern the non-literal String equality is true :如果您实习非文字字符串相等是true

new String("test").intern() == "test" ==> true 

== compares object references in Java , and that is no exception for String objects. ==比较 Java 中的对象引用, String对象也不例外。

For comparing the actual contents of objects (including String ), one must use the equals method .为了比较对象的实际内容(包括String ),必须使用equals方法

If a comparison of two String objects using == turns out to be true , that is because the String objects were interned, and the Java Virtual Machine is having multiple references point to the same instance of String .如果使用==比较两个String对象的结果是true ,那是因为String对象被实习,并且 Java 虚拟机有多个引用指向String的同一个实例。 One should not expect that comparing one String object containing the same contents as another String object using == to evaluate as true .不应期望使用==将包含相同内容的一个String对象与另一个String对象进行比较来评估为true

.equals() compares the data in a class (assuming the function is implemented). .equals()比较类中的数据(假设函数已实现)。 == compares pointer locations (location of the object in memory). ==比较指针位置(对象在内存中的位置)。

== returns true if both objects (NOT TALKING ABOUT PRIMITIVES) point to the SAME object instance. ==如果两个对象(NOT TALKING ABOUT PRIMITIVES)都指向同一个对象实例,则返回 true。 .equals() returns true if the two objects contain the same data equals() Versus == in Java .equals()如果两个对象包含相同的数据,则返回 true equals()与 Java 中的==比较

That may help you.这可能会帮助你。

== performs a reference equality check, whether the 2 objects (strings in this case) refer to the same object in the memory. ==执行引用相等检查,这 2 个对象(在本例中为字符串)是否引用内存中的同一对象。

The equals() method will check whether the contents or the states of 2 objects are the same. equals()方法将检查 2 个对象的内容状态是否相同。

Obviously == is faster, but will (might) give false results in many cases if you just want to tell if 2 String s hold the same text.显然==更快,但是如果您只想判断 2 个String是否包含相同的文本,在许多情况下会(可能)给出错误的结果。

Definitely the use of the equals() method is recommended.绝对推荐使用equals()方法。

Don't worry about the performance.不用担心性能。 Some things to encourage using String.equals() :鼓励使用String.equals()的一些事情:

  1. Implementation of String.equals() first checks for reference equality (using == ), and if the 2 strings are the same by reference, no further calculation is performed! String.equals()的实现首先检查引用相等(使用== ),如果两个字符串通过引用相同,则不执行进一步计算!
  2. If the 2 string references are not the same, String.equals() will next check the lengths of the strings.如果 2 个字符串引用不相同, String.equals()将接下来检查字符串的长度。 This is also a fast operation because the String class stores the length of the string, no need to count the characters or code points.这也是一个快速的操作,因为String类存储了字符串的长度,不需要计算字符或代码点。 If the lengths differ, no further check is performed, we know they cannot be equal.如果长度不同,则不执行进一步检查,我们知道它们不可能相等。
  3. Only if we got this far will the contents of the 2 strings be actually compared, and this will be a short-hand comparison: not all the characters will be compared, if we find a mismatching character (at the same position in the 2 strings), no further characters will be checked.只有当我们走到这一步时,才会真正比较两个字符串的内容,这将是一个速记比较:如果我们发现一个不匹配的字符(在两个字符串中的相同位置),并不是所有的字符都会被比较),将不再检查其他字符。

When all is said and done, even if we have a guarantee that the strings are interns, using the equals() method is still not that overhead that one might think, definitely the recommended way.总而言之,即使我们保证字符串是实习生,使用equals()方法仍然不是人们可能认为的那样开销,绝对是推荐的方法。 If you want an efficient reference check, then use enums where it is guaranteed by the language specification and implementation that the same enum value will be the same object (by reference).如果您想要一个有效的引用检查,那么在语言规范和实现保证相同的枚举值将是相同的对象(通过引用)的情况下使用枚举。

If you're like me, when I first started using Java, I wanted to use the "==" operator to test whether two String instances were equal, but for better or worse, that's not the correct way to do it in Java.如果您像我一样,当我第一次开始使用 Java 时,我想使用“==”运算符来测试两个 String 实例是否相等,但无论好坏,这在 Java 中都不是正确的方法。

In this tutorial I'll demonstrate several different ways to correctly compare Java strings, starting with the approach I use most of the time.在本教程中,我将演示几种正确比较 Java 字符串的不同方法,从我大部分时间使用的方法开始。 At the end of this Java String comparison tutorial I'll also discuss why the "==" operator doesn't work when comparing Java strings.在本 Java 字符串比较教程的最后,我还将讨论为什么“==”运算符在比较 Java 字符串时不起作用。

Option 1: Java String comparison with the equals method Most of the time (maybe 95% of the time) I compare strings with the equals method of the Java String class, like this:选项 1:Java String 与 equals 方法比较大多数时候(可能是 95% 的时间)我用 Java String 类的 equals 方法比较字符串,如下所示:

if (string1.equals(string2))

This String equals method looks at the two Java strings, and if they contain the exact same string of characters, they are considered equal.此 String equals 方法查看两个 Java 字符串,如果它们包含完全相同的字符串,则认为它们相等。

Taking a look at a quick String comparison example with the equals method, if the following test were run, the two strings would not be considered equal because the characters are not the exactly the same (the case of the characters is different):看一个使用 equals 方法的快速字符串比较示例,如果运行以下测试,两个字符串将不会被视为相等,因为字符不完全相同(字符的大小写不同):

String string1 = "foo";
String string2 = "FOO";

if (string1.equals(string2))
{
    // this line will not print because the
    // java string equals method returns false:
    System.out.println("The two strings are the same.")
}

But, when the two strings contain the exact same string of characters, the equals method will return true, as in this example:但是,当两个字符串包含完全相同的字符串时,equals 方法将返回 true,如下例所示:

String string1 = "foo";
String string2 = "foo";

// test for equality with the java string equals method
if (string1.equals(string2))
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Option 2: String comparison with the equalsIgnoreCase method选项 2:使用 equalsIgnoreCase 方法进行字符串比较

In some string comparison tests you'll want to ignore whether the strings are uppercase or lowercase.在某些字符串比较测试中,您需要忽略字符串是大写还是小写。 When you want to test your strings for equality in this case-insensitive manner, use the equalsIgnoreCase method of the String class, like this:当您想以这种不区分大小写的方式测试字符串是否相等时,请使用 String 类的 equalsIgnoreCase 方法,如下所示:

String string1 = "foo";
String string2 = "FOO";

 // java string compare while ignoring case
 if (string1.equalsIgnoreCase(string2))
 {
     // this line WILL print
     System.out.println("Ignoring case, the two strings are the same.")
 }

Option 3: Java String comparison with the compareTo method选项 3:使用 compareTo 方法比较 Java 字符串

There is also a third, less common way to compare Java strings, and that's with the String class compareTo method.还有第三种比较不常用的方法来比较 Java 字符串,那就是使用 String 类的 compareTo 方法。 If the two strings are exactly the same, the compareTo method will return a value of 0 (zero).如果两个字符串完全相同,则 compareTo 方法将返回值 0(零)。 Here's a quick example of what this String comparison approach looks like:下面是这个字符串比较方法的简单示例:

String string1 = "foo bar";
String string2 = "foo bar";

// java string compare example
if (string1.compareTo(string2) == 0)
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

While I'm writing about this concept of equality in Java, it's important to note that the Java language includes an equals method in the base Java Object class.当我在写 Java 中的这个相等概念时,重要的是要注意 Java 语言在基本 Java Object 类中包含一个 equals 方法。 Whenever you're creating your own objects and you want to provide a means to see if two instances of your object are "equal", you should override (and implement) this equals method in your class (in the same way the Java language provides this equality/comparison behavior in the String equals method).每当您创建自己的对象并且想要提供一种方法来查看对象的两个实例是否“相等”时,您应该在您的类中覆盖(并实现)这个 equals 方法(以 Java 语言提供的相同方式String equals 方法中的这种相等/比较行为)。

You may want to have a look at this ==, .equals(), compareTo(), and compare()您可能想看看这个==、.equals()、compareTo() 和 compare()

Function:功能:

public float simpleSimilarity(String u, String v) {
    String[] a = u.split(" ");
    String[] b = v.split(" ");

    long correct = 0;
    int minLen = Math.min(a.length, b.length);

    for (int i = 0; i < minLen; i++) {
        String aa = a[i];
        String bb = b[i];
        int minWordLength = Math.min(aa.length(), bb.length());

        for (int j = 0; j < minWordLength; j++) {
            if (aa.charAt(j) == bb.charAt(j)) {
                correct++;
            }
        }
    }

    return (float) (((double) correct) / Math.max(u.length(), v.length()));
}

Test:测试:

String a = "This is the first string.";

String b = "this is not 1st string!";

// for exact string comparison, use .equals

boolean exact = a.equals(b);

// For similarity check, there are libraries for this
// Here I'll try a simple example I wrote

float similarity = simple_similarity(a,b);

The == operator check if the two references point to the same object or not. ==运算符检查两个引用是否指向同一个对象。 .equals() check for the actual string content (value). .equals()检查实际的字符串内容(值)。

Note that the .equals() method belongs to class Object (super class of all classes).注意.equals()方法属于Object类(所有类的超类)。 You need to override it as per you class requirement, but for String it is already implemented, and it checks whether two strings have the same value or not.您需要根据您的类要求覆盖它,但对于 String 它已经实现,它会检查两个字符串是否具有相同的值。

  • Case 1情况1

     String s1 = "Stack Overflow"; String s2 = "Stack Overflow"; s1 == s2; //true s1.equals(s2); //true

    Reason: String literals created without null are stored in the String pool in the permgen area of heap.原因:创建的不带 null 的字符串字面量存储在堆的 permgen 区域的字符串池中。 So both s1 and s2 point to same object in the pool.所以 s1 和 s2 都指向池中的同一个对象。

  • Case 2案例2

     String s1 = new String("Stack Overflow"); String s2 = new String("Stack Overflow"); s1 == s2; //false s1.equals(s2); //true

    Reason: If you create a String object using the new keyword a separate space is allocated to it on the heap.原因:如果您使用new关键字创建一个 String 对象,则会在堆上为其分配一个单独的空间。

==比较对象的引用值,而java.lang.String类中的equals()方法比较String对象的内容(与另一个对象)。

I think that when you define a String you define an object.我认为当你定义一个String时,你定义了一个对象。 So you need to use .equals() .所以你需要使用.equals() When you use primitive data types you use == but with String (and any object) you must use .equals() .当您使用原始数据类型时,您使用==但对于String (和任何对象),您必须使用.equals()

If the equals() method is present in the java.lang.Object class, and it is expected to check for the equivalence of the state of objects!如果java.lang.Object类中存在equals()方法,并且它应该检查对象状态的等价性! That means, the contents of the objects.这意味着,对象的内容。 Whereas the == operator is expected to check the actual object instances are same or not.==运算符应检查实际对象实例是否相同。

Example例子

Consider two different reference variables, str1 and str2 :考虑两个不同的参考变量str1str2

str1 = new String("abc");
str2 = new String("abc");

If you use the equals()如果你使用equals()

System.out.println((str1.equals(str2))?"TRUE":"FALSE");

You will get the output as TRUE if you use == .如果您使用== ,您将获得TRUE输出。

System.out.println((str1==str2) ? "TRUE" : "FALSE");

Now you will get the FALSE as output, because both str1 and str2 are pointing to two different objects even though both of them share the same string content.现在您将得到FALSE作为输出,因为str1str2都指向两个不同的对象,即使它们共享相同的字符串内容。 It is because of new String() a new object is created every time.这是因为new String()每次都会创建一个新对象。

Operator == is always meant for object reference comparison , whereas the String class .equals() method is overridden for content comparison :运算符==始终用于对象引用比较,而 String 类.equals()方法被覆盖以进行内容比较

String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // It prints false (reference comparison)
System.out.println(s1.equals(s2)); // It prints true (content comparison)

All objects are guaranteed to have a .equals() method since Object contains a method, .equals() , that returns a boolean.所有对象都保证有一个.equals()方法,因为 Object 包含一个方法.equals() ,它返回一个布尔值。 It is the subclass' job to override this method if a further defining definition is required.如果需要进一步定义,则覆盖此方法是子类的工作。 Without it (ie using == ) only memory addresses are checked between two objects for equality.没有它(即使用== ),仅检查两个对象之间的内存地址是否相等。 String overrides this .equals() method and instead of using the memory address it returns the comparison of strings at the character level for equality. String 覆盖了这个.equals()方法,而不是使用内存地址,它返回字符级别的字符串比较是否相等。

A key note is that strings are stored in one lump pool so once a string is created it is forever stored in a program at the same address.一个重要的注意事项是字符串存储在一个集中池中,因此一旦创建了字符串,它就会永远存储在同一地址的程序中。 Strings do not change, they are immutable.字符串不会改变,它们是不可变的。 This is why it is a bad idea to use regular string concatenation if you have a serious of amount of string processing to do.这就是为什么如果您有大量的字符串处理要做,那么使用常规字符串连接是一个坏主意。 Instead you would use the StringBuilder classes provided.相反,您将使用提供的StringBuilder类。 Remember the pointers to this string can change and if you were interested to see if two pointers were the same == would be a fine way to go.请记住,指向此字符串的指针可以更改,如果您有兴趣查看两个指针是否相同==将是一个不错的方法。 Strings themselves do not.字符串本身没有。

You can also use the compareTo() method to compare two Strings.您还可以使用compareTo()方法来比较两个字符串。 If the compareTo result is 0, then the two strings are equal, otherwise the strings being compared are not equal.如果 compareTo 结果为 0,则两个字符串相等,否则被比较的字符串不相等。

The == compares the references and does not compare the actual strings. ==比较引用而不比较实际字符串。 If you did create every string using new String(somestring).intern() then you can use the == operator to compare two strings, otherwise equals() or compareTo methods can only be used.如果您确实使用new String(somestring).intern()创建了每个字符串,那么您可以使用==运算符比较两个字符串,否则只能使用 equals() 或 compareTo 方法。

In Java, when the == operator is used to compare 2 objects, it checks to see if the objects refer to the same place in memory.在 Java 中,当==运算符用于比较 2 个对象时,它会检查对象是否引用内存中的同一位置。 In other words, it checks to see if the 2 object names are basically references to the same memory location.换句话说,它检查这两个对象名称是否基本上是对同一内存位置的引用。

The Java String class actually overrides the default equals() implementation in the Object class – and it overrides the method so that it checks only the values of the strings, not their locations in memory. Java String类实际上覆盖了Object类中的默认equals()实现——它覆盖了该方法,因此它只检查字符串的值,而不检查它们在内存中的位置。 This means that if you call the equals() method to compare 2 String objects, then as long as the actual sequence of characters is equal, both objects are considered equal.这意味着如果调用equals()方法比较 2 个String对象,那么只要实际的字符序列相等,则认为两个对象相等。

The == operator checks if the two strings are exactly the same object. ==运算符检查两个字符串是否是完全相同的对象。

The .equals() method check if the two strings have the same value. .equals()方法检查两个字符串是否具有相同的值。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM