dalv_happy
@dalv_happy

Как устроены списки в Java?

До этого работал со структурой только на си и я уяснил одно отличие, если разрываешь связь у элемента, то сборщик мусора за тобой приберёт.
Но вопросов куча, в чём отличие структуры от объекта? Добавление элемента работает так, что мы сначала создаём голову с нул значением ссылки, после добавления голова становится не нул, а ссылкой на добавленный объект?

Мне стало бы понятнее весь этот процесс, если бы вы смогли объяснить строчки в следующем коде:
public class List {
	
	
	public static class Node {
		public int data;
		public Node next;
	}

	
	private Node head;
	
	public  List() {
		head = null;		
	}
	

	
	@Override
	public String toString() {		
		String res = "<< ";		
		for (Node p = head; p != null; p = p.next) {
			res = res + p.data + " ";			
		}
		res = res + ">>";
		return res;
	}

	
	public  void addElementToHead(int value) {
		Node newNode = new Node();
		newNode.next = head;
		newNode.data = value;
		head = newNode;		
	}	
	
	
	
	
	public void deleteElement(Node delNode) {
		
		if (delNode == null) {
			return;
		}
		
		
		if (delNode == head) {
			head = head.next;
			return;
		} else {
			
			for (Node p = head; p != null; p = p.next) {
				if (p.next == delNode) {
					p.next = delNode.next;
				}		
			}			
		}		
		
	}
	
	
	
	
	public  void clear() {
		head = null;
	}
		

}
  • Вопрос задан
  • 648 просмотров
Решения вопроса 1
EugeneP2
@EugeneP2
Java Dev
Метод deleteElement реализован не правильно. Операция '==' сравнивает ссылки на объекты, а не сами объекты.

Например, если у вас в списке есть объект Node со значением поля data = 10, и вы хотите его удалить

Node delNode = new Node();
delNode.data = 10;

deleteElement(delNode); // ничего не удалится

потому что ссылка delNode и ссылка в списке ссылаются на разные объекты.
В джаве для сравнения переопределяют метод equals, в котором реализуют сравнение полей класса.

Вот так это должно выглядеть
if (delNode.equals(head)) {
      head = head.next;
      return;
    } else {
      
      for (Node p = head; p != null; p = p.next) {
        if (delNode.equals(p.next)) {
          p.next = delNode.next;
        }		
      }


Отличие структуры от класса в том, что класс позволяет реализовать наследование, инкапсуляцию и полиморфизм.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@bromzh
Drugs-driven development
В яве несколько списков. Есть интерфейс List, есть несколько его реализаций. Самые популярные - это ArrayList (по-сути - динамический массив), есть LinkedList - связный список. Если ты немножко погуглишь, то найдёшь их исходники, они всё скажут сами за себя.
В будущем, чтобы реализовать свой список, лучше реализовывай стандартный интерфейс.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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