Java中有一个用于表示线性表的List接口,其中包含add、addAll和set三个用于向表中插入元素的方法:
一、add方法:
List接口中的add方法有如下两种重载方式:
① boolean add(E e);
② void add(int index, E element);
其中,方法①用于向列表的末尾插入新元素,这也是List接口中最常用的插入方法;方法②则可以在插入操作过程中指定插入的位置,此时,会自动将当前位置及只有的元素后移进行插入,需要注意的是,参数index的值不可大于当前list的容量,即在使用此方法填充一个list时,必须以0开始依次填充。
第二种用法使用的时候,若ArrayList对象初始化时不包含任何元素size的值为0,此时向下标为n(n>0)的位置添加元素时,就会抛出异常。即使在创建list对象时指定了初始化大小,依旧会有以上问题,比如List<String> stringList = new ArrayList<>(100)这类指定初始化大小并不能避免出现上面的异常。
二、addAll方法:
多个元素,重载方法也有两种:
① boolean addAll(Collection<? extends E> c);
② boolean addAll(int index, Collection<? extends E> c);
对于包含下标参数index的方法②,在使用时具有和包含index参数的add方法同样的限制条件,在执行插入前同样会检查size的值,如果指定的index值大于size值,则会抛出异常。
其次,addAll方法中的集合c不可以传入null值,否则会有异常。
另外,该方法是非线程安全的,当传入的参数c正在被另一个线程操作时,其结果是不确定的。
三、set方法:
set方法直观上根据方法名可以理解为设置list中某个位置的元素。该方法本质上是一种替换操作,即要设置某个位置上的元素,这个位置在设置前必须有元素,否则会抛出异常。与Map的set方法用法有一定区别(有则覆盖、无则添加)。
对于某些应用,需要以乱序的方式插入到list中,这时候将list作为队列或栈使用就不太合适。比如当从数据库中读取数据到list中时,要保证list中的数据有序,但数据库的存储是不保序,虽然可以读取到内存以后再进行排序,但是考虑到数据量比较大,读取到内存再排序的性能比较低,因此,可以决定在数据库中存储每条数据的序号,然后读取数据的时候在根据序号直接添加到list里面,这个时候就需要以乱序的方式插入list,对于可能出现的异常,可以采取预填充的方式。