为了程序的健壮性
我们可能使用Integer.ValueOf(1)去代替new Integer(1);

解决方案 »

  1.   

    我料到这个帖子没几个人回的。接分。我很看不惯下面这种 SB 写法:if (result.size() > 0) return true;
    return false;
    我就写return result.size() > 0;
      

  2.   

    我就想知道为什么使用Integer.ValueOf(1)去代替new Integer(1)可以增强健壮性
      

  3.   


    你厉害,但是初学者很难发现的!别说人家SB,其实每个人在初学的时候基本上都用的是那种"SB"的方式!要是没人提醒,久而久之,基本上就习惯成自然了
      

  4.   

    还有这样的 
    if(flag==true)
    ...
      

  5.   

    我最近的心得是,多了解一下数据结构与算法的知识,尤其是深入了解一下java collection framework的知识,对代码的优化很有帮助
      

  6.   

    public static Integer valueOf(int i)返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer 实例,则通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过缓存经常请求的值而显著提高空间和时间性能。 参数:
    i - 一个 int 值。 
    返回:
    表示 i 的 Integer 实例。
    从以下版本开始: 
    1.5 
      

  7.   

    最简单的 "const".eqauls(variable)代替 variable.eqauls("const")
    避免null point exception
      

  8.   

    还有什么用"".equals(str)代替str.equals("")
    这都是小技巧...
    大家不要吝啬啊...
    最后我可以给大家整理...
    发给大家...
    谢谢大家
      

  9.   

    我来说几句点吧!
    1.在连接字符串的时候尽量避免使用String = "str"+"str2";
    而使用StringBuffer str = new StringBuffer("str");str.append("str2")代替
    2. 多使用PreparedStatement代替Statement这样可以避免在拼接字符串的时候出现
    "select * from tablename where col = '"+col+"'"单引号过多的情况
    3.在拚接查询语句的时候加上"where 1=1 "道理我就不说了
    4.多使用MessageFormat类
    5.代码中尽量少出现"123".equals(str)这样的危险字符(我们公司是这样定义的)而要
    public static final String STR = "123"; STR.equals(str)去代替.
    6.方法的命名要能够表达出方法的功能
    太多了....
    呵呵....
    大家来补充吧....
    有描述不清的请包涵
      

  10.   

    还有用null==对象
    代替
    对象==null
      

  11.   

    楼主可以看看API里面,Integer.ValueOf()方法的参数,有哪些?
    new Integer()的参数有哪些。
    我这样说可能不是很规范。MD,正经点说,就是,
    静态方法Integer.ValueOf()(单参数)的重载方法有很多种,
    这样,当其他类型的参数传入的时候,也能得到相应的Integer对象。
    而Integer的构造器,她支持的(单参数)重载方法比较少,所以,她的适用范围就会小了。
      

  12.   


    public static Integer valueOf(int i)返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer 实例,则通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过缓存经常请求的值而显著提高空间和时间性能。这也是个原因啊...
    我不晓得你用过fingbugs没有...
    那里就提到了这点
      

  13.   

    总结上面所述大致都是为了避免NullpointerException
      

  14.   

    一个数据有很多属性时,可以用反射取出所有属性
    在制作HTML表单时,这个方法非常爽
      

  15.   

    我记得Integer类里面本身好像缓存着一些常用的Integer对象滴。具体是多少,我忘记了。
    那个静态方法,好像也有调用构造器。我再回去看看源码。
      

  16.   

    确实是调用构造器的 只有当i >= -128 && i <= 127 时才如21楼所说的会从缓存请求值
    我觉得对java类库的掌握度比看findbugs更重要,个人观点21楼童鞋勿见怪
      

  17.   

    Connection conn = null
    try{}catch(Exception e){} finally{if(conn!=null){conn.colse();conn==null}}具体的都不说啦,大家应该都明白
      

  18.   

    恩 !Java API 真是好东西,我刚才也看了。学习了。
    API是这样写的:因为该方法有可能通过缓存经常请求的值而显著提高空间和时间性能。 
    这句好里面的可能指的是在哪里方面? 是不是指的int的取值范围内才提高空间和性能呢?
      

  19.   

    说的很好!
    以前我经常犯里面的错误,尤其是"123".equals(str)的问题 呵呵!
      

  20.   

    Hello word 这是最经典的 
      

  21.   

    我来说几句点吧! 
    1.在连接字符串的时候尽量避免使用String = "str"+"str2"; 
    而使用StringBuffer str = new StringBuffer("str");str.append("str2")代替 
    2. 多使用PreparedStatement代替Statement这样可以避免在拼接字符串的时候出现 
    "select * from tablename where col = '"+col+"'"单引号过多的情况 
    3.在拚接查询语句的时候加上"where 1=1 "道理我就不说了 
    4.多使用MessageFormat类 
    5.代码中尽量少出现"123".equals(str)这样的危险字符(我们公司是这样定义的)而要 
    public static final String STR = "123"; STR.equals(str)去代替. 
    6.方法的命名要能够表达出方法的功能 
    太多了.... 
    呵呵.... 
    大家来补充吧.... 
    有描述不清的请包涵完全同意 我们平常都要求这样做的 如果出现String=str1+str2;绝对被老师骂 呵呵 
      

  22.   

    LZ用的一定是JDK5.0以下的吧
    现在自动装箱,拆箱 都很少这样用了
    最多是Integer.parseInt(String )
      

  23.   

    调用整形包装类的静态方法当然 比 创建整形对性更好,更健壮。为什么呢?
    个人理解是这样的:创建对象浪费内存,而且Java已经提供了很好的方法,干嘛不使呢。
    支持楼主。我们对Java中的一些细节问题必须深究。
      

  24.   

    写String s=str1+str2怎么了,在老的jvm中,确实创建了多个对象,浪费了空间,但是在新版本的jvm中早已解决这个问题了,jvm会自己使用StringBuffer去操作你的String对象。我写代码很烂,没有什么技巧。
      

  25.   

    3.在拚接查询语句的时候加上"where 1=1 "道理我就不说了不明白其中的道理,哪个帮指点下,谢谢了?
      

  26.   

    提一个要主意的:
    给每个if(condition){}都加上大括号,即使里面只有一句话~
      

  27.   

    ■字串的开销:字串连接运算符+看似简单,但实际需要消耗大量系统资源。编译器可高效地连接字串,但变量字串却要求可观的处理器时间。例如,假设s和t是字串变量:
    System.out.println("heading" + s + "trailer" + t);
    上述语句要求新建一个StringBuffer(字串缓冲),追加自变量,然后用toString()将结果转换回一个字串。因此,无论磁盘空间还是处理器时间,都会受到严重消耗。若准备追加多个字串,则可考虑直接使用一个字串缓冲——特别是能在一个循环里重复利用它的时候。通过在每次循环里禁止新建一个字串缓冲,可节省980单位的对象创建时间(如前所述)。利用substring()以及其他字串方法,可进一步地改善性能。如果可行,字符数组的速度甚至能够更快。也要注意由于同步的关系,所以StringTokenizer会造成较大的开销。
    ■同步:在JDK解释器中,调用同步方法通常会比调用不同步方法慢10倍。经JIT编译器处理后,这一性能上的差距提升到50到100倍(注意前表总结的时间显示出要慢97倍)。所以要尽可能避免使用同步方法——若不能避免,方法的同步也要比代码块的同步稍快一些。
    ■重复利用对象:要花很长的时间来新建一个对象(根据前表总结的时间,对象的新建时间是赋值时间的980倍,而新建一个小数组的时间是赋值时间的3100倍)。因此,最明智的做法是保存和更新老对象的字段,而不是创建一个新对象。例如,不要在自己的paint()方法中新建一个Font对象。相反,应将其声明成实例对象,再初始化一次。在这以后,可在paint()里需要的时候随时进行更新。参见Bentley编著的《编程拾贝》,p.81[15]。
    ■异常:只有在不正常的情况下,才应放弃异常处理模块。什么才叫“不正常”呢?这通常是指程序遇到了问题,而这一般是不愿见到的,所以性能不再成为优先考虑的目标。进行优化时,将小的“try-catch”块合并到一起。由于这些块将代码分割成小的、各自独立的片断,所以会妨碍编译器进行优化。另一方面,若过份热衷于删除异常处理模块,也可能造成代码健壮程度的下降。
    ■散列处理:首先,Java 1.0和1.1的标准“散列表”(Hashtable)类需要造型以及特别消耗系统资源的同步处理(570单位的赋值时间)。其次,早期的JDK库不能自动决定最佳的表格尺寸。最后,散列函数应针对实际使用项(Key)的特征设计。考虑到所有这些原因,我们可特别设计一个散列类,令其与特定的应用程序配合,从而改善常规散列表的性能。注意Java 1.2集合库的散列映射(HashMap)具有更大的灵活性,而且不会自动同步。
    ■方法内嵌:只有在方法属于final(最终)、private(专用)或static(静态)的情况下,Java编译器才能内嵌这个方法。而且某些情况下,还要求它绝对不可以有局部变量。若代码花大量时间调用一个不含上述任何属性的方法,那么请考虑为其编写一个“final”版本。
    ■I/O:应尽可能使用缓冲。否则,最终也许就是一次仅输入/输出一个字节的恶果。注意JDK 1.0的I/O类采用了大量同步措施,所以若使用象readFully()这样的一个“大批量”调用,然后由自己解释数据,就可获得更佳的性能。也要注意Java 1.1的“reader”和“writer”类已针对性能进行了优化。
    ■造型和实例:造型会耗去2到200个单位的赋值时间。开销更大的甚至要求上溯继承(遗传)结构。其他高代价的操作会损失和恢复更低层结构的能力。
    ■图形:利用剪切技术,减少在repaint()中的工作量;倍增缓冲区,提高接收速度;同时利用图形压缩技术,缩短下载时间。来自JavaWorld的“Java Applets”以及来自Sun的“Performing Animation”是两个很好的教程。请记着使用最贴切的命令。例如,为根据一系列点画一个多边形,和drawLine()相比,drawPolygon()的速度要快得多。如必须画一条单像素粗细的直线,drawLine(x,y,x,y)的速度比fillRect(x,y,1,1)快。
    ■使用API类:尽量使用来自Java API的类,因为它们本身已针对机器的性能进行了优化。这是用Java难于达到的。比如在复制任意长度的一个数组时,arraryCopy()比使用循环的速度快得多。
    ■替换API类:有些时候,API类提供了比我们希望更多的功能,相应的执行时间也会增加。因此,可定做特别的版本,让它做更少的事情,但可更快地运行。例如,假定一个应用程序需要一个容器来保存大量数组。为加快执行速度,可将原来的Vector(矢量)替换成更快的动态对象数组。1. 其他建议
    ■将重复的常数计算移至关键循环之外——比如计算固定长度缓冲区的buffer.length。
    ■static final(静态最终)常数有助于编译器优化程序。
    ■实现固定长度的循环。
    ■使用javac的优化选项:-O。它通过内嵌static,final以及private方法,从而优化编译过的代码。注意类的长度可能会增加(只对JDK 1.1而言——更早的版本也许不能执行字节查证)。新型的“Just-in-time”(JIT)编译器会动态加速代码。
    ■尽可能地将计数减至0——这使用了一个特殊的JVM字节码。
      

  28.   

    呵呵,写代码我是没什么技巧,就是常用eclipse的快捷键,其余的等出了问题再解决问题
      

  29.   

    where1<>1。
    字符串连接内部实现是stringbuilder对象 用这个效率最最高,
    而且一般的两连你都考虑这样做是不是太累了 循环的时候注意下就够了。
      

  30.   

    1.5以后出来的新特性都能最大化节约效率 人家大师考虑的效率不是一步两步 最起码也是循环像foreach
    还有泛型的应用 能熟练掌握效率就不是问题了
      

  31.   

    Integer.valueOf(1)
    可以使用系统内置的128个共享的静态缓冲数据,而new Integer(1)则没有这个优势了。
    至于啥叫那个,你自己看看 valueOf的源代码吧。一看便知。
      

  32.   

    不是说开发技巧么。。怎么补充基础知识了偶的开发技巧 复制粘贴 然后用replace...另外使用EditPlus来编辑一些不需要使用IDE就能编辑的东西
      

  33.   

    我想知道2楼说的if (result.size() > 0) return true;
    return false;这种傻B写法是不是正确的
      

  34.   

    尽量让一个函数只有一个出口,不要这里return一下那里return一下,那会降低可读性。
      

  35.   

    还有就是Integer.toString(i)这句也不错
      

  36.   

    1、奉行拿来主义
    2、避免使用“纯数字”,这些数字很难与代码很好地配合。因为根本不知道“100”到底是指“数组大小”还是“其他全然不同的东西”所以,我们应创建一个常数,并为其使用具有说服力的描述性名称,并在整个程序中都采用常数标识符。这样可使程序更易理解以及更易维护。
    3在一个特定的作用域内,若一个对象必须清除(非由垃圾收集机制处理),则采用下述方法:初始化对象;若成功,则立即进入一个含有finally从句的try块开始清除工作。
      

  37.   

    不知道这是什么年代的信息了,很多跟我理解的java信息矛盾。很多都是说的java1.1的信息,到1.6已经发生了相当大的变化,这些建议也该改改了。
      

  38.   

    说一下 if(XXX)return true;return false;这种做法,其实在项目中对往后的维护是很不利的,因为你不能保证到时候维护的那个人是你。你要写成if(xxxx){return true;} 那么就一目了然了。别图自己的一时方便咯。我曾经这样写,被我们领导挨批了好几次了 还有 就是 在get或set方法里面做额外的操作。比如 getAge(){age++;return age;} 因为 在别的方法中调用的话,如果这个方法出错了。维护的人员在一段时间里只会关注你出错的方法。而不去找你的那个修改过的get方法的。
      

  39.   

    大哥看好了这是基础区,你刚学java的时候就直接能写出那种不SB的方法麽?要注意素质,而且,不要侮辱其他人
      

  40.   

    高手真多啊 ,我觉得i=i+1写成i+=1更节省资源吧
    而且用到字符串的时候,StringBuffer在往后面连字符的时候要比String节省资源。
      

  41.   

    循环的时候依然浪费资源,会创建很多StringBuilder对象,不要依赖编译器进行优化。
      

  42.   

    "123".equals(str)?这样写有什么问题,谁来解释一下
      

  43.   


     StringBuffer sqlStr = new StringBuffer();
                sqlStr.append("SELECT a.acct_code,s.msisdn,rd.product_name,rd.res_model_id, ");
                sqlStr.append(" rd.gross_revenue-rd.paid_amt,rd.res_code,r.oper_id ");
                sqlStr.append(" FROM ");
                sqlStr.append(ARProfile.T_RECEIVABLES );
                sqlStr.append(" rd, ");
                sqlStr.append(ARProfile.T_RECEIVABLES_DETAIL);
                sqlStr.append(" r, ");
                sqlStr.append(ARProfile.T_INFO_ACCT);
                sqlStr.append(" a, ");
                sqlStr.append(ARProfile.T_INFO_SUBSCRIBER_ALL);
                sqlStr.append(" s ");
                sqlStr.append(" WHERE rd.invoice_id = r.invoice_id ");
                sqlStr.append(" AND r.acct_id = a.acct_id ");
                sqlStr.append(" AND r.sub_id(+) = s.sub_id ");
                sqlStr.append(" AND r.busi_type LIKE 'C%' ");
                sqlStr.append(" AND rd.gross_revenue-rd.paid_amt > 0");
                
                if (null != comValue.getBeginDate())
                {
                    sqlStr.append(" AND r.entry_date >= to_date(to_char(?,'yyyy-mm-dd'),'yyyy-mm-dd')");
                }
                if (null != comValue.getEndDate())
                {
                    sqlStr.append(" AND r.entry_date < to_date(to_char(? + 1,'yyyy-mm-dd'),'yyyy-mm-dd')");
                }
                if (null != comValue.getDeptCode())
                {
                    sqlStr.append(" AND status = ? ");
                }
                sqlStr.append("ORDER BY rd.product_name,s.msisdn ");            log.debug("[SQL]" + sqlStr.toString());
               // final String sql = sqlStr.toString();
                ps = conn.prepareStatement(sqlStr.toString());
        
    不建议使用非常量字符串SQL语句,
      

  44.   


    就是这位同僚说的道理啊 .."123".equals(str)
      

  45.   


    能用非常量的东西尽量都不要用变量 SQL语句很明显能用常量的StringBuffer要说明一点的是 可能长度有限制(我有个朋友曾经用StringBuffer保存字符流 结果到最后溢出了,而换成String就木有问题) 所以StringBuffer最方便的地方仅仅是他操作字符串至于equals在前还是在后这个 偶不清楚 不过既然是值比较 我想应该没区别吧(谁知道可以告诉偶下 偶瞎说的)不过这里有个习惯问题变量名.equals(值) 这样的话我们一开始就知道对什么值进行判断 而反过来多少让人不太舒服 类似的还有你声明数组的时候String[] args;
    String args[]一般是把[]放到String后面 因为这样就会让人一眼就看出来这是个数组至于return result.size() > 0;  这样写是很方便 也很帅 但前提是要确保你在执行这段代码的时候不会出异常 (或者加try块)另外 关于清理对象的问题 楼上有建议用try finally的 补充一点 对象的声明在try块外面 而且在执行完TRY块里的操作开始执行finally的操作的时候 里面的清理操作一定要做好判断(比如你调用连接关闭的时候首先要确认连接是否已经关闭 或者连接对象是否为空) 毕竟用finally做清理操作的意思是无论什么情况都要清理 也就是说包括try块里出现异常的情况
      

  46.   

    上面第一句话打错了 能用常量的东西都要用常量来完成在for循环里要注意for(int i = 0; i < 调用某个方法返回值;i++)这种写法要改成int y = 调用某个方法返回值;
    for(int i = 0;i < y;i++)最后个人建议:养成习惯的话能改就改吧 改不了也不要强迫改 没事多下些国外的开源项目 仔细体会老外写代码跟咱们写的风格有什么区别 小弟参加工作时间不长 如果说错的话大家可以纠正下(语言尽量委婉些吧^ ^)
      

  47.   

    String=str1+str2;这个没有必要吧
    String s = str1;
    s += str2;
    这样才需要用StringBuffer来减少临时对象的
      

  48.   


    偷懒的办法。。
    当你有很多查询条件的时候,你不知道那些个会有,哪些个没有,如果一个没有的话,是不是就不用where子句了呢?如果只有一个条件的话,是不是只要一个where子句就搞定了呢?又如果有2个以上,就需要用and来连接了。。基于上诉的情况,勤劳的程序员们想出了一个好用的办法,加个where 1=1 后面不管有多少个条件
    有则加and,没有的话就什么都不用做,相比较之前的3中情况的判断来说,比较方便。
      

  49.   

    搞错了,是String s="str1"+"str2";这个编译的时候就转换为s="str1str2"了,没必要再用Stringbuffer了
      

  50.   

    是的,准确的说是try catch finally 组合使用。