欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中Set与Set到底区别在哪?

程序员文章站 2022-08-31 22:55:49
您可能知道,*通配符 Set 可以容纳任何类型的元素,而原始类型Set也可以容纳任何类型的元素。那它们之间有什么区别呢? 1.关于Set的两个事实 关于Set有两个事实: + Item 1:?代表任何类型。Set 可以容纳任何类型的元素。_ + Item 2:因为我们不知道?的类型,所以不能将任何 ......

您可能知道,*通配符 set<?> 可以容纳任何类型的元素,而原始类型set也可以容纳任何类型的元素。那它们之间有什么区别呢?

1.关于set<?>的两个事实

关于set<?>有两个事实:

  • item 1:?代表任何类型。set<?> 可以容纳任何类型的元素。_
  • item 2:因为我们不知道?的类型,所以不能将任何元素放入set<?>。

因此 set<?> 可以容纳任何类型的element(item 1),但我们不能将任何元素放入其中(item 2)。这两个陈述是否彼此冲突?当然不是。以下两个示例可以清楚地说明这一点:

** item 1表示以下情况:**

//合法 代码
public static void main(string[] args) {
    hashset<integer> s1 = new hashset<integer>(arrays.aslist(1, 2, 3));
    printset(s1);
 
    hashset<string> s2 = new hashset<string>(arrays.aslist("a", "b", "c"));
    printset(s2);
}
 
public static void printset(set<?> s) {
    for (object o : s) {
        system.out.println(o);
    }
}

由于 set<?> 可以容纳任何类型的元素,因此我们仅在循环中使用object。

** item 3是指以下非法情况:**

//非法代码
public static void printset(set<?> s) {
    s.add(10);//this line is illegal 
    for (object o : s) {
        system.out.println(o);
    }
}

因为我们不完全知道 <?> 的类型,所以除了null之外,我们无法添加其他任何内容。出于相同的原因,我们无法使用 set<?> 初始化集合。以下是非法的:

//非法代码 
set<?> set = new hashset<?>();

2.set 与 set<?>

原始类型集和*通配符集<?>有什么区别?

此方法声明很好:

public static void printset(set s) {
    s.add("2");
    for (object o : s) {
        system.out.println(o);
    }
}

因为原始类型没有限制。但是,这很容易破坏集合的不变性。

简而言之,通配符类型是安全的,而原始类型则不是。我们不能将任何元素放入set<?>中。

3.set<?>什么时候有用?

如果要使用泛型类型,但不知道或不在乎该参数的实际类型,则可以使用<?> 。它只能使用方法的参数。

例如:

public static void main(string[] args) {
    hashset<integer> s1 = new hashset<integer>(arrays.aslist(1,2,3));
    hashset<integer> s2 = new hashset<integer>(arrays.aslist(4,2,3));
 
    system.out.println(getunion(s1, s2));
}
 
public static int getunion(set<?> s1, set<?> s2){
    int count = s1.size();
    for(object o : s2){
        if(!s1.contains(o)){
            count++;
        }
    }
    return count;
}