Object o1 = new Object();
Object o2 = new Object();
//o1=o2;
System.out.println(o1.equals(o2));
It returns false
. It can return true
, if the comment is removed.
Why isn't the same thing applicable to the String
class?
String s1=new String();
String s2=new String();
System.out.println(s1.equals(s2));
It returns true
. Why? (because String
uses interns or something else involved?)
equals method needs to be overridden inside the class if you want to make it behave in some other way. By default, it checks if two references refer to the same object.
The
equals
implemented in theObject
class only compare references. Here is the source code:equals
forObject
compares memory references.That is why it is false since they are different
Object
sequals
forString
is overridden to compare based on characters.You have 2 empty
String
objects that is whyequals
returnstrue
.The
equals()
Method of theObject
class doesn't know how to compare Strings, it only knows how to compare objects. For comparing strings, a string class will override theequals()
Method and compare strings in it.Object.equals()
will compare only references, whereString.equals()
will compare values.Because equals() for String compares the content, not the object itself.
(Link to the source of String.equals())
Versus the equals for Object:
(Link to the source of Object.equals())
Also, don't forget the contract of the
equals()
function:Also recommended reading:
==
compares addresses of the objects / strings / anything.equals()
designed to use internal state of the objects for comparison.So:
new Object() == new Object() => false
- two separate object at different addresses in memory.new String("a") == new String("a") => false
- the same situation - two separate addresses for the string objects.new String("a").equals(new String("a")) => true
- addresses differ, but Java will took one object state ('a') and compared with other object state ('a') will found them equal and will report true.Using the equals() method you can code the comparison any way is proper for your program.
intern()
is a bit different story. It is intended to return same object (address) for the same char sequence. It is useful to reduce amount of memory required when you have same strings constructed several times.new String("aaa").intern()
will seek in the machine memory if ever someone created "aaa" string before and will return the first instance of the String ... If non has been found - the current one will be enlisted as the first and all further "aaa".intern() and newString("aaa").intern()
and("a"+"aa").intern()
will return that "first" instance.Beware:
"aaa".intern()
is not very fast operation and if you will intern all strings - you will save some memory, but will loose quite a lot of CPU work.