2 回答

TA貢獻(xiàn)2條經(jīng)驗(yàn) 獲得超1個(gè)贊
我今天也被問(wèn)到了這個(gè)問(wèn)題。面試官給我的答案是用多線程將List分段并行處理。java1.8中可以通過(guò)
list.parallelStream()獲取并行流

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
Java8 的 Stream
可以并發(fā)執(zhí)行,但 Stream
不會(huì)改變?cè)械?list,只能返回一個(gè)新的 list,然后賦值給原來(lái) list 的引用。但是如果 list 是 RandomAccess
的,即底層實(shí)現(xiàn)為數(shù)組,比如 ArrayList
,那么直接使用傳統(tǒng)的 for 循環(huán)遍歷一遍就好,因?yàn)閷?duì)于 RandomAccess
的 List
,通過(guò)下標(biāo)訪問(wèn)數(shù)組元素的時(shí)間復(fù)雜度為 O(1),那么遍歷一遍的時(shí)間復(fù)雜度為 O(N),這是一個(gè)很優(yōu)的時(shí)間復(fù)雜度,而且沒(méi)有使用額外的空間,空間復(fù)雜度為 O(1);
如果不是,比如 LinkedList
,那么通過(guò)下標(biāo)獲得 list 中對(duì)應(yīng)元素的時(shí)間復(fù)雜度是 O(N),如果使用之前的方式,那么總的時(shí)間復(fù)雜度會(huì)是 O(N^2),那么推薦創(chuàng)建一個(gè)同樣大小新的 List
,然后遍歷原有的 list,把 每個(gè)元素+1 的值加入到新的 List
中。這個(gè)時(shí)候時(shí)間復(fù)雜度是 O(N),空間復(fù)雜度也是 O(N)。(當(dāng)然此時(shí)你也可以使用 Stream
來(lái)生成一個(gè)新的 List
)
所以我猜測(cè)面試官對(duì)你的回答不滿(mǎn)意,是因?yàn)槟銢](méi)有考慮到不同的 List 類(lèi)型吧。
添加回答
舉報(bào)