What makes reference comparison (==) work for some strings in Java?

how to compare two strings in java using if
how to compare two strings in java without using equals
java 8 string comparison
compare 3 strings in java
java compare strings
how to check a string in java
almost equivalent strings java
java string vs equals

I have following lines of codes to compare String. str1 not equal to str2, which is understandable since it compares object reference. But then why s1 is equal to s2?

String s1 = "abc";
String s2 = "abc";

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

if (s1==s2)
    System.out.println("s1==s2");           
else
    System.out.println("s1!=s2");

if (str1==str2)
    System.out.println("str1==str2");           
else
    System.out.println("str1!=str2");

if (s1==str1)
    System.out.println("str1==s1");         
else
    System.out.println("str1!=s1");

Output:

  s1==s2
  str1!=str2
  str1!=s1 

The string constant pool will essentially cache all string literals so they're the same object underneath, which is why you see the output you do for s1==s2. It's essentially an optimisation in the VM to avoid creating a new string object each time a literal is declared, which could get very expensive very quickly! With your str1==str2 example, you're explicitly telling the VM to create new string objects, hence why it's false.

As an aside, calling the intern() method on any string will add it to the constant pool (and return the String that it's added to the pool.) It's not necessarily a good idea to do this however unless you're sure you're dealing with strings that will definitely be used as constants, otherwise you may end up creating hard to track down memory leaks.

How Do I Compare Strings in Java?, Comparing strings is very helpful during processes like authentication, sorting, reference matching, etc. I have listed three different ways to� The string constant pool will essentially cache all string literals so they’re the same object underneath, which is why you see the output you do for s1==s2.It’s essentially an optimisation in the VM to avoid creating a new string object each time a literal is declared, which could get very expensive very quickly!

s1 and s2 are String literals. When you create a new String literal the compiler first checks whether any literal representing the same is present in the String pool or not. If there is one present, the compiler returns that literal otherwise the compiler creates a new one.

When you created String s2 the compiler returns the String s1 from the pool as it was already created before. That is the reason why s1 and s2 are same. This behaviour is called interning.

String comparisons in Java, How Java's String methods, keywords, and operators process Each of these interfaces supports certain actions: accelerate, brake, But the equals() method has to be overridden to make it work properly. As you can see, the state of the String class value has to be equals() and not the object reference. Java String Comparison: Comparing Strings in Java. To compare strings in java, use .equals, not ==. == will tell you if two references refer to the same object. To test if two strings are identical, .equals does what you want. The following program illustrates the point. // Here's some text. String text1 = "Hello there"; // Here's the same text.

This phenomenon is due to String interning.

Basically, all string literals are "cached" and reused.

5 ways to Compare String Objects in Java, here are many ways to compare String in Java e.g. you can use equals() and You can even use the equality operator == to perform reference based You can learn more about that in my post how intern() method works in Java. to perform String comparison in Java, let me share you some important points and useful� The compareTo() method returns an int type value and compares two Strings character by character lexicographically based on a dictionary or natural ordering.. This method returns 0 if two Strings are equal or if both are null, a negative number if the first String comes before the argument, and a number greater than zero if the first String comes after the argument String.

This is due to String literals being interned. On this matter, Java documentations says:

All literal strings and string-valued constant expressions are interned

And this explains why s1 and s2 are the same (these two variables point to the same interned string)

Right way to Compare String in Java, The String is a special class in Java, so is String comparison. Java programmer has made mistakes sometimes by comparing two String variable using == operator. Why? because equality operator compares references i.e. if two reference� Let’s look into each of these string comparison ways in detail. Java String Comparison using == operator. When double equals operator is used to compare two objects, it returns true when they are referring to the same object, otherwise false. Let’s look at some code snippets for using == for string comparison in java.

In Java, the same constant strings will be reused. So that s1 and s2 point to the same "abc" object and s1==s2. But when you use new String("abc"), another object will be created. So that s1 != str1.

String Comparison in Java, We can compare string in java on the basis of content and reference. System. out.println(s1==s3);//false(because s3 refers to instance created in nonpool); }; }. In java there are three ways to compare two strings. Ways of String Comparison: 1. By == operator. 2. By equals() method. 3. By compareTo() method. 1. By == operator: == operator compares the references of the string objects not the actual content of the string objects. It returns true if reference of the compared strings are equal, otherwise

Comparing Strings in Java, Take a look at different ways of comparing Strings in Java. for comparing text values is one of the most common mistakes Java beginners make. is created using the new operator – therefore they reference different objects. operations; this also has some very beneficial methods for String comparison. We can use == operators for reference comparison (address comparison) and .equals() method for content comparison. In simple words, == checks if both objects point to the same memory location whereas .equals() evaluates to the comparison of values in the objects.

4.4. String Equality — AP CSA Java Review, Figure 1: Several String variables with references to objects of the String class.�. Note. Use equals to test if two strings have the same characters in the same� Java String compare. We can compare string in java on the basis of content and reference. It is used in authentication (by equals() method), sorting (by compareTo() method), reference matching (by == operator) etc.

Compare two Strings in Java, Below are 5 ways to compare two Strings in Java: Using user-defined function : Define a function to compare values with int str1.compareTo(String str2). Working: It compares and returns the check equality but here are some of the differences between the two: Both s1 and s2 refers to different objects. x stores the reference which points to the "ab" string in the heap. So when x is passed as a parameter to the change() method, it still points to the "ab" in the heap like the following: Because java is pass-by-value, the value of x is the reference to "ab".

Comments
  • Did you try searching SO first? :(
  • stackoverflow.com/questions/7144059/… , stackoverflow.com/questions/4033625/… , stackoverflow.com/questions/6377058/string-reference , stackoverflow.com/questions/1903094/java-strings-and-stringpool
  • (I'm not closing this, because I haven't found another question as focused as this, but I am sure it exists)
  • also, stackoverflow.com/questions/6633852/…
  • possible duplicate of Using '==' instead of .equals for Java strings
  • +1 but also worth noting that adding lots of Strings to the constant pool in general is a bad idea since it can cause difficult-to-detect memory leaks. Only do this for a small number fixed of Strings that are genuinely going to be used as constants (e.g. HashMap keys), never for arbitrary String data.
  • @mikera agreed - I was putting it across more as an academic point than anything else :)
  • I am slightly confused when you say that "compiler creates a new one". AFAIK, compiler is meant for creating the intermediate machine code and does not actually runs (hence creates) any object in memory. Did you mean that compiler replaces string literals? Please clarify this.
  • I don't have any supporting documentation right now, but I believe @Chandra Sekhar was referring to the JIT or Just In Time compiler and not the javac compiler.