不知何故,经常看到各种不靠谱帖子满天飞。试举几例:Java编程中“为了性能”需做的26件事Java父类与子类的 内存引用讲解java中的各种数据类型在内存中存储的方式深度解析Java内存的原型在论坛经常看到有人引这些帖子上的不靠谱东西来误人子弟,好伤心。还有哪些不靠谱的,大家一起补充吧……
 

解决方案 »

  1.   

    性能篇:
    1 过度使用单例会给代码的可维护性带来毁灭性打击。实际情况是单例应该尽量避免而不是提倡
    2 静态变量可以节省内存,当用则用。另外b = null不就好了什么生命周期与A同步啊
    3 创建对象有时候是为了代码书写方便,有时候是为了保证类的immutability。而且JVM见到new的时候并不一定会创建对象
    4 尽量用final并不是为了性能,而且事实上即便是最简单的final方法编译器也不会内联。final String是因为String是一个特殊而且重要的对象,不应该改变它的行为
    5 局部变量当用则用
    6 synchronize方法应该用一个锁对象代替,不只是缩小
    13 那不是重复计算
    public int size() {
        return size;
    }
    14 这看上去是不必要的创建,而事实上如果A是一个简单的对象(默认构造函数),单纯new A();并不会创建它
    20 用二维数组是因为有用,而不是因为我想写一个烂代码
    26 异常也是当用则用。要注意的是异常只能拿来处理真的异常,而不是正常的业务逻辑中的条件分支
      

  2.   

    顶。核心问题是:
    1.用15年前的眼光看java。
    2.用所谓“性能”为出发点影响设计。
    3.光说不profiling。
      

  3.   

    顶。核心问题是:
    1.用15年前的眼光看java。
    2.用所谓“性能”为出发点影响设计。
    3.光说不profiling。
    学习了学习了~
      

  4.   

    略看了一下这些文章,相当扯淡,他们的都只是自己臆断的去理解java的机制和运行原理,没有实际经验,也不曾做过学习和研究,自以为懂一点就乱发文章。如果说哪里不对,我想说,除了少部分基本的地方,一些深入到内存,运行原理的东西,基本上都是错的。特别是那个说继承的,简直就是扯淡到极点,说子类对象里面会有父类对象,很明显他不明白,调用构造函数不等于生成对象。
      

  5.   


    话说“栈有一个很重要的特殊性,就是存在栈中的数据可以共享”是最有创造性的理论发明了,如果这些人能创造性地发明一个实现该理论的jvm就更好了。
      

  6.   

    还有把this和super当成对象成员的 
      

  7.   

    还有把this和super当成对象成员的 说到那个jvm的实现,我想可能是性能问题无法得到很好的解决吧。
    至于this和super,他们很多时候根据自己的理解来判断,这本身没什么错,但是他们仅仅只是去判断而不去验证,因此得出错误的结论,这样也就罢了,还发出来让人嘲笑,实在是不应该。
      

  8.   

    其实,对有些能帮助理解java语言表象的“错误解释”不必太当真。如果,某个理解,连java语法基础都颠覆了的话........
      

  9.   

    Thinking In Java 那本书本身的问题以及读者不求甚解的原因,也带了不少混乱。
      

  10.   


    顶楼主,有一次同事摘抄了网上的一些性能优化的文章给我看,只看了一眼,就发现一条:
    尽量少使用枚举类型,因为它比起int常量会占据很多内存。怎么跟同事解释这玩意呢,单纯的内存占用确实是比基本类型要多,无奈翻出<Effective java>一书,翻出其中的一些建议才说服了同事,最终还发现那篇文章很多观点和Effective java中是相反的。
      

  11.   

    最神奇的是,转发这些帖子的人有的还号称看过Effective Java。
      

  12.   

    我一直无法理解js中
    function test(){
        this.a=function(){
            return "";
        }
    }
    test.prototype.a=function(){
      return "";  
    };
    var test={
        a:function(){
            reurn "";
        };
    };
    他们的本质区别
      

  13.   

    一个是函数对象,一个是普通对象,怎么会没区别?this.a;
    test.prototype.a;
    var test={
        a:
    ?
      

  14.   

    一个是函数对象,一个是普通对象,怎么会没区别?this.a;
    test.prototype.a;
    var test={
        a:
    ?
    Let me show you some magic:
    function base () { }
    test.prototype.a = function () {return "";}
    function extended () {}
    extended.prototype = new base();
    var extObj1 = new extended();
    var extObj2 = new extended();alert (extObj1.a()); // ""
    extObj1.a = function() { return "haha";}
    alert (extObj1.a()); // "haha"// here is the magic part
    base.prototype.a = function() {return "hey, here is the magic!";}
    alert(extObj2.a()); // "hey, here is the magic!"
    alert(extObj1.a()); // "haha"简单来说,新建对象的属性是prototype的属性的引用,改变了prototype对象,新建的对象也被改变,并且这种改变是可传递的。如果是function test() {
      this.a = function() {return "";}
    }
    你就没有这种改变prototype的属性就影响到所有实例对象的便利了好啦好啦我知道这里是JavaSE板
      

  15.   

    一个是函数对象,一个是普通对象,怎么会没区别?this.a;
    test.prototype.a;
    var test={
        a:
    ?
    Let me show you some magic:
    function base () { }
    test.prototype.a = function () {return "";}
    function extended () {}
    extended.prototype = new base();
    var extObj1 = new extended();
    var extObj2 = new extended();alert (extObj1.a()); // ""
    extObj1.a = function() { return "haha";}
    alert (extObj1.a()); // "haha"// here is the magic part
    base.prototype.a = function() {return "hey, here is the magic!";}
    alert(extObj2.a()); // "hey, here is the magic!"
    alert(extObj1.a()); // "haha"简单来说,新建对象的属性是prototype的属性的引用,改变了prototype对象,新建的对象也被改变,并且这种改变是可传递的。如果是function test() {
      this.a = function() {return "";}
    }
    你就没有这种改变prototype的属性就影响到所有实例对象的便利了好啦好啦我知道这里是JavaSE板
    貌似是这么这道理,谢了
      

  16.   

    Thinking In Java 那本书本身的问题以及读者不求甚解的原因,也带了不少混乱。Thinking in java 这本书确实讲的比较深奥