ArrayList和LinkedList有何不同?
可以先从底层数据结构开始说起,然后以某一个方法为突破口深入,比如:最大的不同是两者底层的数据结构不同,ArrayList底层是数组,LinkedList底层是双向链表,两者的数据结构不同也导致了操作的API实现有所差异,拿新增实现来说,ArrayList会先计算并决定是否扩容,然后把新增的数据直接赋值到数组上,而LinkedList仅仅只需要改变插入节点和其前后节点的指向位置关系即可。最后说一下特点,ArrayList查询快,增删慢LinkedList查询慢,增删快。
ArrayList和LinkedList应用场景有何不同?
ArrayList更适合于快速的查找匹配,不适合频繁新增删除,像工作中经常会对元素进行匹配查询的场景比较合适,LinkedList更适合于经常新增和删除,对查询反而很少的场景。比如我们后面学习的线程池和连接池,内部就可以使用LinkedList集合实现。
ArrayList和LinkedList两者有没有最大容量?
ArrayList有最大容量的,为Integer的最大值,大于这个值JVM是不会为数组分配内存空间的,LinkedList底层是双向链表,理论上可以无限大。但源码中,LinkedList实际大小用的是int类型,这也说明了LinkedList不能超过Integer的最大值,不然会溢出。
ArrayList和LinkedList是如何对null值进行处理的?
ArrayList允许null值新增,也允许null值删除。删除null值时,是从头开始,找到第一值是null的元素删除;LinkedList新增删除时对null值没有特殊校验,是允许新增和删除的。
ArrayList和LinedList是线程安全的么,为什么?
当两者作为非共享变量时,比如说仅仅是在方法里面的局部变量时,是没有线程安全问题的,只有当两者是共享变量时,才会有线程安全问题。主要的问题点在于多线程环境下,所有线程任何时刻都可对数组和链表进行操作,这会导致值被覆盖,甚至混乱的情况。
如果有线程安全问题,在迭代的过程中,会频繁报ConcurrentModificationException的错误,意思是在我当前循环的过程中,数组或链表的结构被其它线程修改了。
如何解决线程安全问题?
Java源码中推荐使用Collections#synchronizedList进行解决,Collections#synchronizedList的返回值是List的每个方法都加了synchronized锁,保证了在同一时刻,数组和链表只会被一个线程所修改,或者采用CopyOnWriteArrayList并发List来解决,这个类我们后面会说。
猜你喜欢:
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/253695.html