2013-08-02 134 views
0

以下函数使用HashMap返回数组中数字的频率。在此功能中有一行: -设置接口Java

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

上述行如何工作。我知道Set是一个接口,并且有许多实现类,如HashSet,TreeSet等。但是map.keySet()返回set变量?当我们写Set<Integer> set= new HashSet();如何设置变量可以用来访问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; 

} 
+2

听说过称为多态性?去谷歌上查询! –

+0

它被称为多态性。 – Azad

回答

3

集设定= map.keySet();

上述生产线如何工作。

很简单,因为HashMap.keySet()回报AbstractSet(内部)的impmenentation,它实现我们写集合设定=新的HashSet Set

另外();如何设置 变量可以用来访问HashSet的设置是一个接口变量 ?

Set接口定义了合同,HashSet实施者粘附到合同的(实现了所有的方法)。这样Set超类型的HashSet,所以HashSet可如果说Set<String> set = new HashSet<String>();被分配到Set

,与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"); 
+1

'HashMap.keySet()'不会返回'HashSet',而是[自定义实现](http://www.grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7- b147/java/util/HashMap.java#HashMap.KeySet)直接使用'HashMap'的内部值而不是创建副本的'Set'。这是内部数据的“视图”。 – zapl

+0

我在编辑过程中:-) – sanbhat

+0

+1谢谢。很好解释:) –

0

理解的关系像这样:

假设你有一个4个盒子,第一个是正方形,第二个是矩形,第三个是另一个形状,但最后它们都是盒子。

因此,盒子是基地,但每个第四个箱子都有它的特殊形状。

所以,我要告诉的是,HashSetSet,但也有其自己的行为。