2017-06-19 59 views
2

爲了在類中存儲字節數組,我只複製數組還是隻傳遞一個引用?在類中存儲字節[]

E.g.

class MyClass { 

    public MyClass(int size, Byte buf[]) { 
     this.size = size; 
     this.buffer = buf; 
    } 

    private int size; 
    private Byte buffer[]; 
} 

,或者

class MyClass { 

    public MyClass(int size, Byte buf[]) { 
     this.size = size; 
     this.buffer = buf; 
    } 

    private int size; 
    private Byte buffer[] = new Byte[size]; 
} 

,或者

class MyClass { 

    public MyClass(int size, Byte buf[]) { 
     this.size = size; 
     this.buffer = copyOf(buf, 5); 
    } 

    private int size; 
    private Byte buffer[]; 
} 

我很困惑我是否需要數組真的複製或只是存儲的參考?

+0

第二個將創建一個大小爲「0」的數組,然後用buf覆蓋它。最後將創建一個副本,**這對於不變性是有利的**因爲數組引用將會不同 – AxelH

回答

2

如果您不復制數組,則對源數組所做的任何更改都會影響該類中的新數組。這可能不是你想要的。

另外:您應該使用byte[],而不是Byte[]。 (A Byte是一個byte周圍的包裝對象,Byte對象數組採用比byte元一個更多的內存。

+0

你好,我不關心源,例如我有一個字符串,我做''HelloWorld「.getBytes()'。我可以簡單地分配字節而不復制嗎?你能舉兩個例子嗎? – user963241

+1

當然。 「HelloWorld」.getBytes()創建一個新的字節數組。如果你只是把它分配給你的領域,那麼沒有其他參考,因此不需要複製。 –

+0

至於例子,我想我的第一個例子顯示如何直接分配,第三個顯示覆制,第二個是不正確的? – user963241

2

你需要決定你的類合同是什麼。

  1. 如果複製內容,你可以確定調用代碼不會意外修改數組,但速度較慢。
  2. 如果你不要複製內容,速度會更快,但如果調用代碼修改數組,你的類可能會表現出來意外。

所以,你需要回答這些問題:

  • 它是確定它已經被傳遞給你的課後一些代碼來修改數組的內容?
  • 如果不好,你想複製內容還是簡單地在javadoc中記下一個事實,即對該數組的任何後續修改都可能會破壞該類?
0

如果您通過引用,則只要您的原始數組發生更改,您的數組就會發生更改。 如果你只想要你班裏的數值,你應該選擇第二種方法。因爲這樣兩個數組就是「分開」的。

相關問題