问题
in java, i have created 2 string literals having same value
String a = "Hello";
String b = "Hello";
now both of them should have same reference
System.out.println(a==n); // returns true
but when i do
b+=" World";
System.out.println(a==b); // returns false
Now i have 2 questions here
1. why a and b are not referencing to same object after 'b+=' operation?
2. how come i'm able to change string b without any error?(because i have read String class is immutable)
回答1:
The reason you can change b
is because you're technically making a new String object and assigning it to the existing reference.
b += " World"
is the same as
b = b + " World";
b
is technically pointing to a new String object. So to start out, a
and b
are pointing to the same object, but when b
is modified it is now a different object, so a
will not equal "Hello World"
and a==b
will now be false.
For examples of mutable String classes, try StringBuffer
or StringBuilder
. You can use their .append()
method to add to the string, along with other methods to modify it.
回答2:
When you do
b+=" World"
you are creating a new string instance, of course this does not point to the same old string anymore.You are not changing the old string, instead you are creating a new string and assigning it to the variable b. Use the
final
modifier if you want to always refer to the same object with that variable.
回答3:
a and b are pointing to a String object. Modifying b, means you are now pointing to a new object.
Because Strings are immutable, when you "modify" a string, a new object is created. That's why the second is no longer the same.
来源:https://stackoverflow.com/questions/18084776/how-java-handles-string-literals