Понимание Arraylist и iterator [duplicate]

В Java, когда оператор «==» используется для сравнения двух объектов, он проверяет, ссылаются ли объекты на одно и то же место в памяти. Другими словами, он проверяет, являются ли имена двух объектов в основном ссылками на одно и то же место в памяти.

Класс Java String фактически переопределяет реализацию equals () по умолчанию в классе Object и переопределяет этот метод, чтобы он проверял только значения строк, а не их местоположения в памяти. Это означает, что если вы вызываете метод equals () для сравнения двух объектов String, то, пока действительная последовательность символов равна, оба объекта считаются равными.

Оператор == проверяет, являются ли две строки точно одним и тем же объектом.

Метод .equals() проверяет, имеют ли две строки одно и то же значение.

217
задан cricket_007 16 November 2017 в 06:36
поделиться

9 ответов

Фон

Все объекты 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 также предлагают эту функцию. Некоторые примеры включают в себя:


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

Итак, вы создали приятный 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(), как обсуждалось выше.

309
ответ дан Duncan Jones 16 August 2018 в 05:42
поделиться
  • 1
    return String.format( getClass().getSimpleName() + "[ name=%s ]", name); и действительно вместо name он должен использовать getter getName() (но геттеры были опущены в классе Person ...), но если использовался приемник ... return String.format( getClass().getSimpleName() + "[ name=%s ]", getName()); – CrandellWS 23 May 2016 в 05:55
  • 2
    если у меня есть два класса в java-файле, то как создать объект класса, который не является открытым. A.java public class A {} class B {} ------ C.java public class C {A a = new A ( ); } – yatinbc 10 October 2016 в 09:22
  • 3
    Обратите внимание, что есть перегруженные версии Arrays.toString(), поэтому вы также можете использовать его для массивов примитивов (int[], double[]). Также Arrays.deepToString() красиво обрабатывает многомерные массивы примитивов. – Ole V.V. 9 March 2017 в 16:17

По умолчанию каждый объект в 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);

Могут быть и другие способы. Надеюсь это поможет. :)

2
ответ дан ayushgp 16 August 2018 в 05:42
поделиться
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]];
-2
ответ дан Hemant Thorat 16 August 2018 в 05:42
поделиться
  • 1
    Это позволяет печатать примитивы, а не сложные объекты – Tim 24 November 2017 в 19:11
7
ответ дан Ketan Keshri 16 August 2018 в 05:42
поделиться

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

ReflectionToStringBuilder.toString(object)
31
ответ дан Kyle Decot 16 August 2018 в 05:42
поделиться
  • 1
    Это имеет то преимущество, что не требуется редактировать класс, что иногда невозможно. Однако, как я могу рекурсивно печатать вложенные объекты? – lukas84 23 March 2018 в 18:16

В 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).

2
ответ дан NԀƎ 16 August 2018 в 05:42
поделиться

Каждый класс в 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);
    }
}
22
ответ дан Radiodef 16 August 2018 в 05:42
поделиться
  • 1
  • 2
    Этот вывод означает package.Class@Hashcode. По умолчанию метод toString () имеет тип возвращаемого типа. return Object.hasCode () или какой-либо аналогичный оператор return, возвращающий hashcode в шестнадцатеричной форме вместе с именем класса. – Pankaj Manali 25 March 2015 в 15:03

Если вы прямо напечатаете любой объект 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());
  }
}
2
ответ дан Vikrant Kashyap 16 August 2018 в 05:42
поделиться

Если вы посмотрите на класс Object (класс родителей всех классов в Java), то реализация метода toString () -

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

всякий раз, когда вы печатаете какой-либо объект в Java, тогда toString () будет вызван , Теперь это зависит от вас, если вы переопределите toString (), тогда ваш метод вызовет другой метод метода класса объекта.

1
ответ дан Yasir Shabbir Choudhary 16 August 2018 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: