前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中Set与Set<?>到底区别在哪?

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

作者头像
淡定的蜗牛
修改2019-09-30 18:04:00
1.1K0
修改2019-09-30 18:04:00
举报
文章被收录于专栏:Java知己

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

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

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

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

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

Item 1表示以下情况:

代码语言:txt
复制
//合法 代码
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 2是指以下非法情况:

代码语言:txt
复制
//非法代码
public static void printSet(Set<?> s) {
	s.add(10);//this line is illegal 
	for (Object o : s) {
		System.out.println(o);
	}
}

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

代码语言:txt
复制
//非法代码 
Set<?> set = new HashSet<?>();

正是金九银十跳槽季,为大家收集了2019年最新的面试资料,有文档、有攻略、有视频。有需要的同学可以在公众号【Java知己】,发送【面试】领取最新面试资料攻略!暗号【1024】千万不要发,否则.....

2.Set 与 Set<?>

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

此方法声明很好:

代码语言:txt
复制
public static void printSet(Set s) {
	s.add("2");
	for (Object o : s) {
		System.out.println(o);
	}
}

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

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

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

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

例如:

代码语言:txt
复制
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;
}

参考:

1.布洛赫,约书亚。有效的java。Addison -Wesley Professional,2008年。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.关于Set<?>的两个事实
  • 2.Set 与 Set<?>
  • 3.Set<?>什么时候有用?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档