Как Java реализует LinkedLists - PullRequest
       0

Как Java реализует LinkedLists

1 голос
/ 01 ноября 2011

Java не имеет понятия указателей. Так как же java реализует неявно доступный связанный список ссылок или даже делает мелкую копию в этом отношении?

Ответы [ 3 ]

5 голосов
/ 01 ноября 2011

Java имеет ссылки, которые могут указывать на другой объект, или нуль. Это все, что нужно для связанного списка.

Вы создаете связанный список общего назначения в C, имея структуру для узла, аналогично, LinkedList в Java будет содержать также закрытый класс для узла со ссылкой на фактическое значение и 1 или более ссылок на класс узла для ссылок.

4 голосов
/ 01 ноября 2011

Java имеет ссылки.Они похожи на указатели, за исключением того, что вы не можете делать такие вещи, как арифметика указателей или приведение указателей к целым числам и наоборот.

Естественно, связанные списки реализуются с использованием ссылок.


Причинычто Java избегает арифметики указателей и преобразования между целыми числами и указателями включает в себя:

  • для устранения основного источника ошибок и
  • для обеспечения возможности реализации полнофункциональной (то есть неконсервативный, без учета ссылок, высокая производительность) сборка мусора.
2 голосов
/ 01 ноября 2011

Конечно, вы можете легко реализовать свои собственные связанные списки в Java. Вы также можете использовать java.util.LinkedList Class .

Вот простая реализация LinkedList из книги Айвора Хортона «Начало Java»:

public class LinkedList {
  // Default constructor - creates an empty list
  public LinkedList() {}

  // Constructor to create a list containing one object
  public LinkedList(Object item) {
    if(item != null) {
      current=end=start=new ListItem(item); // item is the start and end
    }
  }

  // Construct a linked list from an array of objects
  public LinkedList(Object[] items) {
    if(items != null) {
      // Add the items to the list
      for(int i = 0; i < items.length; i++) {
        addItem(items[i]);
      }
      current = start;
    }
  }

  // Add an item object to the list
  public void addItem(Object item) {
    ListItem newEnd = new ListItem(item);   // Create a new ListItem
    if(start == null) {                     // Is the list empty?
      start = end = newEnd;                 // Yes, so new element is start and end
    } else {                                // No, so append new element
      end.next = newEnd;                    // Set next variable for old end
      end = newEnd;                         // Store new item as end 
    }
  }

  // Get the first object in the list
  public Object getFirst() {
    current = start;
    return start == null ? null : start.item;
  }

  // Get the next object in the list
  public Object getNext() {
    if(current != null) {
      current = current.next;        // Get the reference to the next item
    }
    return current == null ? null : current.item;
  }

  private ListItem start = null;         // First ListItem in the list
  private ListItem end = null;           // Last ListItem in the list
  private ListItem current = null;       // The current item for iterating
  private class ListItem {
    // Constructor 
    public ListItem(Object item) {
      this.item = item;                  // Store the item
      next = null;                       // Set next as end point
    }

    // Return class name & object
    public String toString() {
      return "ListItem " + item ;
    }

    ListItem next;                       // Refers to next item in the list
    Object item;                         // The item for this ListItem
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...