午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁技術文章
文章詳情頁

Java優化for循環嵌套的高效率方法

瀏覽:21日期:2022-08-24 16:51:47

前幾天有人問過我一個問題,就是兩個嵌套for循環執行效率的問題,問有什么好的辦法替換。當時我想了想,實在想不起來,哎,慚愧!!! 請教了答案,恍然大悟。

比如:兩個list中分別裝有相同的對象數據。 list1中有3萬條對象數據。 list2中有2萬條對象數據(但是對象中的某個屬性變量為空)。兩個list中的id或者其他變量都一模一樣。請用最快的方式找出list2中變量為空的那個對象,并且去list1中找出id相同的對象。 或者可以理解成,從list2中找出變量為空的,去list1中找出對應的對象,然后把為空的列補上。總之就是這么一個意思,先 for 循環 list2,判斷一下每個對象的那個屬性變量是否為空,如果為空,再去for循環list1,找出id一樣的對象,就算執行成功了。

那么請看下邊的for循環嵌套的解決方式:

for(Member m2:list2){ if(m2.getName()==null){ for(Member m1:list1){ if(m1.getId().intValue()==m2.getId().intValue()){ System.out.println(m2.getId()+' Name 值為空!!!'); } } }}

這樣真的好嗎? 如果有上萬,甚至十幾萬的數據,那么這個執行效率問題,我就不多說了。 非常非常的慢。

下邊來看使用map代替的執行方式,以及兩種方式的效率對比:

import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.concurrent.TimeUnit; class Member { private Integer id; private String name; private Integer age; private Date addDate; public Member() { } public Member(Integer id, String name, Integer age, Date addDate) { super(); this.id = id; this.name = name; this.age = age; this.addDate = addDate; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getAddDate() { return addDate; } public void setAddDate(Date addDate) { this.addDate = addDate; } } public class For2 { public static void main(String[] args) throws InterruptedException { List<Member> list1 = new ArrayList<>(); List<Member> list2 = new ArrayList<>(); for(int i=0;i<30000;i++){ Date date = new Date(); list1.add(new Member((i+1),'技術客',(i+1), date)); if(i%2==0){ list2.add(new Member((i+1),null,(i+1), date)); } } //雙for循環嵌套測試 long s1 = System.currentTimeMillis(); int forNumber = 0; for(Member m2:list2){ if(m2.getName()==null){ for(Member m1:list1){ if(m1.getId().intValue()==m2.getId().intValue()){// System.out.println(m2.getId()+' Name 值為空!!!'); forNumber++; } } } } long s2 = System.currentTimeMillis(); System.out.println('雙for循環查詢時間為:'+(s2-s1)+'(毫秒),一共查詢出'+forNumber+'條數據 nnn'); TimeUnit.SECONDS.sleep(3); //map查詢測試 long s3 = System.currentTimeMillis(); int mapNumber = 0; Map<Integer, Member> map = new HashMap<>(); for(Member m1:list1){ map.put(m1.getId(), m1); } for(Member m2:list2){ if(m2.getName()==null){ Member m = map.get(m2.getId()); if(m!=null){// System.out.println(m2.getId()+' Name 值為空!!!'); mapNumber++; } } } long s4 = System.currentTimeMillis(); System.out.println('使用map結構查詢時間為:'+(s4-s3)+'(毫秒),一共查詢出'+mapNumber+'條數據 nnn'); } }

輸出結果:

雙for循環查詢時間為:1578(毫秒),一共查詢出15000條數據 使用map結構查詢時間為:14(毫秒),一共查詢出15000條數據

如果我們模擬10萬條數據,然后其中五千條重復數據的情況下:效率更是天壤之別。

看輸出結果:

雙for循環查詢時間為:30929(毫秒),一共查詢出50000條數據 使用map結構查詢時間為:24(毫秒),一共查詢出50000條數據

循環數據越小,兩者差別也就越小,但是數據量越大,差別也就越大。 10萬條數據的差別竟然達到上千倍!

以上就是Java優化for循環嵌套的高效率方法的詳細內容,更多關于Java 優化 for循環的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 日韩有码一区二区三区 | 在线黄| 四虎成人精品永久免费av九九 | av在线首页| 国产在线二区 | av在线免费观看不卡 | 丝袜综合网 | 久久久一级片 | 欧美片在线观看 | 国产精品久久久久久中文字 | 成人拍拍拍 | 亚洲白浆 | 国产成人精品123区免费视频 | 欧美亚洲国产另类 | 欧美激情一二三区 | 国产免费一区二区三区四在线播放 | 成人福利午夜 | 青久久| 国产精品羞羞答答 | 午夜视频在线观看一区二区 | 亚洲天堂中文在线 | av一区三区 | 精品一区二区三区免费视频 | 欧美在线亚洲 | 久久午夜影院 | 日本天堂在线 | 日韩专区在线观看 | 人人看人人插 | 日韩午夜免费 | 久久综合九色 | 日韩在线视频看看 | 国产一区在线免费观看 | 午夜免费网址 | 欧美视频一区二区在线 | 久久久在线 | 免费在线观看黄 | 中文字幕亚洲第一 | 超碰免费成人 | 日韩a√| 色国产精品 | 黄色国产在线 |