关于java100个优化代码的信息( 三 )


String s = "Hello";
int i = v.indexOf(s);
if(I != -1) v.remove(i);
这个版本中我们直接在remove()方法中给出待删除元素的精确索引位置,从而避免了第二次搜索 。一个更好的版本是:
String s = "Hello"; v.remove(s);
最后,我们再来看一个有关Vector类的代码片段:
for(int I=0; I++;Iv.length)
如果v包含100,000个元素,这个代码片段将调用v.size()方法100,000次 。虽然size方法是一个简单的方法,但它仍旧需要一次方法调用的开销 , 至少JVM需要为它配置以及清除堆栈环境 。在这里,for循环内部的代码不会以任何方式修改Vector类型对象v的大小,因此上面的代码最好改写成下面这种形式:
int size = v.size(); for(int I=0; I++;Isize)
虽然这是一个简单的改动,但它仍旧赢得了性能 。毕竟,每一个CPU周期都是宝贵的 。
15、当复制大量数据时 , 使用System.arraycopy()命令 。
int[] src=https://www.04ip.com/post/{1,3,5,6,7,8};
int[] dest = new int[6];
System.arraycopy(src, 0, dest, 0, 6);
src:源数组; srcPos:源数组要复制的起始位置;
dest:目的数组; destPos:目的数组放置的起始位置;
length:复制的长度.
注意:src and dest都必须是同类型或者可以进行转换类型的数组.
16、代码重构:增强代码的可读性 。
public class ShopCart {
private List carts ;

public void add (Object item) {
if(carts == null) {
carts = new ArrayList();
}
crts.add(item);
}
public void remove(Object item) {
if(carts. contains(item)) {
carts.remove(item);
}
}
public List getCarts() {
//返回只读列表
return Collections.unmodifiableList(carts);
}
//不推荐这种方式
//this.getCarts().add(item);
}
17、不用new关键词创建类的实例
用new关键词创建类的实例时 , 构造函数链中的所有构造函数都会被自动调用 。但如果一个对象实现了Cloneable接口 , 我们可以调用它的clone()方法 。clone()方法不会调用任何类构造函数 。
在使用设计模式(Design Pattern)的场合 , 如果用Factory模式创建对象,则改用clone()方法创建新的对象实例非常简单 。例如,下面是Factory模式的一个典型实现:
public static Credit getNewCredit() {
return new Credit();
}
改进后的代码使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路对于数组处理同样很有用 。
18、乘法和除法
考虑下面的代码:
for (val = 0; val100000; val +=5) {
alterX = val * 8; myResult = val * 2;
}
用移位操作替代乘法操作可以极大地提高性能 。下面是修改后的代码:
for (val = 0; val100000; val += 5) {
alterX = val3; myResult = val1;
}
修改后的代码不再做乘以8的操作,而是改用等价的左移3位操作,每左移1位相当于乘以2 。相应地,右移1位操作相当于除以2 。值得一提的是,虽然移位操作速度快 , 但可能使代码比较难于理解 , 所以最好加上一些注释 。
19、在JSP页面中关闭无用的会话 。
一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用HttpServletRequest.getSession(true)这样的语句时才被创建 , 注意如果JSP没有显示的使用关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历 。由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它 。

推荐阅读