使用Set构建Collection会保留Set属性吗? (JAVA)

时间:2012-06-01 00:15:22

标签: java collections polymorphism set

如果我的代码如下:

Collection<Object> c = new HashSet<Object>();

它是否仍会保留集合无法包含重复值的属性。换句话说,在下列情况下会发生什么?

String h = "Hello World!";
c.add(h);
c.add(h);

5 个答案:

答案 0 :(得分:2)

是的,Set的行为和属性仍然有效。 c只会包含一个"Hello World!"

的实例
public static void main(String[] args)
{
    Collection<Object> c = new HashSet<Object>();
    String h = "Hello World!";
    c.add(h);
    c.add(h);
    System.out.println("c contains " + c.size() + " item(s): " + c);
    System.out.println("c is an instance of " + c.getClass());
}

以上main方法输出:

c contains 1 item(s): [Hello World!]
c is an instance of class java.util.HashSet

答案 1 :(得分:2)

你不是“构建一个集合”;你只是创建一个新的参考。所以,是的,所有底层属性仍然存在,因为它仍然是您正在调用的原始对象的方法。

答案 2 :(得分:1)

简短:是的 - 即使引用变量类型是HashSet的超类型,它仍然是HashSet的对象。

答案 3 :(得分:1)

HashSet<T> theSet = new HashSet<T>();
Collection<T> collection = theSet;
Iterable<T> iterable = theSet;
Object object = theSet;

所有这四个变量都是不同的类型(顺便说一下,它们都必须是HashSet的超类型),但它们都引用了类型为HashSet的同一个对象。无论您使用什么变量来访问对象,它总是以相同的方式运行。这是polymorphism的主要功能之一。

唯一的区别是你移动继承树越高(向上意味着更普遍的类型),你可以访问的方法和字段越少。因此,您无法调用object.iterator()iterable.size()等方法,但是当您调用所有变量的公共方法时,它的行为方式总是相同:

theSet.toString(); // produces []
collection.toString();  // produces []
iterable.toString()  // produces []
object.toString(); // produces []

答案 4 :(得分:0)

String h = "Hello World!";
c.add(h);//Returns true
c.add(h);//Returns false since duplicate elements are not allowed in HashSet

So only one instance of h will be added to HashSet