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 - связный список. Если ты немножко погуглишь, то найдёшь их исходники, они всё скажут сами за себя.
В будущем, чтобы реализовать свой список, лучше реализовывай стандартный интерфейс.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