0

以下函数使用 HashMap 返回数组中数字的频率。在这个函数中有一行:-

Set<Integer> set= map.keySet();

上面的行是如何工作的。我知道 Set 是一个接口,并且有许多实现类,如 HashSet、TreeSet 等。但是什么map.keySet()返回set变量?此外,当我们编写Set<Integer> set= new HashSet();如何使用 set 变量HashSet作为set接口变量进行访问时?

public static int[] GetFrequency(int [] array){

HashMap<Integer ,Integer > map = new HashMap<Integer,Integer>();      

for(int i =0;i<array.length;i++){

if(map.get(array[i])==null) map.put(array[i],1);
else{
int k = map.get(array[i]);
map.put(array[i],k+1);
}

}

int a[] = new int[map.size()];

Set<Integer> set= map.keySet();

int i =0;
for(int s : set)
a[i++]=map.get(s);
return a;

}
4

2 回答 2

3

设置 set=map.keySet();

上面的行是如何工作的。

仅仅因为HashMap.keySet()返回AbstractSet(内部)的实现,它实现 Set

同样当我们写 Set set= new HashSet(); set 变量如何用于访问 HashSet,因为 set 是一个接口变量?

Set接口定义了一个契约,并且HashSet作为实现者 遵守契约(实现所有方法)。这种方式Set是 的超类型HashSet所以HashSet可以赋值给Set

如果我们说Set<String> set = new HashSet<String>();,只有那些在合约(接口)set中定义的方法将被访问。Set大多数人更喜欢定义超类型(i,e Set)的引用,因为明天如果实现发生更改,则代码的其他部分不需要更改代码

例如:

//implementation can change
Set<String> set = new HashSet<String>();
//set = new TreeSet<String>();
//set = new LinkedHashSet<String>();

//this part will not be impacted
set.add("abc");
于 2013-08-02T10:29:32.467 回答
0

Understand the relation like that:

Suppose you have a 4 Boxes, the first is square, second is rectangle, and third&forth are another shape, but at the end, they all are Boxes.

So, the box is the base, but each of the forth boxes has it's special shape.

So, what I am gonna tell is, HashSet is a Set but have its own behavior also.

于 2013-08-02T10:40:20.653 回答