【问题标题】:Java copying references in arraysJava复制数组中的引用
【发布时间】:2015-02-09 04:00:39
【问题描述】:

我无法理解复制引用会对数据造成什么影响。 我有一个对象数组。 该数组是不同类的另一个对象的属性。

我需要按其中一个属性对数组中的对象进行排序。

我想知道这样做的最佳和适当的方法是什么。

让我们为上面的内容命名:

class Group{
    Single [] one;
    public Group(){
        one = new Single[10]; //creating array of type Single. 
        //...for loop will assign new objects to each index of one. 

现在我需要对该数组进行排序。我该怎么做?如果我创建一个新数组,对其进行排序,那么我将如何将其保存为 Group 对象的属性?

可以做这样的事情吗?:

Single [] sorted=new Single [10];
Single [] sorted=new Single [10];
sorted[0] = one[2];
sorted[1] = one[4];//....
//and then overwrite one?
one = sorted //pardon me for the syntax. 

【问题讨论】:

    标签: java arrays object reference


    【解决方案1】:

    当你这样做时:

    sorted[0] = one[2];
    

    由于sorted[0]one[2] 包含相同的对象引用,如果您在其中一个数组中更改此引用的状态,那么此更改也会在另一个数组中反映

    当你这样做时:

    one = sorted
    

    您没有修改数组中的任何对象,而是更改了one 变量的值。

    由于您想要/需要对数组进行排序,因此无需使用备用数组。相反,在同一个数组中进行排序。

    如果您只是担心如何对数组进行排序,请使用Arrays#sort(Comparator<? extends Single>)。否则,请在此数组中使用您自己的排序算法,而不是使用新数组(除非您想要/需要使用不可变元素)。

    【讨论】:

      【解决方案2】:

      作为一般方法,您可以使用Arrays.sort 对数组进行就地排序,即数组中元素的顺序会发生变化。您需要提供Comparator<Single> 才能正常工作。

      如果你不能让它工作,我建议你尝试并发布代码(在一个单独的问题中)。

      【讨论】:

        【解决方案3】:

        由于您希望对对象中的数组进行排序,因此最好使用 Arrays.sort 对数组进行就地排序。您不需要创建一个新数组并将引用复制到新数组中,然后再次将新数组引用分配给原始数组引用(如您的示例中所示),因为它会浪费空间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-19
          • 1970-01-01
          • 1970-01-01
          • 2013-07-06
          • 2021-07-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多