一、初始化问题
一开始新建List时,如果没有add操作,那么List的Size为0
二、操作问题
(1)index:是下标,从0开始的
(2)indexOf():如果没找到就会返回-1,否则返回下标
三、易错点
1.get(intdex)操作:
如果原来index的位置上没有元素,则会报错。因此如果想要用get,则一开始就要给List进行初始化,在每一个位置new一个元素,然后再添加上去
for(int i=0;i<=numberofvertex+1;i++){
Vertex c=new Vertex(0);
list.add(c);
}
2.contains()操作:
这个操作比较容易弄混的是。比如:
List<Edge> list=new Edge<>();
Edge a=new Edge(C);
Edge b=new Edge(C);
list.add(a);
list.contanis(a)//正确
list.contains(a.number)//错误
list.contains(b)//错误
list.contains(b.number)//错误
从上面例子可以看出,contains的内容只有在当初add进去的变量才能够判断为true,尽管是a,b元素的内容相同,但是变量名不同,也是访问false。所以contains只能判断List相同类的元素。
3.set与add操作
set(index,element)是可以在index下标的位置的值修改为element
而add(element)只能是从下标0开始依次的添加元素。因此,下面的情况易错
for(int i=1;i<=10;i++){
Vertex c=new Vertex(0);
list.add(c);
}
Vertex k=new Vertex(0);
list.set(10,k);//这一步会报错
上述那步报错的原因是因为在for循环内,虽然是从i=1开始循环的,但是add操作是从下标0开始插入新元素的,因此执行整个循环之后,下标最多才达到9,所以set(10)溢出了
4.初始化操作
我们知道,在构造一个list之后,要对其进行一个遍历,撑开它的空间,因此,一开始我遍历的时候是
Vertexs=new ArrayList<>(a+1);
Edge flag=new Edge(-1);
for(int i=0;i<=numberpfvertexs;i++){
Vertexs.add(i,flag);//先将列表的每一个元素开辟一个空间,然后只用到这个空间的LinkedList部分
}
我这个new是放在循环外了,这个是错误的,因为如果是在循环外就已经先new好了一个变量的话,那么在循环内虽然是一直在add,但它一直都是指向同一个位置。因为各种集合就像一个容器,它们只是选中变量的
那个单元,然后将其映射到容器里面,因此会出现如下情况:
所以以后new空间都要在循环内new
四、心得
为了避免以上的错误,在新建一个List时,就好对它进行初始化,即用一个for循环,对每个位置都新建一个相应类型的元素。
其它collection类的集合类似,Map的就另说