Вопрос-ответ

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

Как мне напечатать мой Java-объект, не получая "SomeType @ 2f92e0f4"?

У меня есть класс, определенный следующим образом:

public class Person {
private String name;

// constructor and getter/setter omitted
}

Я попытался напечатать экземпляр моего класса:

System.out.println(myPerson);

но я получил следующий вывод: com.foo.Person@2f92e0f4.

Аналогичная вещь произошла, когда я попытался напечатать массив Person объектов:

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

Я получил вывод: [Lcom.foo.Person;@28a418fc

Что означает этот вывод? Как мне изменить этот вывод, чтобы он содержал имя моего пользователя? И как мне распечатать коллекции моих объектов?

Примечание: это задумано как канонический вопрос-ответ по этой теме.

Переведено автоматически
Ответ 1

Справочная информация

У всех Java-объектов есть toString() метод, который вызывается при попытке распечатать объект.

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

Этот метод определен в Object классе (суперкласс всех Java-объектов). Object.toString() Метод возвращает довольно уродливо выглядящую строку, состоящую из имени класса, @ символа и хэш-кода объекта в шестнадцатеричном формате. Код для этого выглядит следующим образом:

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

Следовательно, такой результат, как com.foo.MyType@2f92e0f4, может быть объяснен как:


  • com.foo.MyType - имя класса, т.Е. класс находится MyType в пакете com.foo.

  • @ - объединяет строку вместе

  • 2f92e0f4 хэш-код объекта.

Названия классов массивов выглядят немного по-другому, что хорошо объясняется в Javadocs для Class.getName(). Например, [Ljava.lang.String означает:


  • [ - одномерный массив (в отличие от [[ or [[[ и т.д.)

  • L - массив содержит класс или интерфейс

  • java.lang.String - тип объектов в массиве


Настройка выходных данных

Чтобы напечатать что-то другое при вызове System.out.println(myObject), вы должны переопределить toString() метод в вашем собственном классе. Вот простой пример.:

public class Person {

private String name;

// constructors and other methods omitted

@Override
public String toString() {
return name;
}
}

Теперь, если мы напечатаем Person, мы увидим их имя, а не com.foo.Person@12345678.

Имейте в виду, что toString() это всего лишь один способ преобразования объекта в строку. Обычно этот вывод должен полностью описывать ваш объект в ясной и сжатой форме. Лучшим toString() для нашего Person класса может быть:

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

Который печатал бы, например, Person[name=Henry]. Это действительно полезная часть данных для отладки / тестирования.

Если вы хотите сосредоточиться только на одном аспекте вашего объекта или включить много нестандартного форматирования, возможно, вам было бы лучше вместо этого определить отдельный метод, например, String toElegantReport() {...}.


Автоматическая генерация выходных данных

Многие IDE предлагают поддержку автоматической генерации toString() метода на основе полей в классе. Смотрите документы для Eclipse и IntelliJ, например.

Несколько популярных библиотек Java также предлагают эту функцию. Некоторые примеры включают:


Печать групп объектов

Итак, вы создали nice toString() для своего класса. Что произойдет, если этот класс поместить в массив или коллекцию?

Массивы

Если у вас есть массив объектов, вы можете вызвать Arrays.toString(), чтобы создать простое представление содержимого массива. Например, рассмотрим этот массив Person объектов:

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

// Prints: [Fred, Mike]

Примечание: это вызов статического метода, вызываемого toString() в классе Arrays , который отличается от того, что мы обсуждали выше.

Если у вас есть многомерный массив, вы можете использовать Arrays.deepToString() для получения такого же результата.

Коллекции

Большинство коллекций выдают красивые выходные данные, основанные на вызове .toString() для каждого элемента.

List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);

// Prints [Alice, Bob]

Итак, вам просто нужно убедиться, что элементы вашего списка определяют nice toString() как обсуждалось выше.

Ответ 2

Я думаю, что apache предоставляет лучший util-класс, который предоставляет функцию для получения строки

ReflectionToStringBuilder.toString(object)
Ответ 3

В каждом классе Java по умолчанию есть toString() метод, который вызывается, если вы передаете какой-либо объект этого класса в System.out.println(). По умолчанию этот вызов возвращает className@hashcode этого объекта.

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

Вы можете переопределить метод toString класса, чтобы получить другой результат. Смотрите этот пример.

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);
}
}
Ответ 4

В Eclipse перейдите в свой класс, щелкните правой кнопкой мыши -> исходный код-> Сгенерировать toString();

Это переопределит метод toString() и напечатает объект этого класса.

java string