论坛首页 Java企业应用论坛

代码难道不是这么写的?

浏览 66467 次
该帖已经被评为良好帖
作者 正文
   发表时间:2010-07-29  
神之小丑 写道

for(int i = arr.len - 1;i >= 0 ;i--) {
  A a = arr[i];
  System.out.println(s);
  }

当初去面试一家手机游戏的公司,这个 就是其中的一个面试题的答案,

我也是这么写的,然后面试官给我说

手机编程 面临的最大问题就是内存很小的问题,所以能优化就优化,能少占内存就少占内存


对数组顺序没有要求的时候,可以这么写,如果有要求呢?
0 请登录后投票
   发表时间:2010-07-29  
adyfang 写道
这也是为了养成一个良好的编程习惯,如果习惯了在循环里面声明变量,那将来会不会不加思索就在循环里 new 一个对象出来呢!

有人不加思索的在for外new出一个A
之后把A一个一个塞到list中去
还要问我为什么数据库里的数据都长一个样.....
0 请登录后投票
   发表时间:2010-07-29  
抛出异常的爱 写道

有人不加思索的在for外new出一个A
之后把A一个一个塞到list中去
还要问我为什么数据库里的数据都长一个样.....

哈哈,我也看见有人这么写,还说是老师教的,不要在for里面new对象和定义对象,所以才写for外面的
0 请登录后投票
   发表时间:2010-07-29  
mercyblitz 写道
dennis_zane 写道
ahuaxuan 写道
dennis_zane 写道

为了免的某些人再扯淡,我将编译后的字节码贴出来:
args.length就是一条指令ARRAYLENGTH,哪怕你存到变量len里,也要一条LOAD指令。
两个循环区别仅仅在局部变量的索引上。

======================
有人是做j2me之类的移动设备的, 一般上他们认为
for (int k =0; k < ArrayList.getSize();k++)


int len = ArrayList.getSize()
for (int k =0; k < len;k++)
要多出多个个方法栈帧的操作。
但是在j2se上,这种消耗根本不值一提。

而对于array.length.这就是一个变量访问,这个是肯定的。不会有什么消耗(即使是在j2me中)


list.size()也就多了一条指令的开销,当然,invokeinterface或者invokevirutal会慢一些,这是肯定,通常情况下根本不需要考虑这些。我没搞过j2me,不敢妄下结论,也许j2me的jvm比较不同。


引用
invokeinterface或者invokevirutal会慢一些


是否有参考资料?那么方法内联是不是可以完全忽略这个问题。


JVM里面有四种调用原语:
invokestatic
invokespecial
invokevirtual
invokeinterface

前面两种速度是最快的,1static是放在固定的内存位置的,全局共享区,所以速度很快。
invokestatic是调用静态方法的。
inbokespecial是调用构造函数,私有方法,还有super的方法的。
invokevirtual是调用普通的函数,支持类继承。如果子类覆盖父类的实现,只要对子类的方法的位置的指针替换掉就可以了。所以可以用offset的方法访问子类覆盖的对象。
invokeinterface是调用实现interface的接口的,因为每个类实现interface的个数不一致,也就导致函数的引用指针位置不一直,所以只能从类继承的函数后面一个一个遍历查找实现interface的函数。

例如,假设Parent的两个函数放在方法表中的位置分别是1,2
hashCode() 1
toString() 2
Child覆盖了以上的两个函数,但是hashCode()和toString()肯定也是放在1,2.不会放在2,3等等。

但是interface就有可能。
2 请登录后投票
   发表时间:2010-07-29  
linchao198401 写道
mercyblitz 写道
dennis_zane 写道
ahuaxuan 写道
dennis_zane 写道

为了免的某些人再扯淡,我将编译后的字节码贴出来:
args.length就是一条指令ARRAYLENGTH,哪怕你存到变量len里,也要一条LOAD指令。
两个循环区别仅仅在局部变量的索引上。

