我是Java的新手,我终于面对了一个拖延了很长时间的问题。
我在Java中学习LinkedLists,有以下困惑,请检查:
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class LinkedListDemo {
public static void main(String[] args) {
List<Integer> myList = new LinkedList<Integer>();
myList.add(1);
myList.add(22);
myList.add(42);
Iterator it = myList.iterator();
while(it.hasNext()){
if((int)(it.next()) == 42)
System.out.println("We found 42");
}
myList.remove();
System.out.println(myList);
}
}
这里myList.remove ();无法解析方法'remove'.">
但是,如果我像这样实例化myList变量LinkedList<Integer> myList = new LinkedList<Integer>();
我没有同样的错误,我的代码编译成功。
我只想知道这背后的工作原理。有时我用
来声明数组列表变量List myList = new ArrayList<>();
我应该这样声明吗?
ArrayList myList = new ArrayList<>();
谢谢
将抽象与实现分离
从实现中分离抽象允许代码思考"我知道我需要这里和那里的List
,但我仍然不知道/想要选择哪种List
在这个时刻";或者:"我想保持我的选项开放给任何List
实现在我的代码"。这是简化编码的好方法。
LinkedList
和ArrayList
比List
更抽象,这意味着它们是List
的不同实现。通常你会更喜欢使用更抽象的类,像List
在这种情况下,将抽象与实现分开,这通常是一件好事,例如,在不改变其余代码的情况下玩不同的实现。所以:
List<Integer> myCoolList = new LinkedList<Integer>()
通常比
更好(因为它促进了抽象和实现之间的分离,这对您的代码来说是一个好习惯):LinkedList<Integer> myCoolList = new LinkedList<Integer>()
现在,如果您选择将抽象与实现分离,当然您将失去为每个实现使用特定方法的能力。但通常最通用的类(本例中为List
)会提供足够的替代方法来替换丢失的方法(本例中为LinkedList.remove()
方法)
通常你的remove方法应该有参数
您可以查看链接的原始代码,您可以看到它有一个不包含任何参数的remove()方法:
/**
* Retrieves and removes the head (first element) of this list.
*
* @return the head of this list
* @throws NoSuchElementException if this list is empty
* @since 1.5
*/
public E remove() {
return removeFirst();
}
然而,这个remove()方法并不存在于List类中,它是LinkedList的父类,所以当你这样声明时:
List<Integer> myList = new LinkedList<Integer>();
您将无法使用remove()方法。
但是如果你使用LinkedList初始化,那么你将能够使用它,因为remove()对LinkedList子类是唯一的。
LinkedList<Integer> myList = new LinkedList<Integer>();
List接口没有任何remove()
所以当你的编译器静态检查你的代码时,找不到一个匹配的方法。
另一方面,LinkedList拥有它。这就是为什么你的代码可以工作。
查看java文档List和LinkedList.
列表LinkedList