Java数据结构——Arraylist

Java数据结构——Arraylist_第1张图片
Java数据结构——Arraylist_第2张图片

1.Arraylist

1.底层原理、特点

  • ArrayList底层是用数组实现的存储。默认初始化容量:10。

  • 特点:查询效率高,随机增删效率低,线程不安全使用频率很高

2.为啥线程 不安全还使用他呢?

正常使用的场景中,都是用来查询不涉及太频繁的增删,如果涉及频繁的增删,可以使用LinkedList,如果你需要线程安全就使用Vector,这就是三者的区别了,实际开发过程中还是ArrayList使用最多的。

3.他随机增删很慢,你能说一下ArrayList在增删的时候是怎么做的么?

add(index,element) ;添加指定元素到某下标,底层通过**System.arraycopy()**函数实现的。
把index到最后的数据,复制到index+1开始的位置,把index腾空,以放置新增数据。

public void add(int index, E element) {
     
        rangeCheckForAdd(index);
        modCount++;
        final int s;
        Object[] elementData;
        if ((s = size) == (elementData = this.elementData).length)
            elementData = grow();
        System.arraycopy(elementData, index,
                         elementData, index + 1,
                         s - index);
        elementData[index] = element;
        size = s + 1;
    }

Java数据结构——Arraylist_第3张图片

4.ArrayList(int initialCapacity)会不会初始化数组大小?

虽然初始化容量是:10.

不会!!!

Java数据结构——Arraylist_第4张图片

5.ArrayList是线程安全的么?

不是。
他的线程安全版本是Vector(因为底层使用了Synchronized关键字)

6.ArrayList用来做队列合适么?

不适合。
  • 队列一般是**FIFO(先入先出)**的,如果用ArrayList做队列,就需要在数组尾部追加数据,数组头部删除数组,反过来也可以。
  • 但是无论如何总会有一个操作会涉及到数组的数据搬迁,这个是比较耗费性能的。

6.2.那数组适合用来做队列么?

适合!!!

简单点说就是使用两个偏移量来标记数组的读位置写位置,如果超过长度就折回到数组开头,前提是它们是定长数组

7.ArrayList的遍历和LinkedList遍历性能比较如何?

遍历ArrayList要比LinkedList快得多,ArrayList遍历最大的优势在于内存的连续性,CPU的内部缓存结构会缓存连续的内存片段,可以大幅降低读取内存的性能开销。

你可能感兴趣的:(java基础面试,java,数据结构)