java集合有下标吗?如何通过下标访问元素?

阳光 2022-05-26 16:51:23 java常见问答 6881

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工具网。

推荐阅读:

springboot框架工作原理及流程是什么?详情介绍

json数据怎么解析?json数据解析方法

面试java开发工程师自我介绍怎么讲?面试java工程师难吗?