2016-04-12 2 views
-1

Я просто замечаю странное поведение сегодня, даже когда я писал на Java 2 года. Вот посмотрите на мой код,Отключить автоматическое изменение значения объекта в java-связанном списке

public static void main() { 
    Lorem lo = new Lorem("abc", 2);   
    LinkedList<Lorem> lim = new LinkedList<>();   
    lim.add(lo); 
    LinkedList<Lorem> lid = new LinkedList<>();   
    lo.tf++;   
    lid.add(lo); 

    System.out.println("in list lim: " + lim.get(0).term + " " + lim.get(0).tf);   
    System.out.println("in list lid: " + lid.get(0).term + " " + lid.get(0).tf); 
    } 

    class Lorem { 
    public String term; 
    public int tf; 

    public Lorem(String term, int tf) { 
     this.term = term; 
     this.tf = tf; 
    } 
    } 

результат, как это:

in list lim: abc 3 
in list lid: abc 3 

И да, тот же объект, добавляется в другой список. Один объект сохранения списка, когда он имеет состояние: term = «abc», tf = 2. И другое сохраняет, когда term = «abc» и tf = 3. И вы можете видеть, что в конце я печатаю значение каждого списка , Удивительно, что объект lo in lim имеет точно такое же значение, что и lo в крышке. Даже когда я их не синхронизирую. Мой вопрос: Почему Java автоматически обновляет (синхронизирует) другой список? Как отключить это поведение?

+0

Да, изменяемые объекты такие. – dasblinkenlight

ответ

1

Это неудивительно, и мне интересно, как вы не обнаружили это за 2 года программирования.

Java работает по ссылкам. Таким образом, то, что вы сохраняете в списке, не является объектом, а ссылкой, которая указывает где-то в куче на реальный выделенный объект, это похоже на то, что ваш LinkedList просто содержит адрес памяти для Lorem.

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

Если вы хотите сохранить два разных элемента, вам необходимо выделить новый объект (и, возможно, скопировать/передать состояние).

+0

Вы правы. возможно, потому, что я редко или, возможно, никогда не имел такого случая в развитии информационной системы. Спасибо за решение. – imeluntuk

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