项目基本完工(PS:最起码指派给我的部分,我和前端对接联调完了,指派的bug也修复了)
我想着优化一下我的代码,提高一点代码运行效率,最后就找到了这个ArrayList哪种遍历最快
好家伙说好的for循环呢?吹了半天的for循环在,JDK8面前就这?
我模仿着也写了一遍这个测试代码,for循环在真相面前被安排的服服帖帖,
jdk8应该是主流的版本了吧,forEach雄起!!!!!!
public class ArrayListMain {
public static void main(String[] args) {
List<Integer>integers = Arrays.asList(10,100,1000,10000,30000,100000,1000000);
for(Integer size:integers){
testRand(size);
}
}
private static void testRand(int size) {
System.out.println("-----------次数:" + size + "------------");
List<String> list = createTestList(size);
// 随机访问通过索引值去遍历。
long time1 = System.nanoTime();
testFor(list);
long time2 = System.nanoTime();
// 增强for循环
testForEnhance(list);
long time3 = System.nanoTime();
// 迭代器遍历
testIterator(list);
long time4 = System.nanoTime();
// forEach + lambda
testForEach(list);
long time5 = System.nanoTime();
System.out.println("随机访问\t\t" + (time2 - time1) / 1000 + " ms");
System.out.println("增强for遍历\t\t" + (time3 - time2) / 1000 + " ms");
System.out.println("迭代器遍历\t\t" + (time4 - time3) / 1000 + " ms");
System.out.println("forEach遍历\t\t" + (time5 - time4) / 1000 + " ms");
System.out.println();
}
/**
* 测试 for循环测试效率
*
* @param list 列表
*/
public static void testFor(List<String> list){
for(int i=0,length=list.size();i<length;i++){
//hashCode 返回调用这个方法的元素的哈希码
list.get(i).hashCode();
}
}
/**
* 测试增强for循环的效率
*
* @param list 列表
*/
public static void testForEnhance(List<String>list){
for(String sa:list){
sa.hashCode();
}
}
/**
* 测试foreach循环效率
*
* @param list 列表
*/
public static void testForEach(List<String>list){
list.forEach(sa->{
sa.hashCode();
});
}
/**
* 测试迭代器循环效率
*
* @param list 列表
*/
public static void testIterator(List<String>list){
Iterator<String> iterator = list.iterator();
//hasNext查看迭代器当前是否有值,有的话返回一个true
while(iterator.hasNext()){
//next方法取出下一个值
iterator.next().hashCode();
}
}
public static List<String> createTestList(int size) {
List<String> list = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
list.add(UUID.randomUUID().toString());
}
return list;
}
}
代码和人家的没啥区别我自己加了一些注释方便看。(PS:注释是个好东西,大家可以直接直接下载一个插件然后设置自个喜欢的快捷键,写起来非常迅速的,这儿的人不喜欢写注释,我接受看他们的项目就和看天书一样,真让人头大)
人家原文里头讲的挺好的,对于for和forEach的初始加载,大家可以康康,知识就是分享,项目上面我个人觉得不管数据量的大小,还是用forEach比较好把,毕竟项目到了实际中运用的时候,他不是用一会,那个数据量是在不停的叠加的,不停的叠加,
最后那个createTestList是创建list数据
UUID可以理解为一个唯一标识,他的作用就是给你生成一些不重复的数据。
方法里面的迭代器,他的next是通过get方法获取到的在底层实现中可以看到,推荐大家到底层看看,这个迭代器他是一个一个往下走的,也只能一个一个往下走,单向的,用起来要注意,源码并不复杂这个,用之前多了解一下更好。
public class IteratorMain {
public static void main(String[] args) {
List<String> lst = new ArrayList<String>();
lst.add("aaa");
lst.add("bbb");
lst.add("ccc");
lst.add("ddd");
lst.add("eee");
lst.add("fff");
List<String> lst1 = new ArrayList<String>();
lst1.add("bbb");
lst1.add("eee");
lst1.add("333");
lst1.add("bbb");
lst1.add("555");
lst1.add("666");
int i=0;
for(String a:lst1){
//迭代器
Iterator<String> iterator = lst.iterator();
i++;
while(iterator.hasNext()){
String b = iterator.next();
if(b == a){
lst.add("ggg");
break;
}
System.out.println(b+" "+i);
}
}
}
}
for循环原理我也没看,平时也尽量别用这个for辣鸡的很在JDK8底下就属它拉胯了。