關(guān)于java中遍歷map具體有四種方式,請(qǐng)看下文詳解。
成都創(chuàng)新互聯(lián)長(zhǎng)期為上千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為坪山企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè),坪山網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
1、這是最常見的并且在大多數(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中的鍵或者值,你可以通過keySet或values來實(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、通過鍵找值遍歷(效率低)
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來遍歷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編程語言中,加載因子默認(rèn)值為0.75,默認(rèn)哈希表元為101。
2、HashMap的同步機(jī)制
注意,此實(shí)現(xiàn)不是同步的。 如果多個(gè)線程同時(shí)訪問一個(gè)哈希映射,而其中至少一個(gè)線程從結(jié)構(gòu)上修改了該映射,則它必須保持外部同步。
(結(jié)構(gòu)上的修改是指添加或刪除一個(gè)或多個(gè)映射關(guān)系的任何操作;以防止對(duì)映射進(jìn)行意外的非同步訪問,如下:
Map m = Collections.synchronizedMap(new HashMap(...));
參考資料:百度百科-Hashmap
二維數(shù)組定義:數(shù)據(jù)類型[][] 數(shù)組名 = new 數(shù)據(jù)類型[二維數(shù)組行數(shù)][二維數(shù)組列數(shù)]
如:int[] array = new int[5][4];
二維數(shù)組的遍歷:需要使用兩個(gè)變量來分別遍歷行和列,具體遍歷方法就很多啦,可以使用while語句、do-while語句、for語句,也可以相互結(jié)合使用。
如:
int?i?=?0,?j?=?0;
for(int?i?=?0;?i??array.length;?i++){
for(int?j?=?0;?j??array[i].length;?j++){
System.out.println(array[i][j]?+?"、");
}
System.out.println("");
}
Java遍歷一個(gè)字符串的每一個(gè)字母
String str = "asdfghjkl";
方法1:
for(int i=0;istr.length();i++){
char ch = string.charAt(i);
}
方法2:
char[] c=s.toCharArray();
for(char cc:c){
...//cc直接用了
}
方法3:
for(int i=0;istr.length();i++){
String subStr = str.substring(i, i+1)
}
擴(kuò)展資料:
Java是一門面向?qū)ο缶幊陶Z言,不僅吸收了C++語言的各種優(yōu)點(diǎn),還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強(qiáng)大和簡(jiǎn)單易用兩個(gè)特征。Java語言作為靜態(tài)面向?qū)ο缶幊陶Z言的代表,極好地實(shí)現(xiàn)了面向?qū)ο罄碚摚试S程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程 。
Java具有簡(jiǎn)單性、面向?qū)ο蟆⒎植际?、健壯性、安全性、平臺(tái)獨(dú)立與可移植性、多線程、動(dòng)態(tài)性等特點(diǎn) 。Java可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等 。
參考資料:百度百科:JAVA
目錄結(jié)構(gòu)為樹型結(jié)構(gòu),用多線程不大好做,線程最多在前幾層進(jìn)行分割,比如每個(gè)目錄下有兩個(gè)目錄,共5層,那么root目錄下就能啟用2個(gè)線程分別進(jìn)行遍歷,所以第二層就啟動(dòng)了2個(gè)線程進(jìn)行遍歷,加上主線程共三個(gè)線程,雖然這樣做是可以做,但是要更具實(shí)際情況進(jìn)行線程的規(guī)劃,否則容易線程過多導(dǎo)致cpu超負(fù)荷,或者假死,再提一點(diǎn),遍歷目錄不建議用遞歸來寫,因?yàn)槟夸涊^多容易棧溢出。
隨手寫了個(gè),會(huì)有點(diǎn)bug就是關(guān)閉線程池的時(shí)候,還有就是有可能目錄太多進(jìn)入拒絕策略,這個(gè)東西 可以考慮使用令牌桶算法,或者計(jì)數(shù)器算法來做。這里提供個(gè)簡(jiǎn)單的例子。
public class TraverseUtil {
public static BlockingQueue blockingQueue = new LinkedBlockingQueue(100);
public static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(100,100,10, TimeUnit.SECONDS,blockingQueue);
public static void traverseFolder2(String path) {
File file = new File(path);
if (file.exists()) {
File[] files = file.listFiles();
if (null == files || files.length == 0) {
System.out.println("文件夾是空的!");
return;
} else {
for (File file2 : files) {
if (file2.isDirectory()) {
System.out.println("文件夾:" + file2.getAbsolutePath());
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
traverseFolder2(file2.getAbsolutePath());
}
});
} else {
System.out.println("文件:" + file2.getAbsolutePath());
}
}
}
} else {
System.out.println("文件不存在!");
}
}
public static void main(String[] args) throws InterruptedException {
traverseFolder2("C:\\Users\\a8932\\Desktop\\md");
}
}
這是一個(gè)表查找,查找表中與customer相等的數(shù)據(jù)。這個(gè)表有[customer,name,phone,....]等字段
這個(gè)可以使用遞歸來實(shí)現(xiàn),具體代碼如下:
import java.io.File;
public class Demo {
public static void main(String[] args) {
File file = new File("C:\\");// 指定
文件目錄
method(file);
}
public static void method(File file) {
File[] fs = file.listFiles();// 得到File數(shù)組
if(fs!=null) {// 判斷fs是否為null
for(File f : fs) {
if(f.isFile()) {// 如果是文件直接輸出
System.out.println(f.getName());
} else {
method(f);// 否則
遞歸調(diào)用
}
}
}
}
}