一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 深入了解java8的foreach循環(huán)

深入了解java8的foreach循環(huán)

2020-11-02 17:41已往之不諫 Java教程

雖然java8出來很久了,但是之前用的一直也不多,最近正好學(xué)習(xí)了java8。下面給大家分享java8中的foreach循環(huán),感興趣的朋友一起看看吧

雖然java8出來很久了,但是之前用的一直也不多,最近正好學(xué)習(xí)了java8,推薦一本書還是不錯(cuò)的<寫給大忙人看的javase8>。因?yàn)閷W(xué)習(xí)了java8,所以只要能用到的地方都會(huì)去用,尤其是java8的stream,感覺用起來覺得很方便,因?yàn)辄c(diǎn)點(diǎn)點(diǎn)就出來了,而且代碼那么簡潔?,F(xiàn)在開始慢慢深入了解java8,發(fā)現(xiàn)很多東西不能看表面。

  比如常規(guī)遍歷一個(gè)集合,下面給出例子:

1.首先遍歷一個(gè)list

方式1.一開始是這樣的:

?
1
2
3
4
5
public static void test1(list<string> list) {
 for (int i = 0; i < list.size(); i++) {
  system.out.println(list.get(i));
 }
}

方式2.當(dāng)然稍微高級(jí)一點(diǎn)的是這樣:

?
1
2
3
4
5
public static void test2(list<string> list) {
 for (int i = 0,lengh=list.size(); i < lengh; i++) {
  system.out.println(list.get(i));
 }
}

方式3.還有就是iterator遍歷:

?
1
2
3
4
5
6
public static void test3(list<string> list) {
 iterator<string> iterator = list.iterator();
 while(iterator.hasnext()){
  system.out.println(iterator.next());
 }
}

方式4.后來有了增強(qiáng)for循環(huán)

?
1
2
3
4
5
public static void test4(list<string> list) {
 for(string str:list){
  system.out.println(str);
 }
}

方式5.java8以后新增的方式:

?
1
2
3
4
5
6
public static void test5(list<string> list) {
 //list.foreach(system.out::println);和下面的寫法等價(jià)
 list.foreach(str->{
  system.out.println(str);
 });
}

方式6.還有另一種:

?
1
2
3
4
5
public static void test6(list<string> list) {
 list.iterator().foreachremaining(str->{
  system.out.println(str);
 });
}

  應(yīng)該沒有其他的了吧,上面六中方法,按我的使用習(xí)慣5最常用,4偶爾使用,其他的基本就不怎么用了,使用5的原因是因?yàn)榉奖銜鴮?,提示就可以寫出來,偶爾使?的原因是,5不方便計(jì)數(shù)用,下面進(jìn)行性能測(cè)試,string不具備代表性,決定使用對(duì)象,簡單的一個(gè)測(cè)試類如下:

  一個(gè)簡單的測(cè)試,內(nèi)容不要太在意,簡單計(jì)算hashcode:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package test;
