为了程序的健壮性
我们可能使用Integer.ValueOf(1)去代替new Integer(1);
我们可能使用Integer.ValueOf(1)去代替new Integer(1);
解决方案 »
- IO File 路径问题
- Himalayas 是何物?
- 我这段代码编译总是被告知:缺少class或interface 在线等!
- Java里面有没有类似.net里webrequest的类呀?
- 我如何才能实现点击一个button后,在JTable里添加一个新的空行
- 算法!大家写写看谁的最快?
- 如何用Java取得汉字内码?
- (等!120分)用javamail做收发邮件程序时,当用户输入用户名和密码,提交后,不查询邮件服务器,怎样判定用户的帐号正确与否??(在线
- 如何利用socket传文件(不同格式的)?高分求救!!---在线等待
- 给java和面向对象高手出的题?
- 你好!要求用Map存一系列的bean,用哪个Map效率最高呢?
- 红黑树和二叉排序树的若干疑问 + 精确到微妙级的函数?
return false;
我就写return result.size() > 0;
你厉害,但是初学者很难发现的!别说人家SB,其实每个人在初学的时候基本上都用的是那种"SB"的方式!要是没人提醒,久而久之,基本上就习惯成自然了
if(flag==true)
...
i - 一个 int 值。
返回:
表示 i 的 Integer 实例。
从以下版本开始:
1.5
避免null point exception
这都是小技巧...
大家不要吝啬啊...
最后我可以给大家整理...
发给大家...
谢谢大家
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.方法的命名要能够表达出方法的功能
太多了....
呵呵....
大家来补充吧....
有描述不清的请包涵
代替
对象==null
new Integer()的参数有哪些。
我这样说可能不是很规范。MD,正经点说,就是,
静态方法Integer.ValueOf()(单参数)的重载方法有很多种,
这样,当其他类型的参数传入的时候,也能得到相应的Integer对象。
而Integer的构造器,她支持的(单参数)重载方法比较少,所以,她的适用范围就会小了。
public static Integer valueOf(int i)返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer 实例,则通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过缓存经常请求的值而显著提高空间和时间性能。这也是个原因啊...
我不晓得你用过fingbugs没有...
那里就提到了这点
在制作HTML表单时,这个方法非常爽
那个静态方法,好像也有调用构造器。我再回去看看源码。
我觉得对java类库的掌握度比看findbugs更重要,个人观点21楼童鞋勿见怪
try{}catch(Exception e){} finally{if(conn!=null){conn.colse();conn==null}}具体的都不说啦,大家应该都明白
API是这样写的:因为该方法有可能通过缓存经常请求的值而显著提高空间和时间性能。
这句好里面的可能指的是在哪里方面? 是不是指的int的取值范围内才提高空间和性能呢?
以前我经常犯里面的错误,尤其是"123".equals(str)的问题 呵呵!
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;绝对被老师骂 呵呵
现在自动装箱,拆箱 都很少这样用了
最多是Integer.parseInt(String )
个人理解是这样的:创建对象浪费内存,而且Java已经提供了很好的方法,干嘛不使呢。
支持楼主。我们对Java中的一些细节问题必须深究。
给每个if(condition){}都加上大括号,即使里面只有一句话~
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字节码。
字符串连接内部实现是stringbuilder对象 用这个效率最最高,
而且一般的两连你都考虑这样做是不是太累了 循环的时候注意下就够了。
还有泛型的应用 能熟练掌握效率就不是问题了
可以使用系统内置的128个共享的静态缓冲数据,而new Integer(1)则没有这个优势了。
至于啥叫那个,你自己看看 valueOf的源代码吧。一看便知。
return false;这种傻B写法是不是正确的
2、避免使用“纯数字”,这些数字很难与代码很好地配合。因为根本不知道“100”到底是指“数组大小”还是“其他全然不同的东西”所以,我们应创建一个常数,并为其使用具有说服力的描述性名称,并在整个程序中都采用常数标识符。这样可使程序更易理解以及更易维护。
3在一个特定的作用域内,若一个对象必须清除(非由垃圾收集机制处理),则采用下述方法:初始化对象;若成功,则立即进入一个含有finally从句的try块开始清除工作。
而且用到字符串的时候,StringBuffer在往后面连字符的时候要比String节省资源。
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语句,
就是这位同僚说的道理啊 .."123".equals(str)
能用非常量的东西尽量都不要用变量 SQL语句很明显能用常量的StringBuffer要说明一点的是 可能长度有限制(我有个朋友曾经用StringBuffer保存字符流 结果到最后溢出了,而换成String就木有问题) 所以StringBuffer最方便的地方仅仅是他操作字符串至于equals在前还是在后这个 偶不清楚 不过既然是值比较 我想应该没区别吧(谁知道可以告诉偶下 偶瞎说的)不过这里有个习惯问题变量名.equals(值) 这样的话我们一开始就知道对什么值进行判断 而反过来多少让人不太舒服 类似的还有你声明数组的时候String[] args;
String args[]一般是把[]放到String后面 因为这样就会让人一眼就看出来这是个数组至于return result.size() > 0; 这样写是很方便 也很帅 但前提是要确保你在执行这段代码的时候不会出异常 (或者加try块)另外 关于清理对象的问题 楼上有建议用try finally的 补充一点 对象的声明在try块外面 而且在执行完TRY块里的操作开始执行finally的操作的时候 里面的清理操作一定要做好判断(比如你调用连接关闭的时候首先要确认连接是否已经关闭 或者连接对象是否为空) 毕竟用finally做清理操作的意思是无论什么情况都要清理 也就是说包括try块里出现异常的情况
for(int i = 0;i < y;i++)最后个人建议:养成习惯的话能改就改吧 改不了也不要强迫改 没事多下些国外的开源项目 仔细体会老外写代码跟咱们写的风格有什么区别 小弟参加工作时间不长 如果说错的话大家可以纠正下(语言尽量委婉些吧^ ^)
String s = str1;
s += str2;
这样才需要用StringBuffer来减少临时对象的
偷懒的办法。。
当你有很多查询条件的时候,你不知道那些个会有,哪些个没有,如果一个没有的话,是不是就不用where子句了呢?如果只有一个条件的话,是不是只要一个where子句就搞定了呢?又如果有2个以上,就需要用and来连接了。。基于上诉的情况,勤劳的程序员们想出了一个好用的办法,加个where 1=1 后面不管有多少个条件
有则加and,没有的话就什么都不用做,相比较之前的3中情况的判断来说,比较方便。