+ 2

How charcters are stored in java?

Character class in java doesn't override equals method, so when I call equals on a character than a method defined in Object is called, which just compares their references. Than how is it that two characters like below equals to true when they would be having different reference values. Character a='a'; Character c='a'; In this case do a and c reference same location?

5th Apr 2021, 12:48 PM
rajshekhar y dodamani
rajshekhar y dodamani - avatar
10 ответов
+ 3
At first: It is the sense of the equals() method to return true if two objects have the same value. In your case: a.equals(c) returns true because 'a' == 'a'. But a == c is false because they are two different objects. In short: equals() -> compares values == -> compares references
5th Apr 2021, 4:25 PM
Denise Roßberg
Denise Roßberg - avatar
+ 1
https://en.m.wikipedia.org/wiki/String_interning "... Objects other than strings can be interned. For example, in Java, when primitive values are boxed into a wrapper object, certain values (any boolean, any byte, any char from 0 to 127, and any short or int between −128 and 127) are interned, and any two boxing conversions of one of these values are guaranteed to result in the same object.[6] ..."
5th Apr 2021, 1:53 PM
Ciro Pellegrino
Ciro Pellegrino - avatar
+ 1
you are wrong. the equals function for the class Character is public boolean equals(Object obj) { if (obj instanceof Character) { return value == ((Character)obj).charValue(); } return false; } where value is a class member private final char value;
5th Apr 2021, 6:44 PM
Ciro Pellegrino
Ciro Pellegrino - avatar
+ 1
rajshekhar y dodamani That's right. And this is the reason why you have to override the equals() method. If you are interested you can have a look into this code: https://code.sololearn.com/cK2H7CdVEq45/?ref=app The Character class has overriden the equals() method. public boolean equals(Object o){ return o instanceof Character && value == ((Character) o); } source: http://developer.classpath.org/doc/java/lang/Character-source.html instanceof is a keyword to check the instance, in this case if Object o is from type Character. And than it checks if both values are equal.
5th Apr 2021, 6:48 PM
Denise Roßberg
Denise Roßberg - avatar
+ 1
Ciro Pellegrino Which java version is your source code? I am just wondering because my source code looks different.
5th Apr 2021, 6:51 PM
Denise Roßberg
Denise Roßberg - avatar
+ 1
Character.java in lib/src.zip by Oracle JDK 11 LTS but 15 has the same code.
5th Apr 2021, 11:25 PM
Ciro Pellegrino
Ciro Pellegrino - avatar
0
JVM probably casts any of the Autoboxed classes (Integer, Character, Boolean...) into their native datatypes before comparing them. I could be wrong, but that seems like the most logical thing to do.
5th Apr 2021, 1:32 PM
Mohamad Kamar
Mohamad Kamar - avatar
0
Denise Roßberg but equals method in Object class looks something like this boolean equals (Object o){ if(this==o) return true; return false; } Here it only compares thier references and not their values, so it should return false but it does not. Is equals overridden in Character class, so that also compares values.
5th Apr 2021, 5:45 PM
rajshekhar y dodamani
rajshekhar y dodamani - avatar
0
Character a='a', c='a'; //97 System.out.println( System.identityHashCode(a) ); System.out.println( System.identityHashCode(c) ); //same System.out.println( a == c ); //true a=128; c=128; System.out.println( System.identityHashCode(a) ); System.out.println( System.identityHashCode(c) ); // different System.out.println( a == c ); //false
5th Apr 2021, 7:16 PM
zemiak
0
No: if they had the same location, and one of the variables a or c would be deleted (e.g. because of local variables), the other would also deleted. This are 2 independence variables, whitch have randomly the same value
7th Apr 2021, 8:17 AM
Sebastian Ahlborn
Sebastian Ahlborn - avatar