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工具网。
推荐阅读: