Set vs. Set - Neyi Nasıl Yapsak

Post Top Ad

Set vs. Set

Share This

 

You may know that an unbounded wildcard Set can hold elements of any type, and a raw type Set can also hold elements of any type. What is the difference between them?

 

1. Two facts about Set

There are two facts about Set:
Item 1: Since the question mark ? stands for any type. Set is capable of holding any type of elements.
Item 2: Because we don't know the type of ?, we can't put any element into Set

So a Set can hold any type of element(Item 1), but we can't put any element into it(Item 2). Do the two statements conflict to each other? Of course they are not. This can be clearly illustrated by the following two examples:

Item 1 means the following situation:

//Legal Code  public static void main(String[] args) {  	HashSet s1 = new HashSet(Arrays.asList(1, 2, 3));  	printSet(s1);     	HashSet s2 = new HashSet(Arrays.asList("a", "b", "c"));  	printSet(s2);  }     public static void printSet(Set s) {  	for (Object o : s) {  		System.out.println(o);  	}  }

Since Set can hold any type of elements, we simply use Object in the loop.

Item 2 means the following situation which is illegal:

//Illegal Code  public static void printSet(Set s) {  	s.add(10);//this line is illegal   	for (Object o : s) {  		System.out.println(o);  	}  }

Because we don't know the type of exactly, we can not add any thing to it other than null. For the same reason, we can not initialize a set with Set. The following is illegal:

//Illegal Code  Set set = new HashSet();

2. Set vs. Set

What's the difference between raw type Set and unbounded wildcard Set?

This method declaration is fine:

public static void printSet(Set s) {  	s.add("2");  	for (Object o : s) {  		System.out.println(o);  	}  }

because raw type has no restrictions. However, this will easily corrupt the invariant of collection.

In brief, wildcard type is safe and the raw type is not. We can not put any element into a Set.

3. When Set is useful?

When you want to use a generic type, but you don't know or care what the actual type the parameter is, you can use [1]. It can only be used as parameters for a method.

For example:

public static void main(String[] args) {  	HashSet s1 = new HashSet(Arrays.asList(1,2,3));  	HashSet s2 = new HashSet(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;  }

Reference:

1. Bloch, Joshua. Effective java. Addison-Wesley Professional, 2008.

Hiç yorum yok:

Yorum Gönderme

Popüler Yayınlar

Post Bottom Ad

Pages