㈠ java map介面怎麼用啊
使用注意:對於Map的使用,初始化應注意!
將Map裝載進List當中,雖然循環多次賦值,並且每次賦值後的Map裝載入List,但實際到最後時,List中所有的Map為同一鍵值,因此建議在循環內每次都New一個新的Map對象,但為了效率考慮,最好就Map的申明放在循環外做;
public List readExcel(String fileUrl, String fileName, int sheetNum,
String[] attribute, int startRow, int[] ignoreColumn) {
// 返回值
List<Map<String, String>> result = new ArrayList<Map<String, String>>();
// 文件流
InputStream is = null;
// 讀入文檔的出錯行號
int errorRow = 0;
try {
// 如果同一文檔,則只產生一個實例
if (wb == null) {
is = new FileInputStream(fileUrl + "\\" + fileName);
wb = Workbook.getWorkbook(is);
is.close();
}
// 讀入Sheet頁
Sheet sheet = wb.getSheet(sheetNum);
// 行數
int rows = sheet.getRows();
// 根據每個Sheet頁的欄位數指定列數
int columns = attribute.length - 1 + ignoreColumn.length;
int countAttribute = 0;
// 列印信息
// System.out.print(sheet.getName() + " ");
// System.out.print("rows:" + rows);
// System.out.println(" columns" + columns);
// 逐行讀入
// Map<String, String> map = new HashMap<String, String>();
Map<String, String> map;
boolean rowIsNull;
aaa: for (int i = startRow - 1; i < rows; i++) {
// 每次讀入文檔前,清空map
// map.clear();
map = new HashMap<String, String>();
// 當前Sheet頁行數(指Excel行號)
errorRow = i + 1;
// 不為空列數計數值
int columnIsNotNullNum = 0;
// 一行數據中,必須有至少5列以上的數據,才認為該行為正常數據,否則退出
rowIsNull = true;
for (int k = 0; k < columns; k++) {
String rowContent = sheet.getCell(k, i).getContents();
if (rowContent != null && !rowContent.equals("")) {
++columnIsNotNullNum;
}
if (columnIsNotNullNum >= 5) {
rowIsNull = false;
break;
}
}
// 如果一行不超過5列有值,則跳出循環
if (rowIsNull)
break aaa;
// 逐列讀值
bbb: for (int j = 0; j < columns; j++) {
for (int k = 0; k < ignoreColumn.length; k++)
// 不讀忽略的列
if (j == ignoreColumn[k] - 1)
continue bbb;
// 取得單元格內容
String sbcContent = sheet.getCell(j, i).getContents();
// 全形轉換為半形
String content = CommonUtil.sbcChange(sbcContent);
// 建立資料庫欄位鍵值映射關系
map.put(attribute[countAttribute], content.trim());
countAttribute++;
}
// 將文檔名稱入庫
map.put(attribute[countAttribute], fileName);
result.add(map);
countAttribute = 0;
}
} catch (Exception e) {
wb.close();
try {
is.close();
} catch (IOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
result = null;
System.out.println(CommonCode.ERR_READ_ROW + ":" + errorRow);
}
return result;
}
㈡ 為什麼Java中Map介面的get函數參數竟然是Object
Map的get 和put 都是按照聲明初始化的時候的泛型來的
Map<Object,Object> map = new HashMap<Object,Object>();
這樣get的時候 , 參數就是Object , 返回值也是Object
如果不寫泛型 , key 和 value 類型都是Object , 就是上邊這樣的情況 , 不過自己聲明的話
一般是用String作為 key
㈢ java map 的用法
map是個介面
用都是用HasMap等實現Map介面的類
創建:Map<String,String> map = new HashMap<String,String>();
插入元素:map.put("1","a");
移除元素: map.remove("1");
清空: map.clear();
具體參照java API
java.uitl.HashMap
㈣ java中Map是什麼意思,最重要的是怎麼能用上
Map 正版翻譯是查找表(你沒看錯,很蛋疼得翻譯)
要用得話可以用他得實現類 HashMAP
Map<key ,value > a=new HashMap<key,value>();
map裡面存得是一個個鍵值對,可以對鍵值對直接泛型,
Map<String ,String > map=new HashMap<String, String>();
a.put(key, value);
a.get(key) 得到value;
查找比較直接 很好用!
㈤ Java中List、Set、Map介面之間的區別和聯系
List 用於遍歷一個數組時效率最高;比如在循環顯示所有信息時經常用到;
Set中的元素是不能重復的,如果使用add(Object obj)方法添加已經存在的對象,則會覆蓋前面的對象;雖然Set同List都實現了Collection介面,但是他們的實現方式卻大不一樣。List基本上都是以Array為基礎。但是Set則是在HashMap的基礎上來實現的,這個就是Set和List的根本區別。 Map 就是鍵值對map(鍵,值),鍵是Sting 類型 值是Object (對象類型),所以在知道某條信息的一項時查詢其他項就用該方法,效率最高!(以上個人見解!)
詳細:數組和其它容器的區別主要有三方面:效率,類型,和保存基本類型的能力.在Java中,數組是一種效率很高的存儲和隨機訪問對象引用序列的方式.數組是一 個簡單的線性序列,因此訪問速度很快,但也損失了其它一些特性.創建一個數組對象後,大小就固定了,如果空間不夠,通常是再創建一個數組,然後把舊數組中 的所有引用移到新數組中.數組可可以保存基本類型,容器不行.
容器類不以具體的類型來處理對象,而是將所有的對象都以Object類型來處理,所以我們可以只創建一個容器,任意的Java對象都可以放進去.容器類可 以使用包裝類(Integer,Double等),以便把基本類型放入其中. List Set Map 都可以自動調整容量,數組不能.
Collection表示一組對象,這些對象也稱為collection的元素。一些 collection允許有重復的元素,而另一些則不允許。一些collection是有序的,而另一些則是無序的。JDK中不提供此介面的任何直接實 現,它提供更具體的子介面(如 Set 和 List)實現.
Map 將鍵映射到值的對象。一個映射不能包含重復的鍵;每個鍵最多隻能映射一個值.Map 介面提供三種collection視圖,允許以鍵集、值集合或鍵值映射關系集的形式查看某個映射的內容。某些映射實現可明確保證其順序,如 TreeMap(有序) 類;某些映射實現則不保證順序,如 HashMap(無序) 類。Map可以像數組那樣擴展成多維數組,只要把每個值也做成一個Map就行了.
Collection和Map是Java容器中的兩種基本類型. 區別在於容器中每個位置保存的元素個數.Collection每個位置只能保存一個元素,包括List和Set.其中List以進入的順序保存一組元素; 而Set中的元素不能重復.ArrayList是一種List,HashSet是一種Set,將元素添加入任意Collection都可以使用add() 方法.Map保存的是健值對.使用put()為Map添加元素,它需要一個健和一個值作參數.
ArrayList和LinkedList都實現了List介面,ArrayList底層由數組支持LinkedList由雙向鏈表支持,因此,如果經常在表中插入或刪除元素LinkedList比較適合,如果經常查詢ArrayList比較適合.
Set的實現有TreeSet,HashSet,LinkedHashSet,HashSet查詢速度最快,LinkedHashSet保持元素插入次序,TreeSet基於TreeMap,生成一個總是處於排序狀態的Set.
Collection<--List<--Vector
Collection<--List<--ArrayList
Collection<--List<--LinkedList
Collection<--Set<--HashSet
Collection<--Set<--HashSet<--LinkedHashSet
Collection<--Set<--SortedSet<--TreeSet
Vector : 基於Array的List,其實就是封裝了Array所不具備的一些功能方便我們使用,它不可能走入Array的限制。性能也就不可能超越Array。所以,在可能的情況下,我們要多運用Array。另外很重要的一點就是Vector「sychronized」的,這個也是Vector和ArrayList的唯一的區別。
ArrayList:同Vector一樣是一個基於Array上的鏈表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector優越一些,但是當運行到多線程環境中時,可需要自己在管理線程的同步問題。
LinkedList:LinkedList不同於前面兩種List,它不是基於Array的,所以不受Array性能的限制。它每一個節點(Node)都包含兩方面的內容:1.節點本身的數據(data);2.下一個節點的信息(nextNode)。所以當對LinkedList做添加,刪除動作的時候就不用像基於Array的List一樣,必須進行大量的數據移動。只要更改nextNode的相關信息就可以實現了。這就是LinkedList的優勢。
List總結:
1. 所有的List中只能容納單個不同類型的對象組成的表,而不是Key-Value鍵值對。例如:[ tom,1,c ];
2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
3. 所有的List中可以有null元素,例如[ tom,null,1 ];
4. 基於Array的List(Vector,ArrayList)適合查詢,而LinkedList(鏈表)適合添加,刪除操作。
HashSet:雖然Set同List都實現了Collection介面,但是他們的實現方式卻大不一樣。List基本上都是以Array為基礎。但是Set則是在HashMap的基礎上來實現的,這個就是Set和List的根本區別。HashSet的存儲方式是把HashMap中的Key作為Set的對應存儲項。看看HashSet的add(Object obj)方法的實現就可以一目瞭然了。
public boolean add(Object obj)
{
return map.put(obj, PRESENT) == null;
}
這個也是為什麼在Set中不能像在List中一樣有重復的項的根本原因,因為HashMap的key是不能有重復的。
LinkedHashSet:HashSet的一個子類,一個鏈表。
TreeSet:SortedSet的子類,它不同於HashSet的根本就是TreeSet是有序的。它是通過SortedMap來實現的。
Set總結:
1. Set實現的基礎是Map(HashMap);
2. Set中的元素是不能重復的,如果使用add(Object obj)方法添加已經存在的對象,則會覆蓋前面的對象;
http://user.qzone.qq.com/530536333/blog/1283866146
List介面對Collection進行了簡單的擴充,它的具體實現類常用的有ArrayList和LinkedList。你可以將任何東西放到一個List容器中,並在需要時從中取出。ArrayList從其命名中可以看出它是一種類似數組的形式進行存儲,因此它的隨機訪問速度極快,而LinkedList的內部實現是鏈表,它適合於在鏈表中間需要頻繁進行插入和刪除操作。在具體應用時可以根據需要自由選擇。前面說的Iterator只能對容器進行向前遍歷,而ListIterator則繼承了Iterator的思想,並提供了對List進行雙向遍歷的方法。
Set介面也是Collection的一種擴展,而與List不同的時,在Set中的對象元素不能重復,也就是說你不能把同樣的東西兩次放入同一個Set容器中。它的常用具體實現有HashSet和TreeSet類。HashSet能快速定位一個元素,但是你放到HashSet中的對象需要實現hashCode()方法,它使用了前面說過的哈希碼的演算法。而TreeSet則將放入其中的元素按序存放,這就要求你放入其中的對象是可排序的,這就用到了集合框架提供的另外兩個實用類Comparable和Comparator。一個類是可排序的,它就應該實現Comparable介面。有時多個類具有相同的排序演算法,那就不需要在每分別重復定義相同的排序演算法,只要實現Comparator介面即可。集合框架中還有兩個很實用的公用類:Collections和Arrays。Collections提供了對一個Collection容器進行諸如排序、復制、查找和填充等一些非常有用的方法,Arrays則是對一個數組進行類似的操作。
Map是一種把鍵對象和值對象進行關聯的容器,而一個值對象又可以是一個Map,依次類推,這樣就可形成一個多級映射。對於鍵對象來說,像Set一樣,一個Map容器中的鍵對象不允許重復,這是為了保持查找結果的一致性;如果有兩個鍵對象一樣,那你想得到那個鍵對象所對應的值對象時就有問題了,可能你得到的並不是你想的那個值對象,結果會造成混亂,所以鍵的唯一性很重要,也是符合集合的性質的。當然在使用過程中,某個鍵所對應的值對象可能會發生變化,這時會按照最後一次修改的值對象與鍵對應。對於值對象則沒有唯一性的要求。你可以將任意多個鍵都映射到一個值對象上,這不會發生任何問題(不過對你的使用卻可能會造成不便,你不知道你得到的到底是那一個鍵所對應的值對象)。Map有兩種比較常用的實現:HashMap和TreeMap。HashMap也用到了哈希碼的演算法,以便快速查找一個鍵,TreeMap則是對鍵按序存放,因此它便有一些擴展的方法,比如firstKey(),lastKey()等,你還可以從TreeMap中指定一個范圍以取得其子Map。鍵和值的關聯很簡單,用pub(Object key,Object value)方法即可將一個鍵與一個值對象相關聯。用get(Object key)可得到與此key對象所對應的值對象。
㈥ 為什麼Java中Map介面的get函數參數竟然是Object
Collection<String> coll = map.values();
自己查values方法返回值是什麼。
map介面的key-value映射關系中,key或value允許為null由具體實現決定。
put方法必須有個返回值,該返回值用來暗示map容器中是否已存在相同的key。
一般情況,如果key已存在,則替換舊的value並返回它,否則創建映射並返回null。
如果map實現允許value為null,那麼put一個value為null的映射,再次put進相同key的映射,此時返回值必是null,無法得知是否已存在相同的key。相應了這句話「如果該實現支持 null 值,則返回 null 也可能表示此映射以前將 null 與 key 關聯」。