В Java, когда оператор «==» используется для сравнения двух объектов, он проверяет, ссылаются ли объекты на одно и то же место в памяти. Другими словами, он проверяет, являются ли имена двух объектов в основном ссылками на одно и то же место в памяти.
Класс Java String фактически переопределяет реализацию equals () по умолчанию в классе Object и переопределяет этот метод, чтобы он проверял только значения строк, а не их местоположения в памяти. Это означает, что если вы вызываете метод equals () для сравнения двух объектов String, то, пока действительная последовательность символов равна, оба объекта считаются равными.
Оператор
==
проверяет, являются ли две строки точно одним и тем же объектом.Метод
blockquote>.equals()
проверяет, имеют ли две строки одно и то же значение.
Все объекты Java имеют метод toString()
, который вызывается при попытке и печати объекта.
System.out.println(myObject); // invokes myObject.toString()
Этот метод определен в классе Object
(суперкласс всех объектов Java). Метод Object.toString()
возвращает довольно уродливую строку, состоящую из имени класса, символа @
и hashcode объекта в шестнадцатеричном формате. Код для этого выглядит так:
// 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
означает:
[
- одномерный массив (в отличие от [[
или [[[
и т. Д.) 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]
. Это действительно полезная часть данных для отладки / тестирования.
Если вы хотите сосредоточиться только на одном аспекте своего объекта или включить много jazzy-форматирования, вам может быть лучше определить отдельный метод, например String toElegantReport() {...}
.
Многие [ID5] предлагают поддержку для автоматического создания метода toString()
на основе полей в классе. Например, см. Документы для Eclipse и IntelliJ .
Некоторые популярные библиотеки Java также предлагают эту функцию. Некоторые примеры включают в себя:
ToStringBuilder
из Apache Commons Lang MoreObjects.ToStringHelper
из Гуава @ToString
аннотация из Проект Ломбок Итак, вы создали приятный 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()
, как обсуждалось выше.
По умолчанию каждый объект в Java имеет метод toString()
, который выдает ObjectType @ HashCode.
Если вам нужна более значимая информация, вам необходимо переопределить метод toString()
в вашем классе.
public class Person {
private String name;
// constructor and getter/setter omitted
// overridding toString() to print name
public String toString(){
return name;
}
}
Теперь, когда вы печатаете объект person с помощью System.out.prtinln(personObj);
, он будет печатать имя человека вместо имени класса и хэш-кода.
Во втором случае, когда вы пытаетесь распечатать массив, он печатает [Lcom.foo.Person;@28a418fc
тип Array и hashcode.
Если вы хотите напечатать имена людей, существует много способов.
Вы можете написать свою собственную функцию, которая выполняет итерацию каждого человека и печатает
void printPersonArray(Person[] persons){
for(Person person: persons){
System.out.println(person);
}
}
Вы можете распечатать его с помощью Arrays.toString (). Это кажется мне самым простым.
System.out.println(Arrays.toString(persons));
System.out.println(Arrays.deepToString(persons)); // for nested arrays
Вы можете напечатать его в режиме java 8 (используя потоки и ссылку на метод).
Arrays.stream(persons).forEach(System.out::println);
Могут быть и другие способы. Надеюсь это поможет. :)
Arrays.deepToString(arrayOfObject)
Выше функции печатает массив объектов разных примитивов.
[[AAAAA, BBBBB], [6, 12], [2003-04-01 00:00:00.0, 2003-10-01 00:00:00.0], [2003-09-30 00:00:00.0, 2004-03-31 00:00:00.0], [Interim, Interim], [2003-09-30, 2004-03-31]];
Я думаю, что apache обеспечивает лучший класс util, который предоставляет функцию для получения строки
ReflectionToStringBuilder.toString(object)
В intellij вы можете автоматически генерировать метод toString, нажимая alt + inset, а затем выбрав toString () здесь - это выход для тестового класса:
public class test {
int a;
char b;
String c;
Test2 test2;
@Override
public String toString() {
return "test{" +
"a=" + a +
", b=" + b +
", c='" + c + '\'' +
", test2=" + test2 +
'}';
}
}
Как вы можете видеть, он генерирует String путем конкатенации нескольких атрибутов класса, для примитивов он будет печатать свои значения, а для ссылочных типов он будет использовать свой тип класса (в этом случае - метод string из Test2).
Каждый класс в java имеет по умолчанию метод toString()
, который вызывается System.out.println()
, если вы передаете ему некоторый объект класса. Когда вы пытаетесь напечатать объект класса, метод System.out.println()
вызовет toString()
класса, который возвращает класс Xame @ 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);
}
}
Если вы прямо напечатаете любой объект Person, он ClassName@HashCode
передаст код.
в вашем случае com.foo.Person@2f92e0f4
печатается. Где Person
- класс, к которому принадлежит объект, а 2f92e0f4
- hashCode объекта.
public class Person {
private String name;
public Person(String name){
this.name = name;
}
// getter/setter omitted
@override
public String toString(){
return name;
}
}
Теперь, если вы попытаетесь использовать объект Person
, он напечатает имя
Class Test
{
public static void main(String... args){
Person obj = new Person("YourName");
System.out.println(obj.toString());
}
}
Если вы посмотрите на класс Object (класс родителей всех классов в Java), то реализация метода toString () -
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
всякий раз, когда вы печатаете какой-либо объект в Java, тогда toString () будет вызван , Теперь это зависит от вас, если вы переопределите toString (), тогда ваш метод вызовет другой метод метода класса объекта.
return String.format( getClass().getSimpleName() + "[ name=%s ]", name);
и действительно вместоname
он должен использовать gettergetName()
(но геттеры были опущены в классе Person ...), но если использовался приемник ...return String.format( getClass().getSimpleName() + "[ name=%s ]", getName());
– CrandellWS 23 May 2016 в 05:55Arrays.toString()
, поэтому вы также можете использовать его для массивов примитивов (int[]
,double[]
). ТакжеArrays.deepToString()
красиво обрабатывает многомерные массивы примитивов. – Ole V.V. 9 March 2017 в 16:17