1 packagecnom.test.testUtils;2
3 importjava.io.Serializable;4 importjava.util.ArrayList;5 importjava.util.Collections;6 importjava.util.Comparator;7 importjava.util.Iterator;8 importjava.util.List;9 importjava.util.Random;10
11 public classTestCollectionsSort {12
13 public static void main(String[] args) throwsInterruptedException {14 TestCollectionsSort test = newTestCollectionsSort();15
16 List list = new ArrayList();17 TestSortModel model = null;18 for (int i = 0; i < 80000; i++) {19 model = test.newTestSortModel();20 int intId = (int) (Math.random() * 100);21 model.setIntId(intId);22 model.setName("tes" +i);23 list.add(model);24 }25 //JAVA8 使用Comparator排序26 //list.sort(Comparator.comparing(TestSortModel::getIntId,27 //Comparator.nullsLast(Comparator.naturalOrder())));
28
29 List resList = new ArrayList();30
31 long t1 =System.currentTimeMillis();32 for(TestSortModel tsm : list) {33 int id =tsm.getIntId();34 //Thread.sleep(1);
35 resList.add(tsm.getName());36 }37 System.out.println("增强for循环 遍历耗时:" + (System.currentTimeMillis() - t1) + ";list.size()="
38 + list.size() + ";list=" +resList.toString());39 resList.clear();40
41 long t2 =System.currentTimeMillis();42 for (int i = 0; i < list.size(); i++) {43 int id =list.get(i).getIntId();44 //Thread.sleep(1);
45 resList.add(list.get(i).getName());46 }47 System.out.println("for循环 遍历耗时:" + (System.currentTimeMillis() - t2) + ";list.size()="
48 + list.size() + ";list=" +resList.toString());49 resList.clear();50
51 long t3 =System.currentTimeMillis();52 Iterator it =list.iterator();53 TestSortModel tm = null;54 while(it.hasNext()) {55 tm =it.next();56 int id =tm.getIntId();57 //Thread.sleep(1);
58 resList.add(tm.getName());59 }60 System.out.println("iterator 遍历耗时:" + (System.currentTimeMillis() - t3) + ";list.size()="
61 + list.size() + ";list=" +resList.toString());62 resList.clear();63
64 //parallerlStream遍历,适用于处理比较耗时的业务逻辑。65 //注意:若在遍历中将元素添加到另一个list,则这个list必须是线程安全的,否则遍历过程中会出现两种情况:66 //1.这个list中的元素会有丢失的情况; 2.遍历中会抛出:ArrayIndexOutOfBoundsException
67 List listt = Collections.synchronizedList(new ArrayList());68 long t4 =System.currentTimeMillis();69 list.parallelStream().forEach(tsm -> {//若是 forEachOrdered会保持原来list顺序
70 int id =tsm.getIntId();71 //listt.add(tsm);//输出的listt会有元素丢失,线程安全的list则不会
72 try{73 //Thread.sleep(1);
74 resList.add(tsm.getName());//输出的resList也会有元素丢失
75 } catch(Exception e) {76 e.printStackTrace();77 }78 });79 System.out80 .println("list.parallelStream().forEach() 遍历耗时:" + (System.currentTimeMillis() -t4)81 + ";list.size()=" + resList.size() + ";list=" +resList.toString());82 resList.clear();83
84 long t5 =System.currentTimeMillis();85 list.stream().forEach(tsm -> {//串行执行,与for循环效率相似,代码精简
86 int id =tsm.getIntId();87 try{88 //Thread.sleep(1);
89 resList.add(tsm.getName());90 } catch(Exception e) {91 //TODO Auto-generated catch block
92 e.printStackTrace();93 }94 });95 System.out.println("list.stream().forEach() 遍历耗时:" + (System.currentTimeMillis() -t5)96 + ";list.size()=" + list.size() + ";list=" +resList.toString());97 resList.clear();98
99 long t6 =System.currentTimeMillis();100 list.forEach(tsm -> {//精简代码,与for循环效率相似
101 int id =tsm.getIntId();102 try{103 //Thread.sleep(1);
104 resList.add(tsm.getName());105 } catch(Exception e) {106 //TODO Auto-generated catch block
107 e.printStackTrace();108 }109 });110 System.out.println("list.forEach() 遍历耗时:" + (System.currentTimeMillis() -t6)111 + ";list.size()=" + list.size() + ";list=" +resList.toString());112 resList.clear();113
114 /**
115 * for loop1 增强for循环 遍历耗时:80051116 * for loop2 for循环 遍历耗时:80032117 * iterator 遍历耗时:80069118 * list.parallelStream().forEach() 遍历耗时:20101 多线程环境下,执行耗时的业务逻辑时使用效率更好。119 * list.stream().forEach() 遍历耗时:80049 精简代码120 * list.forEach() 遍历耗时:80031121 */
122
123 }124
125 public class TestSortModel implementsSerializable {126
127 private static final long serialVersionUID = -890909910704287938L;128
129 private longlongId;130
131 private intintId;132
133 privateString name;134
135 public longgetLongId() {136 returnlongId;137 }138
139 public void setLongId(longlongId) {140 this.longId =longId;141 }142
143 public intgetIntId() {144 returnintId;145 }146
147 public void setIntId(intintId) {148 this.intId =intId;149 }150
151 publicString getName() {152 returnname;153 }154
155 public voidsetName(String name) {156 this.name =name;157 }158
159 }160 }