Jave算法学习补充——List操作的易错点

一、初始化问题
一开始新建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的就另说

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值