Когда я повторно инициализирую вектор, почему он сохраняет свои значения

#java

#java

Вопрос:

В приведенном ниже классе я добавляю строку к вектору (v1), а затем добавляю этот вектор (v1) к новому вектору (v2). Затем я повторно инициализирую вектор v1.

Как java сохраняет ссылку на v1? Когда я повторно инициализирую v1, поддерживает ли java ссылку под капотом?

Вывод ниже равен «1».

 public class VectorTest {

    public static void main(String args[]){
        new VectorTest().testVector();
    }

    private void testVector(){

        Vector v1 = new Vector();
        Vector v2 = new Vector();

        v1.add("1");
        v2.add(v1);
        v1 = new Vector();
        Vector v3 = (Vector)v2.get(0);
        System.out.println(v3.elementAt(0));
    }

}
  

Комментарии:

1. Вы изменили, какие v1 ссылки, но это отдельно от того факта, что v2 содержит ссылку на ту же Vector , которая v1 использовалась для ссылки. Кроме того, вы можете изучить возможность использования дженериков, если вы этого не сделали.

2. я думаю, вы любите исследовать вещи… но java удивительна, не так ли… что бы вы ни делали, он обрабатывает это… 1 к вопросу никогда не думал, что это может быть таким образом…

Ответ №1:

 private void testVector(){

    Vector v1 = new Vector(); // v1 references some vector created on the heap
    Vector v2 = new Vector(); 

    v1.add("1"); // vector referenced by v1 gets a "1" added
    v2.add(v1); // make v2[0] the second referrer to that Vector you created

    v1 = new Vector(); // Change what v1 refers to, this is not the same as destroying the original Vector
    // v2[0] still holds a reference to the original vector

    Vector v3 = (Vector)v2.get(0); // v3 is now another referrer to the same vector
    System.out.println(v3.elementAt(0));
}
  

Вы меняете то, что v1 относится к, в данном случае к какому-то другому Vector . Но v2 все еще содержит ссылку на оригинал Vector .

Объекты в Java могут иметь несколько переменных, ссылающихся на него. Vector объекты также изменчивы, что означает, что если один из его рефереров изменяет его, как вы делаете с:

 v1.add("1");
  

Тогда каждый другой реферер теперь будет ссылаться на тот же вектор, в котором есть a "1" .

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

 v1 = new Vector();
  

Итак, после того, как это произойдет, v1 содержит другую ссылку на другой Vector объект, в то время v2[0] как (извините за обозначение массива) все еще содержит ссылку на оригинал Vector , который вы создали и назначили v1 в начале.


 Vector v3 = (Vector)v2.get(0);
  

Когда вы делаете это, вы v3 ссылаетесь на то же Vector самое, что вы создали в начале, поэтому на данный момент есть два ссылки на этот объект:

  1. v2[0]
  2. v3

Я бы попытался нарисовать несколько грубых изображений, чтобы продемонстрировать это, но я думаю, что проще просто прочитать эту страницу из руководства по Java об объектах и ссылках:

http://download.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

Комментарии:

1. v2.add(v1); // сделайте v2 вторым ссылкой на созданный вами вектор , если это не будет — v2.add(v1); // добавьте новый вектор v1 в вектор v2?

2. @user470184 — Да, извините, отредактировал комментарии к коду, чтобы показать это. v2[0] (проще, чем сказать первый элемент v2 ) получит ссылку на тот же вектор, который v1 ссылается на этот момент.

Ответ №2:

Когда вы делаете:

 v1 = new Vector();
  

Происходит то, что v1 теперь указывает на другой объект, но на старый вектор также ссылается v2 (поскольку вы его добавили).

Java не освобождает объект до тех пор, пока все ссылки на него не будут удалены (грубо говоря).

Ответ №3:

Используйте v1.clear() , если вы хотите v2.get(0) быть повторно инициализированным, хотя здесь это имеет мало смысла. Как прокомментировал birryree, вы меняете ссылку на v1, присвоение не влияет на сам объект new Vector() .

Ответ №4:

Я прокомментирую ваш код:

 public class VectorTest {

    public static void main(String args[]){
        new VectorTest().testVector();
    }

    private void testVector(){

        Vector v1 = new Vector();  // Create a new vector as v1
        Vector v2 = new Vector();  // Create a new vector as v2

        v1.add("1");  // Add the string "1" as an element in v1
        v2.add(v1);   // Add whatever is inside v1 to v2.
        v1 = new Vector();  // Dispose old v1, get a new vector as v1
                            // THIS HAS NO EFFECT ON v2

        Vector v3 = (Vector)v2.get(0);  // Get the 0th item from v2 as a new vector v3.


        System.out.println(v3.elementAt(0));
    }
  

Как я уже отмечал, удаление v1 (когда вы получаете для него новый вектор) не влияет на то, что вы сделали с v2.

 }