- 假設列表b是一個LinkedList。
- 假設List a也是一個LinkedList。
- 如何追加,這些名單在不斷的時間?
這是可能的,因爲LinkedList大概是一個雙向鏈表(否則它不能實現Deque接口)。追加雙向鏈表是一個0(1)操作。
addAll
方法不會在恆定時間內運行。
問:
- 如何變換LinkedHashSet成在固定時間列表?
這也可能是因爲LinkedHashSet
「維護通過其所有條目運行的雙向鏈接列表」。
這是可能的,因爲LinkedList大概是一個雙向鏈表(否則它不能實現Deque接口)。追加雙向鏈表是一個0(1)操作。
addAll
方法不會在恆定時間內運行。
問:
這也可能是因爲LinkedHashSet
「維護通過其所有條目運行的雙向鏈接列表」。
您的假設是基於沒有封裝 - 即LinkedHashSet
願意將其內部LinkedList
暴露給外部世界,當我懷疑它不是。
同樣加入兩個鏈接列表 - 我不知道每個節點是否知道它在哪個列表中,但這肯定是一種可能性,它會減少你的常量附加。即使他們不這樣做,只要您將一個列表的頭部附加到另一個列表的尾部,最終會出現問題 - 您有兩個列表都指向相同的數據,這會導致一些奇怪的後果。
換句話說,從計算機科學的角度來看,這兩種操作都是可行的,並且您可以構建自己的實現來支持它們,但這並不意味着Java API會以啓用它的方式公開其內部那些操作。
你需要實現你自己的類。 LinkedList
類不公開其內部節點結構,因此您不能將其最後一個節點指向另一個LinkedList
的第一個節點。
答案與LinkedHashSet
類似:雖然它確實保留了這個雙向鏈表,但您無法訪問它。
由於LinkedHashSet實現了抽象集合接口,因此您可以訪問該列表。請參閱@Michael McGrady答案 – 2017-10-08 08:39:12
你不能訪問它,但我懷疑集合的確如此,所以你不應該放棄希望這是對你的問題可行和快速的解決方案。
我看得更遠,你是對的。如果你有Set<Whatever> whatever = SOME CONSTRUCTOR
那麼你可以編碼List<Whatever> list = new LinkedList(whatever);
,因爲LinkedList有一個集合構造函數,而集合有一個集合接口。
Java是否已經有追加LinkedList的方法?這些方法當然應該使用LinkedList而不是List,因爲它們根本無法使用ArrayList。將LinkedHashSet轉換爲LinkedList也是如此。實際上,這是我的問題。 – Klems 2011-05-19 16:24:36
@Klems:不,我不相信它 - 因爲你有兩個共享節點的LinkedList對象。同樣,如果調用者修改返回的列表,您將如何建議從LinkedHashSet創建LinkedList而不引入可能的損壞? (我想可能會返回一個不可變的視圖。) – 2011-05-19 16:36:46
哦,我現在看到了問題。那麼,正如你所說,它可能會返回一個只讀列表。這有點像返回一個迭代器。但是,要附加2列表,該方法可以清除2個初始列表並返回結果列表。但我明白你的觀點。 – Klems 2011-05-19 16:45:19