2015-04-08 4 views
2

Я пытаюсь вернуть и удалить первый элемент из LinkedList. Ниже приведены два варианта, которые я вижу.Разница между removeFirst() удалить (0) в LinkedList?

Первый подход:

LinkedList<String> servers = new LinkedList<String>(); 
.... 
String firstServerName = servers.removeFirst(); 

Второй подход

List<String> servers = new LinkedList<String>(); 
.... 
String firstServerName = servers.remove(0); 
  • Есть ли предпочтения которую мы должны использовать?
  • А в чем разница между выше двух? Являются ли они технически одинаковыми с точки зрения производительности? В чем заключается сложность?

Каков наиболее эффективный способ вернуть и удалить первый элемент из связанного списка на Java? Мне нужно делать эту операцию чаще на моем LinkedList.

+2

ли вы поищите в исходный код? Вы можете проверить здесь http://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist, чтобы получить сравнение, которое O (x) имеет различные методы. – GhostCat

ответ

4

removeFirst(): Удалить первый элемент в списке. -> O (1)

remove(index): Удаляет элемент в заданной позиции из списка. -> O (n)

Итак, в вашем случае, поскольку вы хотите удалить только первый элемент, вы можете выбрать removeFirst().

+0

Но как вы все знаете? – xsami

1

Вы можете сравнить их сами из исходного кода (например, здесь: http://developer.classpath.org/doc/java/util/LinkedList-source.html).

removeFirst() реализован в виде:

260: /** 
261: * Remove and return the first element in the list. 
262: * 
263: * @return the former first element in the list 
264: * @throws NoSuchElementException if the list is empty 
265: */ 
266: public T removeFirst() 
267: { 
268:  if (size == 0) 
269:  throw new NoSuchElementException(); 
270:  modCount++; 
271:  size--; 
272:  T r = first.data; 
273: 
274:  if (first.next != null) 
275:  first.next.previous = null; 
276:  else 
277:  last = null; 
278: 
279:  first = first.next; 
280: 
281:  return r; 
282: } 

удаления (INT) реализуется как:

575: /** 
576: * Removes the element at the given position from the list. 
577: * 
578: * @param index the location of the element to remove 
579: * @return the removed element 
580: * @throws IndexOutOfBoundsException if index &lt; 0 || index &gt; size() 
581: */ 
582: public T remove(int index) 
583: { 
584:  checkBoundsExclusive(index); 
585:  Entry<T> e = getEntry(index); 
586:  removeEntry(e); 
587:  return e.data; 
588: } 

156: /** 
157: * Remove an entry from the list. This will adjust size and deal with 
158: * `first' and `last' appropriatly. 
159: * 
160: * @param e the entry to remove 
161: */ 
162: // Package visible for use in nested classes. 
163: void removeEntry(Entry<T> e) 
164: { 
165:  modCount++; 
166:  size--; 
167:  if (size == 0) 
168:  first = last = null; 
169:  else 
170:  { 
171:   if (e == first) 
172:   { 
173:    first = e.next; 
174:    e.next.previous = null; 
175:   } 
176:   else if (e == last) 
177:   { 
178:    last = e.previous; 
179:    e.previous.next = null; 
180:   } 
181:   else 
182:   { 
183:    e.next.previous = e.previous; 
184:    e.previous.next = e.next; 
185:   } 
186:  } 
187: } 
0

Если то, что вы хотите, чтобы удалить первый элемент только использовать LinkedList::remove():

E remove() 

Этот метод извлекает и удалить (первый элемент) этого списка.

Так лучшая практика в вашем случае:

String firstServerName = servers.remove(); 
+0

'remove()' на самом деле не говорит. Удаляет ли он с конца или с самого начала? Является ли это структурой LIFO или FIFO? Таким образом, в качестве лучшей практики я бы использовал только 'remove()', если контейнер был объявлен как «Queue» вместо конкретного типа. Else я предпочитаю addLast/removeFirst, чтобы выразить намерение. API коллекций java наверняка может быть улучшен. –

+0

вы должны сделать это вопросы к ОП, он не уточняет, все это, так что удалить() его лучший вариант, потому что ** убеждается удалить первый элемент ** независимо от того, LIFO, FIFO или любой другой список не был объявлен, ... так ИМХО это ** лучшая практика **. –

Смежные вопросы