2015-05-25 7 views
2

Я занимаюсь изучением и чтением того, что делают эти три метода (Справочная копия, Мелкая копия и Глубокая копия) и как их создавать; и мне все еще трудно понять, как реализовать указанные методы в моем коде.Ссылка, неглубокая и глубокая копия

Первый метод должен быть ссылочным методом (refCopy), второй должен быть мелким методом (shalCopy) и последним методом глубокой копии (deepCopy). Не уверен, что они верны. Будем очень благодарны за любую помощь в том, как правильно выполнять эти копии.

Это мой код до сих пор:

public class ArrayRefCopy implements Cloneable { 
    private static int n = 3; 
    private static StringBuffer[] buf = new StringBuffer[4]; 
    public static void main(String[] args){ 

     StringBuffer[] hel = new StringBuffer[n]; 
     hel[0] = new StringBuffer("hello"); 
     hel[1] = new StringBuffer("hallo"); 
     hel[2] = new StringBuffer("hey"); 

     refCopy(hel); 
     System.out.println(Arrays.toString(hel)); 
     shalCopy(hel); 
     System.out.println(Arrays.toString(hel)); 


    } 

    public static StringBuffer[] refCopy(StringBuffer[] bra){ 

     StringBuffer[] ber = bra; 
     return ber; 
    } 

    public static StringBuffer[] shalCopy(StringBuffer[] bar){ 

     return buf = bar; 
    } 

    public static StringBuffer[] deepCopy(StringBuffer[] bri){ 

     StringBuffer[] deep = new StringBuffer[n]; 
     return deep = bri.clone(); 
    } 
} 

================================ =====================================================

Я изменил последние два методы для этого (созданные объекты в них):

public static StringBuffer[] shalCopy(StringBuffer[] bar){ 
     StringBuffer[] buf = new StringBuffer[n]; 
     return buf = Arrays.copyOf(bar, n); 
    } 

    public static StringBuffer[] deepCopy(StringBuffer[] bri){ 

     StringBuffer[] deep = new StringBuffer[n]; 
     return deep = bri.clone(); 
    } 

Но когда я делаю это:

StringBuffer[] hel = new StringBuffer[n]; 
     hel[0] = new StringBuffer("hello"); 
     hel[1] = new StringBuffer("hallo"); 
     hel[2] = new StringBuffer("hey"); 

     StringBuffer[] hal = new StringBuffer[n]; 
     hal = deepCopy(hel); 


     System.out.println(hal.equals(hel)); 

Это дает мне ложь. Я думал, что клон полностью копирует объект со своими значениями. Почему это дает мне ложь?

UPDATE:

public static StringBuffer[] shalCopy(StringBuffer[] bar){ 
     StringBuffer[] buf = new StringBuffer[bar.length]; 
     for(int i = 0; i < bar.length; i++){ 
      buf[i] = bar[i]; 
     } 

      return buf; 
     } 




    public static StringBuffer[] deepCopy(StringBuffer[] bri){ 

     StringBuffer[] deep = new StringBuffer[bri.length]; 
     for(int i=0; i < bri.length; i++){ 
      bri[i] = new StringBuffer(bri[i]); 
      deep[i] = bri[i]; 
     } 

     return deep; 

    } 
+0

Определите правильно. –

ответ

1

Ссылка копия = Новая переменная, указывающая на исходный объект.

Shallow copy = Создать новую копию исходного объекта и присвоить идентичные значения его примитивным свойствам, но использовать те же ссылки, что и исходный объект для свойств, относящихся к другим объектам.

Deep copy = Создать новую копию исходного объекта и рекурсивно создать новые копии для каждой ссылки на объекты в исходной цепочке ссылок на объекты.

Пример:

class C { 
int b; 
A ref1; // in shallow copy, use the same object reference. In deep copy, create a copy on this class instance 
} 

Чтобы ответить на ваш второй вопрос о том, почему hal.equals(hel) возвращает ложь: Это потому, что это то же самое, как проверка ==. Чтобы сравнить содержимое двух массивов, вам нужно будет использовать Arrays.equals(array1, array2);

+0

- это Arrays.equals, дающий true для трех? Если это так, да, это правильно, так как равенство Arrays.equals проверяет значения элементов внутри массива. Так как массивы указывают на один и тот же объект в справочной копии, они, очевидно, имеют одинаковые значения для своих элементов. –

+0

Теперь они дают мне истинное значение для всех методов, верно? Я подумал, что для справочной копии это даст мне ложь. Это правда, потому что, хотя они разные ссылки, они все еще указывают на один и тот же объект? – userb

2

Ваш refCopy() в порядке.

shalCopy() необходимо построить массив new, а затем скопировать на вход StringBuffer ссылки, чтобы он делил те StringBuffer объектов. Напишите цикл или используйте arrayCopy.

deepCopy() необходимо построить массив new, а затем сделать копии всего ввода StringBuffers.

Впишите краткое описание? Если мы выполним ваше задание для вас, вы также можете не учиться на нем.

Update: Обновленное shalCopy() метод получает правильный результат в этом случае, но (1) следует использовать bar.length (его входной длины массива), а не предполагая его входной массив имеет длину n, и (2) первое задание buf = new StringBuffer[n] бессмысленно и вводит в заблуждение, так как код немедленно заменяет его другим массивом. Кроме того, это будет более поучительно, если вы напишите явный цикл, а не вызовите Arrays.copyOf().

Ваш обновленный deepCopy() не дает правильного результата, и он повторяет вышеуказанные проблемы. clone() - это не то, что нужно, не так полезно вообще и не проливает свет на проблему, то есть здесь не поучительно. Вместо этого попробуйте создать новый массив и использовать цикл для (глубокого) копирования всех объектов StringBuffer, а не их ссылок.

Вот как вы можете сказать, если ваш код работает:

  • ссылка копияdest = refCopy(source) должна сделать переменную dest относятся к тому же, например, как source. Поэтому изменение, например, dest[0] = null также изменит source[0].
  • неполной копияdest = shalCopy(source) следует сделать переменные dest см нового массива, который содержит то же экземпляры, которые в source. Поэтому изменение dest[0] = null не изменится source[0], но изменение общего экземпляра, например. dest[1].append("!") изменит source[1].
  • глубокая копияdest = deepCopy(source) должна сделать переменную dest см отдельный массив, который содержит отдельные экземпляры, которые не source. Поэтому ни одно из приведенных выше изменений в dest не изменит source.
+0

Да, я знаю. Я думаю, что это вся информация, в которой я нуждаюсь. Я начинаю это получать. Спасибо. Я могу опубликовать свой новый код немного, чтобы убедиться, я понимаю эти термины. – userb

+0

Я немного смущен, как написать цикл для этого. Я пришел к следующему: for (int i = 0; i userb

+0

Я попробовал кастинг, и он по-прежнему дал мне ошибку «Тип несоответствия: невозможно преобразовать из StringBuffer в StringBuffer []». Что я получаю, так как я в основном пытаюсь преобразовать значения в массив. Как мне это сделать? Моя логика заключалась в том, чтобы итерации через бар, чтобы каждое значение добавлялось/копировалось в buf. – userb

Смежные вопросы