2016-08-23 6 views
1

私は確かに疑問があります。私は、JavaのTreeSetが実際にクローン()のために浅いコピーを使用しているかどうかを確認したいのですが、私のプログラムでは親ツリーセットから要素を取り除いても、 I親TreeSetのから要素を削除する場合Treesetのクローン()の証明は、Javaで浅いコピーを作成しますか?

public class TreeSetExample { 
    public static void main(String[] args) { 
     TreeSet<Name> nameTreeSet = new TreeSet<>(); 
     nameTreeSet.add(new Name("Compiere")); 
     nameTreeSet.add(new Name("Aristotle")); 
     nameTreeSet.add(new Name("CompierE")); 
     nameTreeSet.add(new Name("COmpiere")); 
     nameTreeSet.add(new Name("ArisTotle")); 
     nameTreeSet.add(new Name("arisTotle")); 
     nameTreeSet.add(new Name("aristotle")); 
     System.out.println(nameTreeSet); 

     TreeSet<Name> cloneNameTreeSet = (TreeSet<Name>) nameTreeSet.clone(); 
     System.out.println(nameTreeSet); 
     Iterator<Name> itr = nameTreeSet.iterator(); 

     /*while (itr.hasNext()) { 
      if (itr.next().getName().equals("aristotle")) 
       itr.remove(); 
     }*/ 

     for(Name name: nameTreeSet) { 
      if(name.getName().equals("aristotle")) 
       nameTreeSet.remove(name); 
     } 

     System.out.println(nameTreeSet); 
     System.out.println(cloneNameTreeSet); 
    } 
} 

/* 
*Name class which is used in my treeset to store its objects 
*/ 

public class Name implements Cloneable, Comparable<Name>, Comparator<Name> { 
    @Override 
    public String toString() { 
     return "Name [name=" + name + "]"; 
    } 

    private String name; 

    public Name(String name) { 
     super(); 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((name == null) ? 0 : name.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Name other = (Name) obj; 
     if (name == null) { 
      if (other.name != null) 
       return false; 
     } else if (!name.equals(other.name)) 
      return false; 
     return true; 
    } 

    @Override 
    public int compare(Name name1, Name name2) { 
     return name1.name.compareTo(name2.name); 
    } 

    @Override 
    public int compareTo(Name name) { 
     return (this.name).compareTo(name.name); 
    } 

} 
+0

訂正をお願いいたします:) – Arafath

+1

オリジナルから削除した要素をクローンインスタンスから削除すると思われるのはなぜですか? 'clone()'は独立したインスタンスを作成しますので、元の変更は複製に反映されません。逆も同様です。 –

+0

浅いコピーはまだコピーです。 – khelwood

答えて

4

、それは、クローニングされたTreeSetのオブジェクトに反映されません。

浅いコピーとは何かを誤解していますか?これは、TreeSetの各要素について、参照が新しいTreeSetにコピーされることを意味します。したがって、SetにあるNameオブジェクトの1つを変更すると、同じオブジェクトを両方参照するため、Setの対応する要素も変更されます。

for(Name name: nameTreeSet) { 
     if(name.getName().equals("aristotle")) 
      name.setName("new name"); 
    } 

しかし、クローニングされたTreeSetが元TreeSetは異なるオブジェクトであり、1から要素を削除すると、他に影響を及ぼさない。

例えば、これは、両方のSet Sに影響を与えます。 Setから要素を削除すると、複製する代わりに参照(TreeSet<Name> cloneNameTreeSet = nameTreeSet;)をコピーするだけで、他の要素に影響を与えます。

+0

あなたの努力に感謝しますが、今でも私はまだ浅いコピーと深いコピーと混同しています。理解しやすくしてください – Arafath

+2

@arafath深いコピーは元のツリーセットのコピー元のTreeSetに格納されている同じName要素への参照ではなく、すべてのName要素のコピーが格納されます。 – Eran

+0

ありがとう@エラン – Arafath

関連する問題