Arraylist基本知识


ArrayList可能是Java数据结构中最简单的一种了,即使一个非Java程序员可能也知道这个数据结构,因为所有的语言中都有这样的类似的数据结构。

ArrayList插入删除一定慢么?

取决于你删除的元素离数组末端有多远,ArrayList拿来作为堆栈来用还是挺合适的,push和pop操作完全不涉及数据移动操作。

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

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

ArrayList是如何扩容的?

ArrayList扩容后的大小等于扩容前大小的1.5倍,当ArrayList很大的时候,这样扩容还是挺浪费空间的,甚至会导致内存不足抛出OutOfMemoryError。扩容的时候还需要对数组进行拷贝,这个也挺费时的。所以我们使用的时候要竭力避免扩容,提供一个初始估计容量参数,以免扩容对性能带来较大影响。

ArrayList是线程安全的么?

当然不是,线程安全版本的数组容器是Vector。Vector的实现很简单,就是把所有的方法统统加上synchronized就完事了。你也可以不使用Vector,用Collections.synchronizedList把一个普通ArrayList包装成一个线程安全版本的数组容器也可以,原理同Vector是一样的,就是给所有的方法套上一层synchronized。

数组用来做队列合适么?

这个回答是错误的!
队列一般是FIFO的,如果用ArrayList做队列,就需要在数组尾部追加数据,数组头部删除数组,反过来也可以。
但是无论如何总会有一个操作会涉及到数组的数据搬迁,这个是比较耗费性能的。
ArrayList固然不适合做队列,但是数组是非常合适的。
比如ArrayBlockingQueue内部实现就是一个环形队列,它是一个定长队列,内部是用一个定长数组来实现的。
另外著名的Disruptor开源Library也是用环形数组来实现的超高性能队列,具体原理不做解释,比较复杂。
简单点说就是使用两个偏移量来标记数组的读位置和写位置,如果超过长度就折回到数组开头,前提是它们是定长数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ArrayList是Java中的一个集合类,它实现了List接口,可以动态地添加、删除、修改和查询元素。ArrayList底层采用数组实现,因此它具有快速的随机访问和遍历的能力。 下面是一些ArrayList的相关知识和用法: 1. 创建ArrayList对象(需要import java.util.ArrayList): ``` ArrayList<String> list = new ArrayList<>(); ``` 2. 添加元素: ``` list.add("Apple"); list.add("Banana"); list.add("Cherry"); ``` 3. 删除元素: ``` list.remove("Banana"); // 根据元素值删除 list.remove(1); // 根据索引删除 ``` 4. 修改元素: ``` list.set(0, "Orange"); // 将第一个元素修改为"Orange" ``` 5. 查询元素: ``` System.out.println(list.get(0)); // 输出第一个元素 ``` 6. 获取ArrayList长度: ``` System.out.println(list.size()); // 输出ArrayList长度为2 ``` 7. 遍历ArrayList: ``` for (String fruit : list) { System.out.println(fruit); } ``` 以上就是ArrayList的基本用法,下面是一个完整的例子: ``` import java.util.ArrayList; public class ArrayListExample { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Cherry"); System.out.println("Original list:"); for (String fruit : list) { System.out.println(fruit); } list.remove("Banana"); System.out.println("\nAfter removing 'Banana':"); for (String fruit : list) { System.out.println(fruit); } list.set(0, "Orange"); System.out.println("\nAfter setting first element to 'Orange':"); for (String fruit : list) { System.out.println(fruit); } System.out.println("\nLength of list: " + list.size()); System.out.println("First element: " + list.get(0)); } } ``` 输出结果为: ``` Original list: Apple Banana Cherry After removing 'Banana': Apple Cherry After setting first element to 'Orange': Orange Cherry Length of list: 2 First element: Orange ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值