import java.util.arraylist;
import java.util.iterator;
import java.util.list;
public class test8 {
 public static void main(string[] args) {
  list<dog> list=new arraylist<>();
  for(int i=0;i<10;i++){
   list.add(new dog(i,"dog"+i));
  }
  long nanotime = system.nanotime();
  test1(list);
  long nanotime1 = system.nanotime();
  test2(list);
  long nanotime2 = system.nanotime();
  test3(list);
  long nanotime3 = system.nanotime();
  test4(list);
  long nanotime4 = system.nanotime();
  test5(list);
  long nanotime5 = system.nanotime();
  test6(list);
  long nanotime6 = system.nanotime();
  system.out.println((nanotime1-nanotime)/1000000.0);
  system.out.println((nanotime2-nanotime1)/1000000.0);
  system.out.println((nanotime3-nanotime2)/1000000.0);
  system.out.println((nanotime4-nanotime3)/1000000.0);
  system.out.println((nanotime5-nanotime4)/1000000.0);
  system.out.println((nanotime6-nanotime5)/1000000.0);
 }
public static void test1(list<dog> list) {
 for (int i = 0; i < list.size(); i++) {
  list.get(i).hashcode();
 }
}
public static void test2(list<dog> list) {
 for (int i = 0,lengh=list.size(); i < lengh; i++) {
  list.get(i).hashcode();
 }
}
public static void test3(list<dog> list) {
 iterator<dog> iterator = list.iterator();
 while(iterator.hasnext()){
  iterator.next().hashcode();
 }
}
public static void test4(list<dog> list) {
 for(dog dog:list){
  dog.hashcode();
 }
}
public static void test5(list<dog> list) {
 //list.foreach(system.out::println);和下面的寫法等價(jià)
 list.foreach(dog->{
  dog.hashcode();
 });
}
public static void test6(list<dog> list) {
 list.iterator().foreachremaining(dog->{
  dog.hashcode();
 });
}
}
class dog{
 private int age;
 private string name;
 public dog(int age, string name) {
  super();
  this.age = age;
  this.name = name;
 }
 public int getage() {
  return age;
 }
 public void setage(int age) {
  this.age = age;
 }
 public string getname() {
  return name;
 }
 public void setname(string name) {
  this.name = name;
 }
 @override
 public string tostring() {
  return "dog [age=" + age + ", name=" + name + "]";
 }
}

  運(yùn)行三次取平均值,機(jī)器配置就不說了,因?yàn)槲也皇潜容^的絕對(duì)值,我是比較的這幾種方式的相對(duì)值,數(shù)據(jù)結(jié)果,趨勢(shì)圖如下:

深入了解java8的foreach循環(huán)

  然后去掉表現(xiàn)一直很穩(wěn)定的方式5和百萬級(jí)數(shù)據(jù)量以上的數(shù)據(jù),來分析結(jié)果:

深入了解java8的foreach循環(huán)

  可以得出一個(gè)非常嚇人的結(jié)果,java8的foreach每次循環(huán)的耗時(shí)竟然高達(dá)100毫秒以上,雖然它比較穩(wěn)定(算是優(yōu)點(diǎn)吧)。所以得出以下結(jié)論:

  在正常使用(數(shù)據(jù)量少于百萬以下),正常(非并行)遍歷一個(gè)集合的時(shí)候:

•不要使用java8的foreach,每次耗時(shí)高達(dá)100毫秒以上

•提前計(jì)算出大小的普通for循環(huán),耗時(shí)最小,但是書寫麻煩

•增強(qiáng)for循環(huán)表現(xiàn)良好

2.再次遍歷一個(gè)set

  使用以相同的方式測(cè)試hashset,測(cè)試方法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package test;
import java.util.hashset;
import java.util.iterator;
import java.util.set;
public class test9 {
 public static void main(string[] args) {
  set<dog> set = new hashset<>();
  for (int i = 0; i < 10_000_000; i++) {
   set.add(new dog(i, "dog" + i));
  }
  long nanotime = system.nanotime();
  test1(set);
  long nanotime1 = system.nanotime();
  test2(set);
  long nanotime2 = system.nanotime();
  test3(set);
  long nanotime3 = system.nanotime();
  test4(set);
  long nanotime4 = system.nanotime();
  system.out.println((nanotime1 - nanotime) / 1000000.0);
  system.out.println((nanotime2 - nanotime1) / 1000000.0);
  system.out.println((nanotime3 - nanotime2) / 1000000.0);
  system.out.println((nanotime4 - nanotime3) / 1000000.0);
 }
 public static void test1(set<dog> list) {
  iterator<dog> iterator = list.iterator();
  while (iterator.hasnext()) {
   iterator.next().hashcode();
  }
 }
 public static void test2(set<dog> list) {
  for (dog dog : list) {
   dog.hashcode();
  }
 }
 public static void test3(set<dog> list) {
  list.foreach(dog -> {
   dog.hashcode();
  });
 }
 public static void test4(set<dog> list) {
  list.iterator().foreachremaining(dog -> {
   dog.hashcode();
  });
 }
}

  經(jīng)過計(jì)算得出如下結(jié)果:

