簡體   English   中英

Java通過創建新實例清除列表

[英]Java clearing a list by creating a new instance

我正在查看Java代碼,發現以下代碼:

list = new ArrayList();
uselist(list);

if (condition)
   list = new ArrayList();

與簡單地使用ArrayLists的clear()方法相反,它的用途是什么。

使用new命令清除列表是否可以,並且比清除列表更快嗎?

我正在使用Java 1.6版

不,他們做的不一樣。 方法clear()清除現有列表-仍然引用該列表的任何內容,以后再查看該列表都會發現它是空的。

使用new關鍵字的方法會更改list變量的值,但不會對現有ArrayList 對象產生任何影響-因此,如果其他任何東西都引用了同一對象,則他們將看不到任何更改。

請注意,清除和重新實例化列表不是同一回事!

考慮以下示例:

a = new ArrayList();
a.add("Hello")
b = a;
a = new ArrayList();   // a is now empty while b contains hello!

a = new ArrayList();
a.add("Hello")
b = a;
a.clear();            // Both a and b are now empty.

如果副作用(共享引用)不是問題,那么這只是清除列表的兩種方法。 除非被稱為數百萬次,否則可能不應該是性能問題。

如果該列表在其他地方使用,則調用clear()可能會導致副作用。 但是,如果不是這種情況,我會說創建一個新列表而不是清除舊列表可能會更快(但是,可能僅適用於大型列表,因為ArrayListclear()只會遍歷元素和集合的它們為null ),但很可能只是編程風格的問題。

是否相同,取決​​於uselist(...)對列表內部進行的操作。

例如,假設您在uselist中具有以下代碼:

public void uselist(List l) {
    this.mylist = l;
}

在這種情況下,您的代碼將創建一個新列表,而不要觸摸this.mylist。 相反,如果您對它調用.clear(),那么您正在清除該相同列表。

這種差異可能是致命的,很難看到。 例如, hibernate將使用list = new ArrayList()退出。 然后嘗試更新數據庫中的列表,但是使用clear()休眠時可以正常工作,然后可以看到連接。

clear() // operates on your old object 

list = new ArrayList(); // list will be a new object the old will be GCed

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM