關(guān)于java中遍歷map具體有四種方式,請(qǐng)看下文詳解。
創(chuàng)新互聯(lián)建站成立以來(lái)不斷整合自身及行業(yè)資源、不斷突破觀念以使企業(yè)策略得到完善和成熟,建立了一套“以技術(shù)為基點(diǎn),以客戶需求中心、市場(chǎng)為導(dǎo)向”的快速反應(yīng)體系。對(duì)公司的主營(yíng)項(xiàng)目,如中高端企業(yè)網(wǎng)站企劃 / 設(shè)計(jì)、行業(yè) / 企業(yè)門(mén)戶設(shè)計(jì)推廣、行業(yè)門(mén)戶平臺(tái)運(yùn)營(yíng)、APP應(yīng)用開(kāi)發(fā)、成都手機(jī)網(wǎng)站制作、微信網(wǎng)站制作、軟件開(kāi)發(fā)、鄭州服務(wù)器托管等實(shí)行標(biāo)準(zhǔn)化操作,讓客戶可以直觀的預(yù)知到從創(chuàng)新互聯(lián)建站可以獲得的服務(wù)效果。
1、這是最常見(jiàn)的并且在大多數(shù)情況下也是最可取的遍歷方式,在鍵值都需要時(shí)使用。
MapInteger, Integer map = new?HashMapInteger, Integer();
for?(Map.EntryInteger, Integer entry : map.entrySet()) {
System.out.println("Key = "?+ entry.getKey() + ", Value = "?+ entry.getValue());
}
2、在for-each循環(huán)中遍歷keys或values。
如果只需要map中的鍵或者值,你可以通過(guò)keySet或values來(lái)實(shí)現(xiàn)遍歷,而不是用entrySet。
MapInteger, Integer map = new?HashMapInteger, Integer();
for?(Integer key : map.keySet()) {
System.out.println("Key = "?+ key);
}
for?(Integer value : map.values()) {
System.out.println("Value = "?+ value);
}
該方法比entrySet遍歷在性能上稍好(快了10%),而且代碼更加干凈。
3、使用Iterator遍歷
使用泛型:
MapInteger, Integer map = new?HashMapInteger, Integer();
IteratorMap.EntryInteger, Integer entries = map.entrySet().iterator();
while?(entries.hasNext()) {
Map.EntryInteger, Integer entry = entries.next();
System.out.println("Key = "?+ entry.getKey() + ", Value = "?+ entry.getValue());
}
不使用泛型:
Map map = new?HashMap();
Iterator entries = map.entrySet().iterator();
while?(entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Integer key = (Integer)entry.getKey();
Integer value = (Integer)entry.getValue();
System.out.println("Key = "?+ key + ", Value = "?+ value);
}
4、通過(guò)鍵找值遍歷(效率低)
MapInteger, Integer map = new?HashMapInteger, Integer();
for?(Integer key : map.keySet()) {
Integer value = map.get(key);
System.out.println("Key = "?+ key + ", Value = "?+ value);
}
假設(shè)Map中的鍵值對(duì)為1=11,2=22,3=33,現(xiàn)用方法1來(lái)遍歷Map代碼和調(diào)試結(jié)果如下:
擴(kuò)展資料:
1、HashMap的重要參數(shù)
HashMap 的實(shí)例有兩個(gè)參數(shù)影響其性能:初始容量 和加載因子。容量是哈希表中桶的數(shù)量,初始容量只是哈希表在創(chuàng)建時(shí)的容量。
加載因子 是哈希表在其容量自動(dòng)增加之前可以達(dá)到多滿的一種尺度。當(dāng)哈希表中的條目數(shù)超出了加載因子與當(dāng)前容量的乘積時(shí),則要對(duì)該哈希表進(jìn)行 rehash 操作(即重建內(nèi)部數(shù)據(jù)結(jié)構(gòu)),從而哈希表將具有大約兩倍的桶數(shù)。
在Java編程語(yǔ)言中,加載因子默認(rèn)值為0.75,默認(rèn)哈希表元為101。
2、HashMap的同步機(jī)制
注意,此實(shí)現(xiàn)不是同步的。 如果多個(gè)線程同時(shí)訪問(wèn)一個(gè)哈希映射,而其中至少一個(gè)線程從結(jié)構(gòu)上修改了該映射,則它必須保持外部同步。
(結(jié)構(gòu)上的修改是指添加或刪除一個(gè)或多個(gè)映射關(guān)系的任何操作;以防止對(duì)映射進(jìn)行意外的非同步訪問(wèn),如下:
Map m = Collections.synchronizedMap(new HashMap(...));
參考資料:百度百科-Hashmap
HashMap是Map接口的實(shí)現(xiàn)
public class HashMapK,V
extends AbstractMapK,V
implements MapK,V, Cloneable, Serializable
{
static final int DEFAULT_INITIAL_CAPACITY = 16;
static final int MAXIMUM_CAPACITY = 1 30;
static final float DEFAULT_LOAD_FACTOR = 0.75f;
transient Entry[] table;
transient int size;
int threshold;
final float loadFactor;
transient volatile int modCount;
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity 0)
throw new IllegalArgumentException("Illegal initial capacity: "
initialCapacity);
if (initialCapacity MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor = 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: "
loadFactor);
int capacity = 1;
while (capacity initialCapacity)
capacity = 1;
this.loadFactor = loadFactor;
threshold = (int)(capacity * loadFactor);
table = new Entry[capacity];
init();
}
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR;
threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
table = new Entry[DEFAULT_INITIAL_CAPACITY];
init();
}
public HashMap(Map? extends K, ? extends V m) {
this(Math.max((int) (m.size() / DEFAULT_LOAD_FACTOR) 1,
DEFAULT_INITIAL_CAPACITY), DEFAULT_LOAD_FACTOR);
putAllForCreate(m);
}
....
一下省略 --~
1、面向接口(DAO)編程,接口的實(shí)現(xiàn)。
構(gòu)建User.java實(shí)體類(lèi),構(gòu)建UserImpl.java類(lèi),實(shí)現(xiàn)UserDao接口,構(gòu)建MapDal.java,模擬數(shù)據(jù)庫(kù),Main.java模擬UI,UI只調(diào)用UserImpl,UserImpl調(diào)用MapDal。
main.java
package?baidu.zhidao;
import?java.util.*;
/**
*?Main?主方法
*?@author?bufei
*
*/
public?class?Main?{
public?static?void?main(String[]?args)?{
int?userNum?=?9;
//?定義UserList
ListUser?list?=?new?ArrayListUser();
for?(int?i?=?0;?i??userNum;?i++)?{
User?user?=?new?User();
user.setPassWord("passWord"?+?i);
user.setUserName("userName"?+?i);
list.add(user);
}
//?實(shí)例化UserImpl
UserImpl?userImpl?=?new?UserImpl(list);
//?用戶?張三?是否存在
String?userName?=?"張三";
String?passWord?=?"passWord";
User?user?=?new?User();
user.setUserName(userName);
user.setPassWord(passWord);
System.out.println("-?-?-?baiduDemo?-?-?-");
//?1、isExist(user)
System.out.println("查找用戶?"?+?userName?+?"...");
if?(userImpl.isExist(user))?{
System.out.println(userName?+?"?存在!");
}?else?{
System.out.println(userName?+?"?不存在!");
}
//?2、addUser
System.out.println("添加用戶?"?+?userName?+?",psw=?"?+?passWord?+?"?...");
userImpl.addUser(user);
//?3、changePassword(userName)
System.out.println("修改密碼...");
passWord?=?"zhangsanpasword";
if?(userImpl.changePassword(userName,?passWord))?{
System.out.println("修改成功!");
}?else?{
System.out.println("用戶不存在!");
}
//??4?selectAll()
list?=?userImpl.selectAll();
System.out.println("獲取全部User:");
for?(User?userItem?:?list)?{
System.out.println(userItem.getUserName()?+?","?+?userItem.getPassWord());
}
}
}
UserImpl.java
package?baidu.zhidao;
import?java.util.*;
/**
*?UserDao接口實(shí)現(xiàn)
*?@author?bufei
*
*/
public?class?UserImpl?implements?UserDao?{
private?MapDal?mapDal;
/**
*?構(gòu)造器,初始化Map數(shù)據(jù)庫(kù)
*/
public?UserImpl(ListUser?list)?{
mapDal?=?new?MapDal(list);
}
/**
*?1.判斷某個(gè)user是否存在
*?@param?user?用戶對(duì)象
*?@return?返回true/false用戶是否存在
*/
public?boolean?isExist(User?user)?{
boolean?rs?=?false;
rs?=?mapDal.isExist(user);
return?rs;
}
/**
*?2.添加User
*?題目所給void?返回類(lèi)型不合理
*?@param?user
*
*?*/
public?void?addUser(User?user)?{
if?(mapDal.addUser(user))?{
System.out.println("添加完成!");
}?else?{
System.out.println("添加失敗!");
}
}
/**
*?3.根據(jù)username修改password
*?@param?username
*?@param?password
*?@return?成功與否
*?*/
public?boolean?changePassword(String?userName,?String?password)?{
boolean?rs?=?false;
User?user?=?new?User();
user.setUserName(userName);
user.setPassWord(password);
rs?=?mapDal.changePassword(user);
return?rs;
}
/**
*?根據(jù)用戶對(duì)象修改密碼
*?@param?user
*?@return
*/
public?boolean?changePassword(User?user)?{
return?mapDal.changePassword(user);
}
/**
*?4.得到所有的User,用List封裝
*?@return?從數(shù)據(jù)庫(kù)查詢到所有的User
*?*/
public?ListUser?selectAll()?{
return?mapDal.selectAll();
}
}
MapDal.java
package?baidu.zhidao;
import?java.util.*;
/**
*?MapDml?用map模擬數(shù)據(jù)庫(kù),初始化生成一些User
*?單例模式,避免數(shù)據(jù)不同步
*?@author?bufei
*
*/
public?class?MapDal?{
/**?list中存map,實(shí)在繞得很,直接存User也是可以?*/
public?static?ListMapString,?String?userMapList?=?new?ArrayListMapString,?String();
/**
*?初始化,有參構(gòu)造器
*?構(gòu)造Map??map,存儲(chǔ)全部的userName,passWord,模擬數(shù)據(jù)庫(kù)
*
*/
public?MapDal(ListUser?list)?{
for?(User?user?:?list)?{
Map?userMap?=?new?HashMapString,?String();
userMap.put(user.getUserName(),?user.getPassWord());
userMapList.add(userMap);
}
}
/**
*?無(wú)參構(gòu)造器
*?*/
public?MapDal()?{
}
/**
*
*?@param?user
*?@return
*/
public?boolean?isExist(User?user)?{
boolean?rs?=?false;
//遍歷userMapList?查找用戶是否存在
for?(MapString,?String?map?:?userMapList)?{
//?找到該map
if?(map.get(user.getUserName())?!=?null)?{
rs?=?true;
}
}
return?rs;
}
/**
*?addUser,userName已存在則無(wú)法加入
*?@param?user
*?@return?boolean
*/
public?boolean?addUser(User?user)?{
boolean?rs?=?false;
//遍歷userMapList?查找用戶是否存在
for?(MapString,?String?map?:?userMapList)?{
//?找到該map,已經(jīng)存在,無(wú)法添加
if?(map.get(user.getUserName())?!=?null)?{
return?rs;
}
}
if?(!rs)?{
MapString,?String?userMap?=?new?HashMapString,?String(8);
userMap.put(user.getUserName(),?user.getPassWord());
userMapList.add(userMap);
rs?=?true;
}
return?rs;
}
/**
*?deleteUser
*?@return
*/
public?boolean?deleteUser()?{
boolean?rs?=?false;
return?rs;
}
/**
*?changePassword
*?@param?user
*?@return
*/
public?boolean?changePassword(User?user)?{
boolean?rs?=?false;
//?定義遍歷索引
int?i?=?0;
//遍歷userMapList?查找用戶是否存在
for?(MapString,?String?map?:?userMapList)?{
//?找到該map,remove,再次存入新的
if?(map.get(user.getUserName())!=null)?{
userMapList.remove(i);
//hashmap?初試默認(rèn)值?0.75-16
Map?userMap?=?new?HashMapString,?String(8);
userMap.put(user.getUserName(),?user.getPassWord());
userMapList.add(userMap);
rs?=?true;
}
i++;
}
return?rs;
}
/**
*?selectAll()
*
*?@return?返回全體user
*/
public?ListUser?selectAll()?{
ListUser?list?=?new?ArrayListUser();
//遍歷map
for?(MapString,?String?userMap?:?userMapList)?{
User?user?=?new?User();
//map訪問(wèn)需要使用Map.Entry
//entry?需要Set.iterator().next()
Set?entriSet?=?userMap.entrySet();
IteratorMap.EntryString,?String?iterator?=?entriSet.iterator();
if?(iterator.hasNext())?{
//?此時(shí)entry?是?Object
Map.EntryString,?String?entry?=?iterator.next();
user.setUserName(entry.getKey().toString());
user.setPassWord(entry.getValue().toString());
list.add(user);
}
}
return?list;
}
}
2、運(yùn)行效果