运算符优先级引起的bug

在自定义ArrayList时,笔者模仿ArrayList的动态扩容方法即只要数组内数据的个数等于数组的长度,就将数组的长度增加原先长度的一半,代码献上:

   public void add(E obj) {
        //判断是否需要扩容
        if (size == elementData.length) {
            //扩容操作
            Object[] newArray = new Object[elementData.length + elementData.length >> 1];
            //elementData = Arrays.copyOf(elementData, newArray.length);
            System.arraycopy(elementData, 0, newArray, 0, elementData.length);
            elementData=newArray;
        }
        elementData[size++] = obj;
    }

细心的童鞋可能已经发现了上段代码的bug所在,还没发现的童鞋要重视了哦,这类bug虽然很少出现,但是可以体现出大家的Java基础。
代码编写完毕,运行一遍,控制台异常:
在这里插入图片描述
数组越界异常!动态扩容就是为了解决数组容量不够问题的,一定是上段代码出问题了,检查了一下,代码逻辑正确,看起来似乎没有什么问题,打个断点调试一下吧:
在这里插入图片描述
在这里插入图片描述
到这里发现新创建的数组newArray的长度没有变成预计的30,一定是这一行代码有问题:
在这里插入图片描述
加法运算符的优先级高于移位运算符,所以a+a>>1等价于(a+a)>>1,自然是扩不了容的,修改代码:
在这里插入图片描述
再次运行,正常!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值