二维数组的两种遍历方式

PJ_Richard 2016-04-17 08:58:21
public class Draft{
public static void main(String... args){

int [] a[]=new int[100][100];
//赋值
long t1=System.currentTimeMillis();
for(int i=0;i<100;i++){
for(int j=0;j<100;j++){
a[i][j]=i+j;
}
}
long t2=System.currentTimeMillis();
//第一种遍历方式
long t3=System.currentTimeMillis();
for(int i=0;i<100;i++){
for(int j=0;j<100;j++){
System.out.println(a[i][j]);
}
}
long t4=System.currentTimeMillis();
//第二种遍历方式
long t5=System.currentTimeMillis();
for(int j=0;j<100;j++){
for(int i=0;i<100;i++){
System.out.println(a[i][j]);
}
}
long t6 =System.currentTimeMillis();
System.out.println("...............over..........");
System.out.println("赋值的时间:"+(t2-t1)+"\n"+"第一种方法的时间:"+(t4-t3)+"\n"+"第二种方法的时间:"+(t6-t5));
}
}
........................................
赋值的时间:0
第一种方法的时间:199
第二种方法的时间:63

求解释?为什么遍历时,先列后行比先行后列速度快?
...全文
4535 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gggggame 2017-09-22
  • 打赏
  • 举报
回复
下面都是网上copy能理解多少是多少吧。 在一个真正的数组中,所有的元素在内存中都存放在连续的内存块中,但是在Java的二维数组并不是这样。Java中所有一维数组中的元素占据了相邻的内存位置,因此是一个真正的数组。 这意味着,在上面的例子中,二维数组是一个数组的引用,其每一个元素都是另一个int数组的引用。 http://www.importnew.com/16742.html
PrayLife 2016-04-29
  • 打赏
  • 举报
回复
引用 9 楼 imfang 的回复:
[quote=引用 6 楼 IMBA123456789 的回复:] 一种是行先列后,另一种是列先行后,应该是行先列后的要效率高,第一种效率高吧
100*100个int元素,数据都在内存中,怎么访问我觉得并不影响其速度。 为何先运行的时间长,而后面的时间短,我也不知道,下面只是我的猜测: 虚拟机将中间代码解释成本地代码是由一个线程来完成的,而执行是另一个线程来完成的。 刚开始执行时没有实现本地化,需要边解释边执行,速度较慢, 而等到该执行后面的代码时,已经完全完成本地化,所以执行的速度就快了。 纯粹是猜测,如果不对,请java大咖出来指正,以解心中疑惑! [/quote] Java数组是行优先的。
PJ_Richard 2016-04-20
  • 打赏
  • 举报
回复
引用 9 楼 imfang的回复:
[quote=引用 6 楼 IMBA123456789 的回复:] 一种是行先列后,另一种是列先行后,应该是行先列后的要效率高,第一种效率高吧
100*100个int元素,数据都在内存中,怎么访问我觉得并不影响其速度。 为何先运行的时间长,而后面的时间短,我也不知道,下面只是我的猜测: 虚拟机将中间代码解释成本地代码是由一个线程来完成的,而执行是另一个线程来完成的。 刚开始执行时没有实现本地化,需要边解释边执行,速度较慢, 而等到该执行后面的代码时,已经完全完成本地化,所以执行的速度就快了。 纯粹是猜测,如果不对,请java大咖出来指正,以解心中疑惑! [/quote] 不是使用频率高的代码才本地化吗?这两个循环又不是相同代码。。。
imfang 2016-04-20
  • 打赏
  • 举报
