一开始,我以为切片在删除元素后底层数组的元素也会相应的删除,最后结果会是[0 1 3 0 4],但最后结果是[0 1 3 0 4 2 2 2]。
然后开始各种找切片本质原因,最后知道了,删除元素之后的切片会覆盖掉底层数组位置的元素。
在这里可以看到,第一次循环后结果是[0 1 2 3 0 4 2],此时底层数组原本是[0 1 2 2 3 0 4 2],原本0,1,2,2,3,0,4的位置就被[0 1 2 3 0 4 2]覆盖了,变成了[0 1 2 3 0 4 2 2],第二次循环结果是[0 1 3 0 4 2],一样的,此时底层数组是[0 1 2 3 0 4 2 2],0,1,2,3,0,4的位置被[0 1 3 0 4 2]替换覆盖了,最终打印出来的切片就变成了[0 1 3 0 4 2 2 2]。
最后疑惑解除,在此列举一些切片特性。
1、切片的容量是底层数组的元素个数。
2、切片的切片指向的还是同一个底层数组。
3、切片的属于引用,底层是一个数组。切片相当于一个框,框住你引用的范围。
4、切片追加元素如果容量不够,会新开辟一个底层数组。
5、切片传参使用时,是值拷贝,但是是切片地址的值。
6、最后就是这个问题,切片删除元素操作,会覆盖底层数组的值。
希望能给以后有这个疑惑的老板看到解决心中的疑惑。