Java 从哪里调用ArrayList中的元素更有效?

Java 从哪里调用ArrayList中的元素更有效?,java,Java,我正在制作一个牌组类,通过使用ArrayList来保存多张牌(我制作的另一个类),但是,当我的老师提到一个返回牌组顶部牌的deal方法时,我无法理解他的这句话的意思: 请记住,由于ArrayList的设计,您可以处理牌组中的顶牌、底牌或任何牌。想想哪一个是最有效的实现 我一直认为从任何数组类型结构的前端调用元素都是有效的。ArrayList就是这样吗 那么常规数组和LinkedList呢 我本想把它放在家庭作业标签下,但它给了我一个说明,说明它已经过时了 当您处理卡时,您正在从牌组中移除一张卡

我正在制作一个牌组类,通过使用ArrayList来保存多张牌(我制作的另一个类),但是,当我的老师提到一个返回牌组顶部牌的
deal
方法时,我无法理解他的这句话的意思:

请记住,由于ArrayList的设计,您可以处理牌组中的顶牌、底牌或任何牌。想想哪一个是最有效的实现

我一直认为从任何数组类型结构的前端调用元素都是有效的。ArrayList就是这样吗

那么常规数组和LinkedList呢



我本想把它放在
家庭作业
标签下,但它给了我一个说明,说明它已经过时了

当您处理卡时,您正在从牌组中移除一张卡,这与仅访问该卡不同。访问卡的时间是固定的,但移除卡的时间不是固定的。从
阵列列表中删除时,需要重新排列列表中的所有元素。考虑<代码> >删除<代码>方法(来自OpenJDK)

因此,如果移动列表前面的元素,它必须移动整个数组

现在在
LinkedList
实现中,每个节点只维护一个指向下一个节点的指针,因此执行删除操作很简单,只需更改上一个节点的链接即可。考虑<代码> >删除<代码>在<代码>链接目录> /代码>(再次从OpenJDK):

private删除(条目E){
if(e==标题)
抛出新的NoTouchElementException();
E结果=E元素;
e、 previous.next=e.next;
e、 next.previous=e.previous;
e、 next=e.previous=null;
e、 元素=空;
大小--;
modCount++;
返回结果;
}

这并不是说
LinkedList
s在任何情况下都更好。如果您需要访问数组的随机索引,则
ArrayList
通常效率更高(
LinkedList
需要从末尾开始遍历每个节点,直到找到索引为止)。

当您处理卡时,您正在从卡组中移除一张卡,这与仅访问卡不同。访问卡的时间是固定的,但移除卡的时间不是固定的。从
阵列列表中删除时,需要重新排列列表中的所有元素。考虑<代码> >删除<代码>方法(来自OpenJDK)

因此,如果移动列表前面的元素,它必须移动整个数组

现在在
LinkedList
实现中,每个节点只维护一个指向下一个节点的指针,因此执行删除操作很简单,只需更改上一个节点的链接即可。考虑<代码> >删除<代码>在<代码>链接目录> /代码>(再次从OpenJDK):

private删除(条目E){
if(e==标题)
抛出新的NoTouchElementException();
E结果=E元素;
e、 previous.next=e.next;
e、 next.previous=e.previous;
e、 next=e.previous=null;
e、 元素=空;
大小--;
modCount++;
返回结果;
}

这并不是说
LinkedList
s在任何情况下都更好。如果需要访问数组的随机索引,则
ArrayList
通常效率更高(
LinkedList
需要从末尾开始遍历每个节点,直到找到该索引为止)。

ArrayList在内部只是一个数组。因此,对任何项的访问都是O(1)。然而,移除东西是另一回事。如果“交易”的意思是“从列表中删除它”,那么稍微思考一下就会发现,从ArrayList中的一个位置删除是便宜的,而从其他位置删除则是昂贵的。因此,如果您必须有效地处理从任何位置的删除,您可能不想使用ArrayList。

ArrayList只是一个数组,在内部。因此,对任何项的访问都是O(1)。然而,移除东西是另一回事。如果“交易”的意思是“从列表中删除它”,那么稍微思考一下就会发现,从ArrayList中的一个位置删除是便宜的,而从其他位置删除则是昂贵的。因此,如果您必须有效地处理从任何地方删除的操作,您可能不想使用ArrayList。

如果您的类中没有专门介绍,那么您需要阅读类和方法的Java文档

特别是,当你从牌组中“交易”一张牌时,你正在移除它。阅读发现:

删除此列表中指定位置的元素将任何后续元素向左移动(从其索引中减去一个)


根据您在
ArrayList
中“交易”卡的位置,考虑如何应用该选项

类和方法的Java文档是您想要阅读的内容,如果您的类中没有专门介绍这些内容的话

特别是,当你从牌组中“交易”一张牌时,你正在移除它。阅读发现:

删除此列表中指定位置的元素将任何后续元素向左移动(从其索引中减去一个)


根据您在
ArrayList
中“交易”卡的位置,考虑如何应用该选项

当你发一张牌时,你将把它从牌组中移除。从arraylist的前面移除,还是从arraylist的后面移除,哪个性能更好?当你处理一张牌时,你将从牌组中移除它。从arraylist的前面删除,还是从arraylist的后面删除,哪个性能更好?因此,从
arraylist的末尾删除会更有效?这样后续的元素就不必移动了?这样做之后,我是否应该使用
.trimToSize()
?这样,从
数组列表的末尾删除将是有效的?因此,随后的el
public E remove(int index) {
   rangeCheck(index);
   modCount++;
   E oldValue = elementData(index);
   int numMoved = size - index - 1;
   if (numMoved > 0)
          System.arraycopy(elementData, index+1, elementData, index, numMoved);
   elementData[--size] = null; // Let gc do its work
   return oldValue;
}
private E remove(Entry<E> e) {
       if (e == header)
           throw new NoSuchElementException();
       E result = e.element;
       e.previous.next = e.next;
       e.next.previous = e.previous;
       e.next = e.previous = null;
       e.element = null;
       size--;
       modCount++;
       return result;
}