回复
引用 6 楼 IMBA123456789 的回复:
一种是行先列后,另一种是列先行后,应该是行先列后的要效率高,第一种效率高吧
100*100个int元素,数据都在内存中,怎么访问我觉得并不影响其速度。 为何先运行的时间长,而后面的时间短,我也不知道,下面只是我的猜测: 虚拟机将中间代码解释成本地代码是由一个线程来完成的,而执行是另一个线程来完成的。 刚开始执行时没有实现本地化,需要边解释边执行,速度较慢, 而等到该执行后面的代码时,已经完全完成本地化,所以执行的速度就快了。 纯粹是猜测,如果不对,请java大咖出来指正,以解心中疑惑!
PJ_Richard 2016-04-19
  • 打赏
  • 举报
回复
引用 5 楼 imfang的回复:
[quote=引用 4 楼 PJ_Richard 的回复:] [quote=引用 3 楼 imfang 的回复:] 你把两种遍历方式的顺序颠倒一下,再看看运行结果,是不是还有原来的结论?
两方法中,后打印者时间短。时间倍数:3倍 而且不论我是从a[99][99]倒叙遍历,或者顺序遍历,都是先打印者的时间是后打印者的3倍。 求解释?网上那些都没怎么找到答案。。。。。。 [/quote] 你的程序中仅保留一种遍历方法,两种分别测试,又有何结论?[/quote] 用时差不多,不过还是不懂。。。。
silenccce 2016-04-19
  • 打赏
  • 举报
回复
引用 1 楼 OMG_C 的回复:
影响效率的实际上主要是大型数组导致的内存页面交换次数和cache命中率的高低,而不是循环次数本身 在Java中,二维数组以先列后行的顺序存储在连续的内存中,所以你在第一次遍历时时间复杂度比第二个大1倍以上
你这个是哪个虚拟机的实现?不同虚拟机不一样的吧,JVM Specification 中好像没有强制。
PrayLife 2016-04-19
  • 打赏
  • 举报
回复
一种是行先列后,另一种是列先行后,应该是行先列后的要效率高,第一种效率高吧
imfang 2016-04-19
  • 打赏
  • 举报
回复
引用 4 楼 PJ_Richard 的回复:
[quote=引用 3 楼 imfang 的回复:] 你把两种遍历方式的顺序颠倒一下,再看看运行结果,是不是还有原来的结论?
两方法中,后打印者时间短。时间倍数:3倍 而且不论我是从a[99][99]倒叙遍历,或者顺序遍历,都是先打印者的时间是后打印者的3倍。 求解释?网上那些都没怎么找到答案。。。。。。 [/quote] 你的程序中仅保留一种遍历方法,两种分别测试,又有何结论?
PJ_Richard 2016-04-18
  • 打赏
  • 举报
回复
引用 1 楼 OMG_C的回复:
影响效率的实际上主要是大型数组导致的内存页面交换次数和cache命中率的高低,而不是循环次数本身 在Java中,二维数组以先列后行的顺序存储在连续的内存中,所以你在第一次遍历时时间复杂度比第二个大1倍以上
意思说:如果我要取出a[0][1],假设有个指针,它会先走a[0][0],再走a[1][0]...一直走完a[99][0]后,再走到a[0][1],然后再取值?这样也不只大一倍时间啊。。
PJ_Richard 2016-04-18
  • 打赏
  • 举报
回复
引用 3 楼 imfang 的回复:
你把两种遍历方式的顺序颠倒一下,再看看运行结果,是不是还有原来的结论?
两方法中,后打印者时间短。时间倍数:3倍 而且不论我是从a[99][99]倒叙遍历,或者顺序遍历,都是先打印者的时间是后打印者的3倍。 求解释?网上那些都没怎么找到答案。。。。。。
imfang 2016-04-18
  • 打赏
  • 举报
回复
你把两种遍历方式的顺序颠倒一下,再看看运行结果,是不是还有原来的结论?
chenzxapple 2016-04-17
  • 打赏
  • 举报
回复 1
影响效率的实际上主要是大型数组导致的内存页面交换次数和cache命中率的高低,而不是循环次数本身 在Java中,二维数组以先列后行的顺序存储在连续的内存中,所以你在第一次遍历时时间复杂度比第二个大1倍以上

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