Как объект LinkedList выводит содержимое с помощью Syso?

Я написал небольшой фрагмент кода для реализации структуры данных связанных списков. У меня есть внутренний класс "Node", который имеет два поля Node и value. Конструктор связанного списка принимает параметр значения int и присваивает это значение объекту Node и добавляет объект Node к объекту LinkedList.

Мой вопрос в том, какой код java.util.LinkedList заставляет объект списка печататься как список номеров, но не адрес его объекта?

Как и когда я печатаю "list1", выход будет [3,4]. Когда я печатаю "список", вывод - hashcode адреса объекта.

Я не нашел класс toString() в классе java.util.LinkedList.

Как я могу сделать свой код для печати содержимого LinkedList?

Ниже приведен код:

class LinkedList {

 Node first;

 Node getNode(){
 return new Node();
 }

 class Node{
 Node next;
 int value;
 }

 void add(int value){
 Node n=this.getNode();
 n.value=value;
 n.next=null;

 if (first==null){
 first=n;
 } else{
 first.next=n;
 }
 } 
}
public class LinkedListTest{
 public static void main(String[] args) {
 LinkedList list=new LinkedList();
 java.util.LinkedList<integer> list1=new java.util.LinkedList<>();
 list1.add(3);
 list1.add(4);
 list.add(1);
 list.add(2);
 System.out.println(list);
 System.out.println(list1);
 }
}
</integer>
2 ответа

Ваш класс LinkedList (я предлагаю вам переименовать его, поскольку он может быть запутан с java.util.LinkedList) должен переопределить метод Object::toString, который вызывается при печати на консоль.

Я не нашел класс toString() в классе java.util.LinkedList.

Немного детективное задание - вам нужно щелкнуть по исходным кодам LinkedList который расширяет AbstractSequentialList который расширяет AbstractList который, наконец, расширяет класс AbstractCollection (исходный код), где переопределяется Object::toString method ответственный за String-подобное представление всего элемента. Там вы можете получить вдохновение.

Как я могу сделать свой код для печати содержимого LinkedList?

Сюда:

@Override
public String toString() {
 StringBuilder sb = new StringBuilder("[");
 if (first != null) {
 Node temp = first;
 String sep = "";
 while (temp != null) {
 sb.append(sep).append(temp.value);
 temp = temp.next;
 sep = ", ";
 }
 }
 return sb.append(']').toString();
}


Вы должны создать собственный метод toString например

class LinkedList {

 //...
 @Override
 public String toString() {
 StringBuilder text = new StringBuilder("[");
 String del = "";
 if (first != null) {
 do {
 text.append(del).append(first.value);
 first = first.next;
 del = ", ";
 } while (first != null);
 }
 text.append(']');
 return text.toString();
 }
}

Если вы снова запустите свой код, выходы

[1, 2]

licensed under cc by-sa 3.0 with attribution.