1 The simplest program:
public class A { public static void main(String args[]) { String s1 = "Hello"; String s2 = "Hello"; System.out.println(s1 == s2); } }
Many people must say that outputting true is indeed outputting true. s1 and s2 refer to the same thing. But if this program were written in a different way, it would definitely be different.
2 The first variant:
public class A { public static void main(String args[]) { String s1 = "Hello"; String s2 = new String("Hello"); System.out.println(s1 == s2); System.out.println(s1.equals(s2)); } }
or:
public class A { public static void main(String args[]) { String s1 = new String("Hello"); String s2 = new String("Hello"); System.out.println(s1 == s2); System.out.println(s1.equals(s2)); } }
Then the result is a bit uncertain. Some people have bad ideas. If taken separately, at least one of them will definitely not be equal.
The results of these two programs are false true. The reason is very simple. JAVA is a basically completely object-oriented language. s1 == s2 determines its reference (equivalent to memory address and pointer), and equals uses This object's own method determines whether the values are equal.
In the following expression:
String s1 = "Hello"; String s2 = new String("Hello");
What the JVM gets are two different pieces of information:
1. I want to create a "Hello" string.
2. I want to create a new "Hello" string, not the same as the original one.
So, s1 != s2.
3 The second variant:
顺序排列: public class A { public static void main(String args[]) { String s1 = new String("Hello"); String s2 = new String("Hello"); String s3 = "Hello"; s1=s1.intern(); s2=s2.intern(); System.out.println(s1 == s2); System.out.println(s1.equals(s2)); System.out.println(s3 == s2); System.out.println(s3.equals(s2)); } }
打乱顺序排列: public class A { public static void main(String args[]) { String s1 = new String("Hello"); String s3 = "Hello"; s1=s1.intern(); String s2 = new String("Hello"); s2=s2.intern(); //也可以String s2 = new String("Hello").intern(); System.out.println(s1 == s2); System.out.println(s1.equals(s2)); System.out.println(s3 == s2); System.out.println(s3.equals(s2)); } }
Then it should be clear this time =
Two objects, but with some shy things added in the middle, so the answer must be true true true true.
So what exactly is intern?
4 The role of intern:
When the intern method is called, if the pool already contains a string equal to this String object (the object is determined by the equals(Object) method), the string in the pool is returned. Otherwise, add this String object to the pool and return a reference to this String object.
Applicable situations of intern: situations where multiple identical large strings appear at the same time, such as the design of a message queue where multiple identical messages may appear.
For more [JAVA] String.equals and == related articles on the different effects, please pay attention to the PHP Chinese website!