例如:
Set set1 = new HashSet();
set1.add( object1 );
set1.add( ... );
set1.add( objectn );
Set set2 = new HashSet( set1 );
或者
Set set3 = new HashSet( set1 );
set3.addAll( set1 );
set2 与 set3 中存储的都是 set1 元素的 “引用”
代码如下:
/**
* 测试 addAll( Collections )
* 应该是保存的同一引用。
* @author gqltt
*
*/
public class SetAddAllTest {
/**
* @param args
*/
public static void main(String[] args) {
testSetWithPerson();
}
private static <T> void print( String desc, Set<T> set ){
System.out.println( desc );
for( T s : set ){
System.out.print( s + " ");
}
System.out.println( "\n" );
}
/**
* 测试元素为应用类型
*/
private static void testSetWithPerson(){
Set<Person> set1 = new HashSet<Person>();
set1.add( new Person("b", 25) );
set1.add( new Person("a", 20) );
set1.add( new Person("c", 26) );
Set<Person> set2 = new TreeSet<Person>();
set2.addAll( set1 );
//
print( "set1", set1 );
print( "set2", set2 );
changeName( getPersonByName( set1, "a" ), "abc" );
print( "set1 after modify element Person {name a->abc }:", set1 );
print( "set2 after set1 modify element:", set2 );
}
private static Person getPersonByName( Set<Person> set, String name ){
for( Person p : set ){
if( p.name.equals( name ) ){
return p;
}
}
return null;
}
private static void changeName( Person p, String newName ){
p.setName( newName );
}
static class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "(" + name + ", " + age + ")";
}
@Override
public int compareTo(Person person) {
return age - person.age;
}
@Override
public boolean equals(Object obj) {
if( obj == null ){
return false;
}
if( ! ( getClass() == obj.getClass() ) ){
return false;
}
Person p = (Person) obj;
return name != null && name.equals( p.name ) && age == p.age;
}
@Override
public int hashCode() {
int result = 47;
result += name.hashCode();
result += new Integer( age ).hashCode();
return result;
}
}
}
测试结果输出:
set1
(b, 25) (c, 26) (a, 20)
set2
(a, 20) (b, 25) (c, 26)
set1 after modify element Person {name a->abc }:
(b, 25) (c, 26) (abc, 20)
set2 after set1 modify element:
(abc, 20) (b, 25) (c, 26)