I have a char [].
StringBuffer x = new StringBuffer(name.toString());
StringBuffer y = new StringBuffer();
y.append(name);
String s1 = new String(name);
print x -> [C#42b3b079
print y -> metafactory
print s1 -> metafactory
Could you please tell me why the difference?
When I read the javadoc:
String java.lang.Object.toString()
Returns a string representation of the object. In general, the toString method
returns a string that "textually represents" this object. The result should be a
concise but informative representation that is easy for a person to read. It is
recommended that all subclasses override this method.
The toString method for class Object returns a string consisting of the name of the
class of which the object is an instance, the at-sign character `#', and the unsigned
hexadecimal representation of the hash code of the object. In other words, this method
returns a string equal to the value of:
getClass().getName() + '#' + Integer.toHexString(hashCode())
Looks like it depends on implementation. Shouldn't it be advisable to return a
readable string instead with the toString() API.
Thanks
The code:
StringBuffer x = new StringBuffer(name.toString());
behaves the same as:
String name2str = name.toString(); //here the value of name2str is "[C#42b3b079"
StringBuffer x = new StringBuffer(name2str);
That's why print x -> [C#42b3b079.
If you construct the StringBuffer as:
StringBuffer x = new StringBuffer(name);
Then print x -> metafactory.
The reason Object.toString() implemented like this is that, as the base of the inheritance chain, it really doesn't know what information of the subclasses should be added to the return value of toString(). So it just output the class name and the hashcode of the object, which can identify the instance, and it's readable in my opinion.
If you want to output every element of the array, just use the utility method java.util.Arrays.toString(name).
Related
I have written the following code:-
Test ob = new Test();
System.out.println(ob.toString());
System.out.println(ob.hashCode());
and the output is
Test#15db9742
366712642
i understand that the second value is the hashcode of the object and it is an integer value but i am not able to understand what is the first value. If it is the hashcode of the object then how can it be string and not integer
If you read the docs for toString very carefully:
The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `#', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:
getClass().getName() + '#' + Integer.toHexString(hashCode())
366712642 in hex is exactly 15DB9742!
If it is the hashcode of the object then how can it be string and not integer?
As you can see from the docs, it is the class name, plus #, plus the dashcode, not just the hash code. Also, the method's name is toString. It would be weird if it returned an int, wouldn't it?
It represents classname#HashCode_in_Hexadeciaml_form. So, the string which you are seeing is actually the hexadecimal form of the integer hashcode
You can look the source code of Object.java. toString method is meant to provide information about class at runtime, so can be overriden. What you're doing is calling the default toString method from Object.java. It simply returns following:
getClass().getName() + "#" + Integer.toHexString(hashCode()
Hence the output.
See code here
I made an arraylist data and when I do
int last=data.size();
int random = r.nextInt(last) + 0;
string a = ""+data.get(random).toString();
a gets the address of the data.
Actually , data.get(random) returns you the object from the list. Since, you are calling data.get(random).toString(), you are getting the string representation which by default returns the hexadecimal characters.
Try the following:
a. Perform your code with a list of String. -> it should return the string at that index position(random).
b.
Try overriding the toString() method inside you java object, you will get the output from your toString() method of the java object,.
This question already has answers here:
What's the simplest way to print a Java array?
(37 answers)
Closed 8 years ago.
Here is my code:
String[] magic = {"stick", "hat", "witch"};
String magic1 = magic.toString();
String magic2 = Arrays.toString(magic);
System.out.println(magic1); // this is printing a memory location
System.out.println(magic2); // this one prints: [stick, hat, witch]
What is the difference between magic1 and magic2?
Arrays are objects, but they don't change (override) its toString() method, which means they use default one, inherited from Object. If you read documentation of this method you will find:
The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `#', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:
getClass().getName() + '#' + Integer.toHexString(hashCode())
In your case
getClass().getName() returns [Ljava.lang.String which means
one dimensional array (because there is only one [)
of type which full name is java.lang.String
and Integer.toHexString(hashCode()) returns something like 1db9742 which is hexadecimal form of integer returned by hashCode() method.
Now if you take a look at code of Arrays.toString(Object[] array) (String[] is considered as Object[])
4531 public static String toString(Object[] a) {4532 if (a == null)4533 return "null";4535 int iMax = a.length - 1;4536 if (iMax == -1)4537 return "[]";4539 StringBuilder b = new StringBuilder();4540 b.append('[');4541 for (int i = 0; ; i++) {4542 b.append(String.valueOf(a[i]));4543 if (i == iMax)4544 return b.append(']').toString();4545 b.append(", ");4546 }4547 }
you will see that its purpose is to create string build from content of this array. It does this by iterating over all elements and adding their string representation to StringBuilder which is then used to create String which will be returned.
It is basically a tailored toString which makes the output pretty.
What you see in the first toString is the memory address . Reason being that the variable-name is just that - a memory address( aka reference ).
Every class inherits toString, and can implement its own.
See Arrays class API
String[] names = {"Bob", "Dad", "Mom"};
String names1 = names.toString();
String names2 = Arrays.toString(names);
System.out.println(names1 );
System.out.println(names2 );
prints out:
[Ljava.lang.String;#1034bb5
[Bob, Dad, Mom]
Read the doumentation. I have copied the necessary information here.
public static String toString(Object[] a)
Returns a string representation of the contents of the specified array. If the array contains other arrays as elements, they are converted to strings by the Object.toString() method inherited from Object, which describes their identities rather than their contents.
The value returned by this method is equal to the value that would be returned by Arrays.asList(a).toString(), unless a is null, in which case "null" is returned.
public String toString()
Returns a string representation of the object. In general, the toString method returns a string that "textually represents" this object. The result should be a concise but informative representation that is easy for a person to read. It is recommended that all subclasses override this method.
The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `#', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:
getClass().getName() + '#' + Integer.toHexString(hashCode())
I want to get the content in the content model of alfresco to be displayed in my Eclipse. Below is my method from the Dictionary service:
#Override
public Collection<QName> getSubTypes(QName arg0, boolean arg1)
{
//qName = (ArrayList<QName>) model.put("Array is", arg0);
qName.add(arg0);
return qName;
}
And this is how I am calling the method on my test class:
SampleTest sampleTest = new SampleTest();
// WebScriptRequest webScriptRequest =null;
// webScriptRequest.getExtensionPath();;
// String string = webScriptRequest.getExtensionPath();
System.out.println("" + sampleTest.getSubTypes(ContentModel.TYPE_CONTENT, true).toArray().toString());
array.toString prints the address of the array, not the elements in it.
you can use java.util.Arrays.toString method to print the string
so your code should be like
System.out.println(Arrays.toString(sampleTest.getSubTypes(ContentModel.TYPE_CONTENT, true).toArray()));
Maybe the Method Arrays.toString() is what you are looking for.
.toString() on an Object only gives you the Object represantation not the actual value as a String(if it is not overriden).
Do you want to print the Collection ? You can convert it into an array and use either Arrays.toString(arr) or Arrays.deepToString(arr) :
Arrays.toString(
sampleTest.getSubTypes(ContentModel.TYPE_CONTENT, true).toArray());
What you are trying is :
.toArray().toString()
So it converts the Collection to an array and invokes the toString() on that array object , hence by default Object#toString() is called :
The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `#', and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of:
getClass().getName() + '#' + Integer.toHexString(hashCode())
The following is my java code snippet:
static String sortChars(String s) {
char[] chars = s.toCharArray();
Arrays.sort(chars);
return chars.toString();
}
I invoke above function by using:
String result = sortChars(s);
But the result does not meet my expectation:for example,the s="are", the result="aer". However, when I use:
return new String(chars)
It works.
Could somebody tell me the reason of it. Thanks
Since char[] class does not override the default Object's toString() implementation, it does not return a string composed by the characters in the char array, but the char[] class name + hash code. For example: arr[C#19821f.
toString() returns a string representation of the Object. You can look at it as a description of the object.
new String(chars) will give you a String with the content of the char array.
Use toString() if you want to represent an Object to the user or in a log, use new String() if you want to get a String object that is the same as the content of your array
Note that, among the constructors for a Java String is one that accepts a character array. That converts the character array into a string as you would expect, and it is the correct choice for what you are doing.