Java的集合类是java.util包中的重要内容,它允许以各种方式将元素分组,并定义了各种使这些元素更容易操作的方法。那java集合有下标吗?下面来我们就来给大家讲解一下。
java集合有下标。
如何通过下标访问元素?
jdk 默认初始大小 为空 ,底层通过数组存储元素的值,能通过数组下标快速的访问元素,主要关注几个方法:
// 通过下标获取元素,会检查下标边界 public E get(int index) { rangeCheck(index); return elementData(index); } // 替换元素,返回的是旧的元素的值 替换元素 modcount 没有增加 public E set(int index, E element) { rangeCheck(index); E oldValue = elementData(index); elementData[index] = element; return oldValue; } // 在增加 元素的时候,会增加modcount 并会判断是否需要扩容,在末尾增加 public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } // 扩容为原来大小的 3/2 在通过将旧的数组复制过来 private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }
在进行大数据量进行分割处理时,使用subList 方法需要注意:
subList 使用有两个问题:
一个是 由于 subList 内部强依赖原来的 list 大量保存 会导致OOM 可以通过 new
ArrayList()
另一个是 由于 sublist 中 modcount 是从源 modcount 相同,当源集合被修改的了之后,进行遍历时,会抛出 ConcurrentModificationException 例子:
public class ArrayListOfSubListUsage { public static void main(String[] args) { List < Integer > rawList = IntStream.rangeClosed(1, 10) .boxed() .collect(Collectors.toList()); List < Integer > subList = rawList.subList(0, 3); rawList.add(11); try { subList.forEach(System.out::print); } catch (Exception ex) { ex.printStackTrace(); } } }
总之java集合是有下标的,并且可以通过ArrayList方法通过数组下标快速的访问元素,最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。
推荐阅读: