2017-06-19 58 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

如果您通过引用,则只要您的原始数组发生更改,您的数组就会发生更改。 如果你只想要你班里的数值,你应该选择第二种方法。因为这样两个数组就是“分开”的。

相关问题