======================
有人是做j2me之类的移动设备的, 一般上他们认为
for (int k =0; k < ArrayList.getSize();k++)


int len = ArrayList.getSize()
for (int k =0; k < len;k++)
要多出多个个方法栈帧的操作。
但是在j2se上,这种消耗根本不值一提。

而对于array.length.这就是一个变量访问,这个是肯定的。不会有什么消耗(即使是在j2me中)


list.size()也就多了一条指令的开销,当然,invokeinterface或者invokevirutal会慢一些,这是肯定,通常情况下根本不需要考虑这些。我没搞过j2me,不敢妄下结论,也许j2me的jvm比较不同。


引用
invokeinterface或者invokevirutal会慢一些


是否有参考资料?那么方法内联是不是可以完全忽略这个问题。


JVM里面有四种调用原语:
invokestatic
invokespecial
invokevirtual
invokeinterface

前面两种速度是最快的,1static是放在固定的内存位置的,全局共享区,所以速度很快。
invokestatic是调用静态方法的。
inbokespecial是调用构造函数,私有方法,还有super的方法的。
invokevirtual是调用普通的函数,支持类继承。如果子类覆盖父类的实现,只要对子类的方法的位置的指针替换掉就可以了。所以可以用offset的方法访问子类覆盖的对象。
invokeinterface是调用实现interface的接口的,因为每个类实现interface的个数不一致,也就导致函数的引用指针位置不一直,所以只能从类继承的函数后面一个一个遍历查找实现interface的函数。

例如,假设Parent的两个函数放在方法表中的位置分别是1,2
hashCode() 1
toString() 2
Child覆盖了以上的两个函数,但是hashCode()和toString()肯定也是放在1,2.不会放在2,3等等。

但是interface就有可能。


谢谢,冒失还有一个内联问题。
0 请登录后投票
   发表时间:2010-07-29  
这样写不更简洁么
for(String ss:arr){
   A a=ss;
   System.out.println(s);
}
0 请登录后投票
   发表时间:2010-07-29  
zhangdaweizdw1 写道
这样写不更简洁么
for(String ss:arr){
   A a=ss;
   System.out.println(s);
}


这样是可以的,不过创建了一个java.util.Iterator的中间对象。
0 请登录后投票
   发表时间:2010-07-29  
ywgoal 写道
都闲得蛋痛!!中国牛人多,怎么看牛的程序,软件,计算机都是人家老外牛啊~~~


你的评价太崇洋了,没有依据啊。你没看到QQ比MSN牛,华为在很多技术上已经赶超思科!!

像你这种啥都不想最求精致的人,才是导致中国软件落后的罪魁。
0 请登录后投票
   发表时间:2010-07-29  
linliangyi2007 写道
ywgoal 写道
都闲得蛋痛!!中国牛人多,怎么看牛的程序,软件,计算机都是人家老外牛啊~~~


你的评价太崇洋了,没有依据啊。你没看到QQ比MSN牛,华为在很多技术上已经赶超思科!!

像你这种啥都不想最求精致的人,才是导致中国软件落后的罪魁。


你的观点不错,不过举的例子恐怕有问题。
0 请登录后投票
   发表时间:2010-07-29   最后修改:2010-07-29
happysalay 写道
你的代码没错,你有错,错在不知道你的代码没错。


这话说的是是而非啊,呵呵呵

如果我是考官,我考你一个问题,然后说你错了,你也许根本不知道自己错哪里,原因是你不知道我要考的是哪个方面的知识点,你也就不会冒然的反驳我。

楼主的代码没错,从程序员的角度上说,他就应该没有错。所谓错在不知道你的代码没错,这就是“欲加之罪”了。

我曾经碰到一个很白痴的领导,在一个公司会议上问我:“说说你这个方案的缺点吧?”他的理由是,“没有方案是完美的”。 我当时真想骂他,NND,我的方案是不可能完美,但是只要是公司内最好的就够了,除非你能拿出更好的,你能吗?
你不能!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics