Java面試題(ArrayList)


大廠ArrayList的面試題:

1.new ArrayList的時候底層new了什么?

2.凡數組都有類型,什么類型?

3.數組要在內存中占據連續的內存空間,初始值以java8為例是多少?

4.存25個元素進去可以嗎?底層發生什么?底層擴容到多少?

5.搬家的過程用到了什么方法?

6.第二次擴容擴到多少?

7.Array線程安全還是不安全?

8.請寫一個線程不安全的例子?

答案:

1.object類型的數組

2.object類型

3.10

4.可以的,底層會發生擴容,擴容到原值一半,15

5.Arrays.copyOf()

Arrays的copyOf()方法

具體的參考:https://blog.csdn.net/qq_25131363/article/details/85001414

6.22 擴容到原值的一半取整。可以debug打斷點看到。

7.線程不安全

8.

/*
* 1.故障現象
* 並發異常
* java.util.ConcurrentModificationException
* 2.導致原因
* 多線程並發爭搶同一個類
* 3.解決方案
* 3.1 new Vector<>
* 3.2 Collections.synchronizedlist(new ArrayList<>());
* 3.3 CopyOnWriteArrayList();
*
* 4.優化建設(同樣的錯誤不犯第二次)
* 高並發的情況下使用JUC包下的工具來解決
*
*/
public class NotSafeDemo03 {
public static void main(String[] args) {
//寫時復制類
List<String> list = new CopyOnWriteArrayList<String>();//Collections.synchronizedList(new ArrayList<>());//new Vector<>();//ArrayList<>();

for (int i = 1; i <=30 ; i++)
{
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(list);
},String.valueOf(i)).start();
}
}
}

因此一般有2種解決辦法:

  1)在使用iterator迭代的時候使用synchronized或者Lock進行同步;

  2)使用並發容器CopyOnWriteArrayList代替ArrayList和Vector。

  關於並發容器的內容將在下一篇文章中講述。

  參考資料:

  http://blog.csdn.net/izard999/article/details/6708738

  http://www.2cto.com/kf/201403/286536.html

 

9.vector線程安全,ArrayList線程不安全,為什么?

如果強調效率就選ArrayList

10.collection和collectionsu有什么區別

collections:集合接口的工具類

collection:接口

 

筆記:寫時復制

copyonwrite容器即寫時復制的容器,往一個容器添加元素的時候,不直接往當前容器的objectp[]添加,而是先將當前的容器object[]進行copy,復制出一個新的容器object[] new Elements,然后新的容器object[] new Elements添加元素,添加完元素后,再將原容器的引用指向新的容器,setArray(new Elements);這樣做的好處是可以針對copyonwrite容器進行並發的讀,而不需要加鎖,因為當前容器不會添加任何元素,所以copyonwrite是一種讀寫分離的思想,讀和寫不同的容器。

 

 

public boolean add(E e) {
final ReentrantLock lock = this.lock;                               
// 上鎖                                            
lock.lock();
try {
// 獲取對象數組
Object[] elements = getArray(); // =========== 舊對象數組                                                  
int len = elements.length;
// 復制原來的對象數組,並返回一個比源對象數組長度 +1 的對象數組
Object[] newElements = Arrays.copyOf(elements, len + 1); // =========== 新對象數組      
// 將元素添加到對象數組的末尾
newElements[len] = e;
// 替換內部對象數組的引用
setArray(newElements);
return true;
} finally {
// 解鎖
lock.unlock();
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM