2013-08-02 65 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,但也有其自己的行爲。