深入了解java8的foreach循環(huán)

  不難發(fā)現(xiàn),java8的foreach依然每次耗時(shí)100ms以上,最快的變成了增強(qiáng)for循環(huán),iterator遍歷和java8的iterator().foreachremaining差不多。

3.最后遍歷map

  依然使用相同的方式測(cè)試map集合遍歷,測(cè)試類如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package test;
import java.util.hashmap;
import java.util.iterator;
import java.util.map;
import java.util.set;
public class test10 {
 public static void main(string[] args) {
  map<string, dog> map = new hashmap<>();
  for (int i = 0; i < 1000_000; i++) {
   map.put("dog" + i, new dog(i, "dog" + i));
  }
  long nanotime = system.nanotime();
  test1(map);
  long nanotime1 = system.nanotime();
  test2(map);
  long nanotime2 = system.nanotime();
  test3(map);
  long nanotime3 = system.nanotime();
  test4(map);
  long nanotime4 = system.nanotime();
  system.out.println((nanotime1 - nanotime) / 1000000.0);
  system.out.println((nanotime2 - nanotime1) / 1000000.0);
  system.out.println((nanotime3 - nanotime2) / 1000000.0);
  system.out.println((nanotime4 - nanotime3) / 1000000.0);
 }
 public static void test1(map<string, dog> map) {
  iterator<map.entry<string, dog>> entries = map.entryset().iterator();
  while (entries.hasnext()) {
   map.entry<string, dog> entry = entries.next();
   int code=entry.getkey().hashcode()+entry.getvalue().hashcode();
  }
 }
 public static void test2(map<string, dog> map) {
  for (map.entry<string, dog> entry : map.entryset()) {
   int code=entry.getkey().hashcode()+entry.getvalue().hashcode();
  }
 }
 public static void test3(map<string, dog> map) {
  for (string key : map.keyset()) {
   int code=key.hashcode()+map.get(key).hashcode();
  }
 }
 public static void test4(map<string, dog> map) {
  map.foreach((key, value) -> {
   int code=key.hashcode()+value.hashcode();
  });
 }
}

  結(jié)果如下:

深入了解java8的foreach循環(huán)

  java8的foreach依然不負(fù)眾望,最快的是增強(qiáng)for循環(huán)。

最終結(jié)論

    普通(數(shù)量級(jí)10w以下,非并行)遍歷一個(gè)集合(list、set、map)如果在意效率,不要使用java8的foreach,雖然它很方便很優(yōu)雅

    任何時(shí)候使用增強(qiáng)for循環(huán)是你不二的選擇

以上所述是小編給大家介紹的java8的foreach循環(huán) ,希望對(duì)大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!

原文鏈接:http://www.cnblogs.com/yiwangzhibujian/p/6919435.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产日韩欧美综合一区二区三区 | 91av导航| 日韩免费一级毛片 | 息与子中文字幕bd | 欧美国产精品 | 日本韩国无矿砖码 | 国产激情视频网站 | 草草草视频在线观看 | 四虎影院在线免费 | 99视频在线国产 | 男女拍拍拍免费视频网站 | 亚洲欧洲日产v特级毛片 | 国产精品人人视频 | 日本艳鉧动漫1~6在线观看 | 99热最新| 毛片资源站| 和肥岳在厨房激情 | 美女张开腿让男人桶的 视频 | 午夜宅男网| 三级伦理在线播放 | 猫影视tv接口 | 欧美色图日韩色图 | 大肥臀风间由美 中文字幕 大东北chinesexxxx露脸 | 国产欧美日韩专区毛茸茸 | 色老板在线免费观看 | 国产一区二区三区久久精品小说 | 国产全部理论片线观看 | 视频在线观看大片 | 欧美日韩国产在线人成 | 污污的动态图合集 | 91精品国产高清久久久久 | 日韩欧美成末人一区二区三区 | 亚洲欧洲色图 | 欧美成人手机 | 日韩视频第二页 | 人与动人物性行为zozo共患病 | 欧美一区二区三区大片 | 欧美gay xxxx| 俄罗斯三级完整版在线观看 | 国产精品日韩在线观看 | 久久这里都是精品 |