当前位置: 首页 > 编程笔记 >

Java ArrayList add(int index, E element)和set(int index, E element)两个方法的说明

阎修杰
2023-03-14
本文向大家介绍Java ArrayList add(int index, E element)和set(int index, E element)两个方法的说明,包括了Java ArrayList add(int index, E element)和set(int index, E element)两个方法的说明的使用技巧和注意事项,需要的朋友参考一下

一般使用List集合,估计都是使用这个ArrayList,一般呢也就是简单遍历数据和存储数据。
很少使用到add(int index, E element)和set(int index, E element)两个方法。
这两个方法,乍一看,就是在指定的位置插入一条数据。

区别:

  • set()是更新,更新指定下标位置的值。
  • add()是添加,区别于一般的add(E e),这个就是有个位置的概念,特殊位置之后的数据,依次往后移动就是了。

然后,看下面代码。来看看陷阱。

就算是,你知道了上面的内容,也不能保证,你能安全的回答下面的代码运行结果。

public class ArrayListTest {
  public static void main(String[] args) {
    List<String> list = new ArrayList<>(2);
    System.out.println("list大小为:" + list.size());
    list.add("12");
    System.out.println("list大小为:" + list.size());
    list.set(1,"sss");
    list.add(1,"放在下标为1的位置");
    list.add("22");
    System.out.println("list大小为:" + list.size());
    System.out.println(list.toString());
    list.add(1,"放在下标为1的位置");
    System.out.println("list大小为:" + list.size());
    System.out.println(list.toString());
  }
}

运行结果:

估计,很多人都大出所料吧。结果怎么是这样呢!下面有这么几个坑。

解释:

1,List<String> list = new ArrayList<>(2)

这个乍一看,还以为像数组一样,你初始化了个长度为2的数组,然后你就可以随意修改下标为0,1的内容。当然0,1是肯定不会下标越界的。

我当时也是这么想的。然而不是的。

源码里面的构造函数的注释说明:这个真的是在底层新建了个长度为2的数组Object[],但是他又不是我们经常看到的一般数组。这个是空的。

当前list集合仍然是一个带有初始容量的empty list。

2,list.size()

我上来也是想当然的以为,这个size()不就是上面的那个2吗!但是我错了。

源码中ArrayList的size属性对应的注释是:The size of the ArrayList (the number of elements it contains).

这个size是表示这个集合包含的元素的个数,而不是底层数组的大小。

3,list.set(1,"sss")

在知道了上面的2个坑之后,这个就好解释了。代码是要设置下标为1的值,但是。在源码中有 rangeCheck(index); 

private void rangeCheck(int index) {
  if (index >= size)
    throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

这个时候,index是1,但是size是1。

so,就异常啦。

4,list.add(1,"放在下标为1的位置")

这个和上面相似,但还是有点不一样,上面判断是大于等于size,但是在这个add方法,却是要大于才可以。
而且还有个专门的check方法for add,如下:rangeCheckForAdd(index);

private void rangeCheckForAdd(int index) {
  if (index > size || index < 0)
    throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

那,这个在下标为1的位置,添加元素,判断 1 > 1 不成立,那么就可以顺利添加了。这个就不异常啦。

但是,你要是在数组声明完,直接在下标为1的位置,这么干,就异常了。就不在继续分析了。

5,还有个问题,就是你在一个位置一直add(index , element)

这个不仅仅是把index位置的数据给替换啦,而且把之前这个位置的数据给依次向后移动啦,这个跟map的结构不一样,map是更新指定位置的数据,其他的数据不动,这个list竟然是把把数据平移啦。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。如果你想了解更多相关内容请查看下面相关链接

 类似资料:
  • 问题内容: 我有2个不同的HashMap实例 我想合并两个HashMaps的键集; 码: 例外: 我没有收到编译警告或错误。 从java doc这应该工作。即使添加的集合也是集合: boolean addAll(Collection c) 如果指定集合中的所有元素尚不存在,则将它们添加到此集合中(可选操作)。如果指定的集合也是一个集合,则addAll操作会有效地修改此集合,以使其值为两个集合的并集

  • 本文向大家介绍说说List,Set,Map三者的区别?相关面试题,主要包含被问及说说List,Set,Map三者的区别?时的应答技巧和注意事项,需要的朋友参考一下 List(对付顺序的好帮手): List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set(注重独一无二的性质): 不允许重复的集合。不会有多个元素引用相同的对象。 Map(用Key来搜索的专家): 使用键值对存储。

  • setAttr(String, Object) 转调了 HttpServletRequest.setAttribute(String, Object),该方法可以将各种数据传递给View并在View中显示出来。 通过查看 jfinal 源码 Controller 可知 setAttr(String, Object) 方法在底层仅仅转调了底层的 HttpServletRequest 方法: priv

  • 本文向大家介绍Java AbstractSequentialList类的set()方法,包括了Java AbstractSequentialList类的set()方法的使用技巧和注意事项,需要的朋友参考一下 的AbtstractSequentialList类的方法被用于在该列表与指定元件指定的位置,以取代元素。它返回被替换的元素。语法如下- 在此,索引是要替换的元素的索引。ele是要存储在指定位置

  • 本文向大家介绍请你说一说stl里面set和map怎么实现的?相关面试题,主要包含被问及请你说一说stl里面set和map怎么实现的?时的应答技巧和注意事项,需要的朋友参考一下 集合,所有元素都会根据元素的值自动被排序,且不允许重复。 底层实现:红黑树 set 底层是通过红黑树(RB-tree)来实现的,由于红黑树是一种平衡二叉搜索树,自动排序的效果很不错,所以标准的 STL 的 set 即以 RB

  • 前面学习了 set 集合,本节来一一学习 set 类型提供的方法。首先,通过 dir(set) 命令可以查看它有哪些方法: >>> dir(set) ['add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', '