How do I print my Java object without getting "SomeType@2f92e0f4"?

I have a class defined as follows:

public class Person {
  private String name;

  // constructor and getter/setter omitted
}

I tried to print an instance of my class:

System.out.println(myPerson);

but I got the following output: com.foo.Person@2f92e0f4 .

A similar thing happened when I tried to print an array of Person objects:

Person[] people = //...
System.out.println(people); 

I got the output: [Lcom.foo.Person;@28a418fc

What does this output mean? How do I change this output so it contains the name of my person? And how do I print collections of my objects?

Note : this is intended as a canonical Q&A about this subject.


Background

All Java objects have a toString() method, which is invoked when you try and print the object.

System.out.println(myObject);  // invokes myObject.toString()

This method is defined in the Object class (the superclass of all Java objects). The Object.toString() method returns a fairly ugly looking string, composed of the name of the class, an @ symbol and the hashcode of the object in hexadecimal. The code for this looks like:

// Code of Object.toString()
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

A result such as com.foo.MyType@2f92e0f4 can therefore be explained as:

  • com.foo.MyType - the name of the class, ie the class is MyType in the package com.foo .
  • @ - joins the string together
  • 2f92e0f4 the hashcode of the object.
  • The name of array classes look a little different, which is explained well in the Javadocs for Class.getName() . For instance, [Ljava.lang.String means:

  • [ - an single-dimensional array (as opposed to [[ or [[[ etc.)
  • L - the array contains a class or interface
  • java.lang.String - the type of objects in the array

  • Customizing the Output

    To print something different when you call System.out.println(myObject) , you must override the toString() method in your own class. Here's a simple example:

    public class Person {
    
      private String name;
    
      // constructors and other methods omitted
    
      @Override
      public String toString() {
        return name;
      }
    }
    

    Now if we print a Person , we see their name rather than com.foo.Person@12345678 .

    Bear in mind that toString() is just one way for an object to be converted to a string. Typically this output should fully describe your object in a clear and concise manner. A better toString() for our Person class might be:

    @Override
    public String toString() {
      return getClass().getSimpleName() + "[name=" + name + "]";
    }
    

    Which would print, eg, Person[name=Henry] . That's a really useful piece of data for debugging/testing.

    If you want to focus on just one aspect of your object or include a lot of jazzy formatting, you might be better to define a separate method instead, eg String toElegantReport() {...} .


    Auto-generating the Output

    Many IDEs offer support for auto-generating a toString() method, based on the fields in the class. See docs for Eclipse and IntelliJ, for example.

    Several popular Java libraries offer this feature as well. Some examples include:

  • ToStringBuilder from Apache Commons Lang

  • MoreObjects.ToStringHelper from Google Guava

  • @ToString annotation from Project Lombok


  • Printing groups of objects

    So you've created a nice toString() for your class. What happens if that class is placed into an array or a collection?

    Arrays

    If you have an array of objects, you can call Arrays.toString() to produce a simple representation of the contents of the array. For instance, consider this array of Person objects:

    Person[] people = { new Person("Fred"), new Person("Mike") };
    System.out.println(Arrays.toString(people));
    
    // Prints: [Fred, Mike]
    

    Note: this is a call to a static method called toString() in the Arrays class, which is different to what we've been discussing above.

    If you have a multi-dimensional array , you can use Arrays.deepToString() to achieve the same sort of output.

    Collections

    Most collections will produce a pretty output based on calling .toString() on every element.

    List<Person> people = new ArrayList<>();
    people.add(new Person("Alice"));
    people.add(new Person("Bob"));    
    System.out.println(people);
    
    // Prints [Alice, Bob]
    

    So you just need to ensure your list elements define a nice toString() as discussed above.


    我认为apache提供了一个更好的util类,它提供了一个获取字符串的函数

    ReflectionToStringBuilder.toString(object)
    

    Every class in java has toString() method in it by default, which is called by System.out.println() if you pass some object of a class to it. When you try to print object of a class, the System.out.println() method will call toString() of the class which returns the className@hashcode of that object.

    {
        SomeClass sc = new SomeClass();
        // Class @ followed by hashcode of object in Hexadecimal
        System.out.println(sc);
    }
    

    You can override the toString method of a class to get different output. See this example

    class A {
        String s = "I am just a object";
        @Override
        public String toString()
        {
            return s;
        }
    }
    
    class B {
        public static void main(String args[])
        {
            A obj = new A();
            System.out.println(obj);
        }
    }
    
    链接地址: http://www.djcxy.com/p/36902.html

    上一篇: HashMap获取/放置复杂性

    下一篇: 如何在不显示“SomeType @ 2f92e0f4”的情况下打印我的Java对象?