一、使用下标索引访问列表 1、下标索引用法 在 Python 列表 List 中的每个 数据元素 , 都有对应的 位置下标索引 , 正向下标索引 从首部 0 开始 , 向后依次增加 ; 反向下标索引 从尾部...-1 开始, 向前依次递减 ; 下标索引语法 : 在 列表变量 后 , 添加中括号 , 在中括号中写上下标索引 ; 列表变量[下标索引] 2、正向下标索引 正向下标索引 : 取值范围是 0 到 列表元素个数...; 列表有 n 个 元素 , 则反向索引的取值范围是 -n ~ -1 ; 4、代码示例 - 列表下标索引基本用法 列表下标索引示例 : """ 列表 List 下标索引 代码示例 """...[0]) # 输出: Tom print(names[1][1]) # 输出: 16 print(names[2][1]) # 输出: 21 执行结果 : Tom 16 21 三、下标索引越界错误 使用...下标索引时 , 注意 下标索引不要越界 , 否则会报 IndexError: list index out of range 错误 ; Traceback (most recent call last
今天我们来分享一个常见的ArrayList索引访问越界报错,了解其根本原因及解决方案。...错误提示如下:Index 1 out of bounds for length 0意思是试图访问数组或List中的索引1,但该数组或List的长度为0。...这通常会出现在以下场景:初始化一个空的ArrayList,但在循环/遍历中直接尝试添加元素。假设ArrayList长度不会变化,但没有考虑添加元素后长度会增加的情况。...长度为0,但索引默认为1,就会出现索引超出范围的问题。...() > i){ list.add(i+"");}使用其他动态扩容的集合如LinkedListStream API写入元素避免索引问题总之,在集合操作中一定要注意集合长度的动态变化,以免索引访问越界问题发生
rangeCheck(index); // 校验索引是否越界 return elementData(index); // 直接根据index返回对应位置的元素(底层elementData...是个数组) } 很简单,由于底层是数组实现的,先检查下索引是否越界,然后直接返回对应索引位置的元素即可。...将index位置及后面的所有元素(如果有的话)向右移动一个位置 rangeCheckForAdd(index); // 校验索引是否越界 ensureCapacityInternal...add(int index, E element): 检查索引是否越界,再调用ensureCapacityInternal方法,将modCount+1,并校验添加元素后是否需要扩容。...因为上面将元素左移了,所以size-1位置的元素为重复的,将其移除) } remove(int index): 检查索引是否越界,将modCount+1,拿到索引位置index的原元素。
(2)EMPTY_ELEMENTDATA 空的数组,这种是通过new ArrayList(0)创建时用的是这个空数组。...index > size || index < 0) throw new IndexOutOfBoundsException(outOfBoundsMsg(index));} (1)检查索引是否越界...elementData[--size] = null; // clear to let GC do its work // 返回旧值 return oldValue;} (1)检查索引是否越界...clear to let GC do its work} (1)找到第一个等于指定元素值的元素; (2)快速删除; fastRemove(int index)相对于remove(int index)少了检查索引越界的操作...总结 (1)ArrayList内部使用数组存储元素,当数组长度不够时进行扩容,每次加一半的空间,ArrayList不会进行缩容; (2)ArrayList支持随机访问,通过索引访问元素极快,时间复杂度为
* 空数组实例 * - 当用户没有指定 ArrayList 的容量时(即调用无参构造函数),返回的是该数组==>刚创建一个 ArrayList 时,其内数据量为 0。...[index]; } 总结:remove(int index)先检查索引是否越界,然后计算出要左移的元素长度,最后左移。...总结:remove(Object o):删除指定元素,不用检查索引越界。...@throws IndexOutOfBoundsException {@inheritDoc} */ public E get(int index) { // 检查索引是否越界...IndexOutOfBoundsException {@inheritDoc} */ public E set(int index, E element) { // 检查索引越界
3、循环结构 循环结构表示程序反复执行某个或某些操作,直到某条件为假(或为真)时才可终止循环。...列举5种常见的运行时异常(写全英文单词) (1)java.lang.NullPointerException 【空指针异常】 (2)java.lang.ClassNotFoundException 【类找不到异常...】 (3)java.lang.NumberFormatException 【数字格式化异常】 (4)java.lang.IndexOutOfBoundsException 【数组索引越界异常】 (6)...数组和ArrayList的区别 1. 数组的长度是固定的,ArrayList的长度可以变化 2. 数组初始化必须指定长度,ArrayList初始化不需要指定长度。 3....数组的元素可以是基本类型和引用数据类型,ArrayList的元素只能是引用数据类型。
1.2.关键变量介绍 //arraylist默认数组大小 private static final int DEFAULT_CAPACITY = 10; //空参构造方法,是一个空数组【官方注释】 private...public void add(int index, E element) { //校验插入的索引是否越界 rangeCheckForAdd(index); /...如果使用空参构造函数new ArrayList(),添加一个元素后,elementData.length=10,初始化容量较大; 如果使用有参构造函数new ArrayList(0)或者new ArrayList...2.3.3.get方法 //根据索引查找 public E get(int index) { //校验索引是否越界 checkElementIndex(index); /...对子集合数据修改了,影响到父集合却不知道,这是研发过程中使用subList常常会犯的错误。
大小 private int size; 2.构造函数 //构造一个空的带特定初始化容量的list public ArrayList(int initialCapacity) { //如果初始化容量...ArrayList中 public ArrayList(Collection<?...elementData, newCapacity); } 添加元素到指定位置 //添加元素到指定位置 public void add(int index, E element) { //检查index索引是否越界...if (o == null) { //遍历元素,进行对指定的索引进行置空操作 for (int index = 0; index < size; index++)...其进行添加元素的时候,会首先进行越界校验,如果没有越界才继续进行操作。接着查看容量是否够,不够的话,进行扩容操作,而扩容操作是在grow()方法中进行的。
对于ArrayList的初始化有三种方式: 对于第一种默认的构造方法,ArrayList并没有初始化容量大小,而是将列表的元素数据引用指向了一个空数组。...获取指定索引位置的元素get方法。...public E get(int index) { rangeCheck(index); //检查索引是否越界 return elementData(index); } 由于ArrayList...是由基于数组实现,故此方法较为简单,判断是否越界,没有则根据数组下标来索引返回元素即可。...//ArrayList#remove public E remove(int index) { rangeCheck(index); //检查索引是否越界 modCount++;
简介 ArrayList是基于数组实现的一种列表。 ArrayList继承体系如下: 图一:ArrayList继承体系 ?...public void add(int index, E element) { // 检查是否越界 rangeCheckForAdd(index); //...index) { rangeCheck(index); return elementData(index); } remove(int index) 删除指定索引位置的元素...//获取指定索引处元素 E oldValue = elementData(index); //// 如果index不是最后一位,则将index之后的元素往前挪一位..."快速失败”即fail-fast,它是java集合的一种错误检测机制。
[i + 1]; } // 删除最后一个元素 elements[--size] = null; // 将删除的元素返回 return element; } 复制代码 注意: 删除元素时传入的索引不能越界..."Index:" + index + ", Size:" + size); } } 复制代码 此时, remove方法实现如下 public E remove(int index) { // 判断索引是否越界...; } // 引用新数组 elements = newElements; } 复制代码 每次删除元素后, 判断是否需要缩容 public E remove(int index) { // 判断索引是否越界...) { elements[i] = null; } // 将size置为0 size = 0; } 复制代码 6、修改元素 修改元素时, 只需要将原有位置的元素替换掉即可, 只是需要注意一下索引是否越界...:" + index + ", Size:" + size); } } 复制代码 此时, add方法如下 public void add(int index, E element) { // 检查索引是否越界
1.rangCheck(index)-----检查数组下标是否越界 2.ensureCapasity()------保证数组的有效容量 3.空参构造方法和提供初始化容量的构造方法 4.增方法(add(int...复制从src的srcPos索引开始,复制的个数是length,复制到dest的索引从destPos开始。...return size; } public boolean isEmpty(){ return size==0; } //判断数组下标是否越界...所谓“逻辑”长度,是指内存已存在的“实际元素的长度” 而“空元素不被计算” 即:当你利用add()方法,向ArrayList内添加一个“元素”时,逻辑长度就增加1位。...而剩下的9个空元素不被计算。 整体写下来不是很简单,因为牵扯到一些数组元素移动的计算,写的时候一定要考虑仔细,不然容易出错!
1、NullpoiontException 空指针异常,list为null导致,操作一个 null 对象的方法或属性时会抛出这个异常。...2、ArrayIndexOutOfBoundsException 数组下标越界异常 3、IndexOutOfBoundsException 索引越界异常,当操作一个字符串或者数组的时候经常遇到的异常。...例:一个ArrayList数组中没有元素,而你想获取第一个元素,运行是就会报此类型的错误。...public class test{ public static void main(args[] ){ List list = new ArrayList<
问题源头这个错误通常发生在我们对一个只有一个元素的张量执行item()方法或者使用Python的索引操作时。...我们可以通过判断张量的大小来避免这个错误:pythonCopy codeif tensor.numel() == 1: scalar = tensor.item()else: # 处理张量中有多个元素或为空的情况方法二...:使用索引操作使用索引操作时,也需要注意只有一个元素的张量会引发错误。...使用索引操作时,也需要注意只有一个元素的张量会引发错误。...我们可以通过使用item()方法或者索引操作来解决这个问题。但是需要注意,这个错误会在张量中有多个元素或者为空的情况下发生,因此我们需要根据实际情况进行处理。
public E get(int index) { //这一步调用的是检查索引越界的方法 rangeCheck(index); //这一步调用的是上面的...看着看着,我们会发现一个问题,ArrayList中包括了两个remove方法 /** * 删除位于某个索引位置的元素 * * @param index 即将被删除的元素的索引...public E remove(int index) { //首先进行索引越界的检查 rangeCheck(index); //由于这个操作会引起结构的变化...return true; } } } return false; } /** * 这里没有进行索引的越界判断...,也没有返回被删除的值,其他的原理和remove(int index)类似 * @param index 被删除元素的索引,这里之所以不用判断,是因为在调用这个方法的时候就已经进行了判断,不存在越界的可能
参数详解: src 源数组 srcPos 源数组拷贝的起始索引 dest 目标数组 destPos 拷贝到目标数组的起始索引 length 拷贝元素的个数将src源数组,起始索引为srcPos,个数为length...,复制到起始索引为destPos的dest目标数组。...,创建数据直接赋值一个空数组。...public void add(int index, E element) { // 下标是否越界 rangeCheckForAdd(index); // 判断是否要扩容...ArrayList主要是基于Object[] elementData动态数组实现。 调用构造方法,无参的就赋值一个空数组,有初始容量的就赋值一个初始容量。
element) { // 在index位置插入节点,节点值为element checkPositionIndex(index); if (index == size) // 如果索引为...prev属性为l节点, next属性为null last = newNode; // 将当前尾节点设置为上面新创建的节点newNode if (l == null) // 如果l节点为空则代表当前链表为空...ArrayList和LinkedList比较 ArrayList详解可以看我的另一篇文章:Java集合:ArrayList详解 ArrayList底层基于动态数组实现,LinkedList底层基于链表实现...对于随机访问(get/set方法),ArrayList通过index直接定位到数组对应位置的节点,而LinkedList需要从头结点或尾节点开始遍历,直到寻找到目标节点,因此在效率上ArrayList...next或prev属性即可,因此在效率上LinkedList优于ArrayList。
代码如下: ArrayList,ArrayList 查看构造方法 public ArrayList() :构造一个内容为空的集合。...("玛尔扎哈"); System.out.println(list); // [赵丽颖, 迪丽热巴, 古力娜扎, 玛尔扎哈] // list.add(100); // 错误写法...遍历集合时,可以控制索引范围,防止越界。...索引值从0开始 String name = list.get(2); System.out.println("第2号索引位置:" + name); // 赵又廷...索引值从0开始。
ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全; ArrayList 底层使用的是 Object 数组;LinkedList 底层使用的是双向链表数据结构; LinkedList...不支持高效的随机元素访问,而 ArrayList(实现了 RandomAccess 接口) 支持。...我们看过RandomAccess 接口的底层的同学知道,这个接口也是个标识性接口,只要实现了这个接口就意味着支持通过索引访问元素。...// 获取链表指定位置的元素 public E get(int index) { // 下标越界检查,如果越界就抛异常 checkElementIndex(index); // 返回链表中对应下标的元素...// 返回指定下标的非空节点 Node node(int index) { // 断言下标未越界 // assert isElementIndex(index); // 如果
领取专属 10元无门槛券
手把手带您无忧上云