標簽:class java size string ext tab get log type ble set
右括号”) ”与其后面的关键字之间,关键字与其后面的左括号”(”或”{”之间,以及”}”与”{”之间,要以一个空格隔开;除”. ”外,所有二元操作符的前、后要加空格;在逗号后边加一个空格。
說明:
一個緊跟著括號的關鍵詞應該被空格分開;
空白應該位于參數列表中逗號的後面;
所有的二元運算符,除了“.”,應該使用空格將之與操作數分開。一元操作符和操作數之間不應該加空格,比如:負號(“-”),自增(“++”)和自減(“--”);
for語句中的表達式應該被空格分開;
強制轉型後應該跟一個空格。
空格不應該置于方法名與其左括號之間,這將有助于區分關鍵字和方法調用;
示例:
for (int i = 0; i <= 10; i++) {
...
}
double xNorm = y > 0.0 ? (x / y) : x;
一個Java文件代碼不宜太長,一般建議500行以內(不包括注釋),客戶端GUI相關Java文件可以稍長,但超過2000行的程序難以閱讀,應該盡量避免。
1.考慮將代表基礎數據類型的類聲明爲final的。
說明:以提高调用效率。
带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指 定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联 (inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%。
2. 定义小型的类和方法。
說明:要尽量减少类中的方法数,在能够满足需要的情况下避免再增加多余的方法。一个方法只实现一个功能,不要设计多用途、面面俱到的方法。对于过大的类或方法,要考虑将其重构到更多的类或方法中。
3. 所有的成员都应该是私有的,通过对象方法来访问。
說明:以保证只有成员所属的类才能对它们作变更,从而使对象间的耦合性最小,程序易于维护。
4. 利用多态性来取代”instanceof”。
說明:用”instanceof”来判断对象类型的代码,必须随着可选对象类型的变化而改变,这样的代码是不稳定、不易于维护的。因此要使用多态,避免使用”instanceof”。
5. 用等效的方法替换重复的语句。
說明:代码应该只写一次。对于拷贝粘贴生成的重复代码,必须将其重构到一个方法或类中,来消除它们。
將一般操作重構爲一個方法或類,使代碼更易于理解和維護,同時可減少測試的工作量。
6. 在控制流结构中使用块语句(即用{}括起来),而不要用表达式语句。当控制流中只有一个语句,并有助于提高可读性时,可将整个控制语句放在一行中。
說明:以减少相邻控制结构造成的代码不明确。
注意:當name爲null時,”Bob”.equals(name)不會抛出異常,因此不建議使用name.equals(”Bob”)。
7. 不要悄无声息地吸收运行时异常,catch中要有相应的处理。
說明:如数组越界等,会为debug带来了困难,至少应打印出栈信息,报告异常。
8. 后台模块的调试打印语句,一定要设置开关。可采用命令行输入条件、配置文件设置条件等方式。
9. 用finally块释放资源。
說明:如I/O流、數據庫连接等。
10. 避免同步。
說明:只在确实有必要时使用同步。不要同步提供基础数据类型或数据结构的类。
11. 如果方法中有不需要同步的重要操作,不要同步整个方法。
說明:通常只有方法中的少量操作需要同步,在这种情况下,方法级的同步就过粗了。应用同步的块语句来替代方法级的同步。
12. 在读写实例变量时避免不必要的同步。
說明:对原子数据(对象引用、除long和double外的所有原始数据类型)的读或写是原子操作,不需要同步。但如果原子变量与其他变量相关,则有必要同步。
12. 考虑用notify()取代notifyAll()。
說明:notify()的效率更高。当多个线程等待不止一个条件,或者多个线程要对一个信号量作出响应时,才使用notifyAll()。
13. 使用懒惰初始化。
說明:即在声明时并不创建对象,以免编译不需要的对象,从而提高程序效率。但要注意的是对于局部变量,尽量在声明局部变量的同时进行初始化。唯一不这么做的理由是变量的初始值依赖于某些先前发生的计算。
14. 避免创建不必要的对象。
說明:这一点对不太使用或生命周期短的对象尤其重要。创建和回收不必要的对象会浪费运行时间。
舉例:
A a = new A();
if(1 == i) {
list.add(a);
}
應該改爲
if(1 == i) {
A a = new A();
list.add(a);
}
15. 重新初始化和重用对象,避免创建新的对象。
說明:用存取方法,而不是构造器,来重新初始化对象。
要注意,選用的實現應無需創建對象來管理保存對象。可使用工廠實現封裝對對象的保存和重用。
16. 对公共方法、接口的优化要慎重。
說明:对代码的优化不应影响到公共的方法和接口,要保证公共方法和接口的稳定,除非确定有必要对它们进行优化。
17. import时尽量引用实际的类名,不要用”*”号。可以使用Eclipse快捷键(默认为Ctrl+Shift+O)自动导入所需的类、除去多余的导入。
18. 尽量在合适的场合使用单例。
說明:使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:
1) 控制资源的使用,通过线程同步来控制资源的并发访问;
2) 控制实例的产生,以达到节约资源的目的;
3) 控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。
19. 尽量避免随意使用静态变量。
說明:当某个对象被定义为static变量所引用,那么GC通常是不会回收这个对象所占有的内存。
舉例:
public class A{
static B b = new B();
}
此時靜態變量b的生命周期與A類同步,如果A類不會卸載,那麽b對象會常駐內存,直到程序終止。
20. 注意静态方法,静态类,静态成员变量的使用。
錯誤的做法:
Public class A {
Private Static xxxType B;
Public static void functionA() {
………;
B.XXXXX;
}
}
類中有一個靜態成員變量,方法functionA中需要使用該變量,則functionA必須是靜態方法。這樣,需要new一個classA,,調用classA.functionA,會由于多個類的實例在內存駐留,導致出現各種問題。
正確的兩種寫法:
1) 将类定义为静态类,直接调用classA.functionA
2) 将方法定义为非静态方法,成员变量定义为非静态变量,每次new一个classA,需要长期持有的变量可通过构造函数传入(但是不能作为类内部的成员保存下来)。
說明:调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量,实例变量等,都在堆(Heap)中创建,速度较慢。
舉例:
for(int i = 0; i < list.size(); i++)
應該改爲
for(int i = 0, len = list.size(); i < len; i++)
並且在循環中應該避免使用複雜的表達式,在循環中,循環條件會被反複計算,如果不使用複雜表達式,而使循環條件值不變的話,程序將會運行的更快。
說明:HashTable,Vector等使用了同步机制,降低了性能。
說明:当要创建一个比较大的hashMap时,充分利用另一个构造函数
public HashMap(int initialCapacity, float loadFactor)
避 免HashMap多次进行了hash重构,扩容是一件很耗费性能的事,在默认中initialCapacity只有16,而loadFactor是0.75,需要多大的容量,最好能准确的估计所需要的最佳大小,同样的Hashtable、Vector也是一样的道理。
說明:"/"和"*"都是代价很高的操作,使用移位的操作将会更快和更有效。
說明:StringBuffer的构造器会创建一个默认大小(通常是16)的字符数组。在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。在大多数情况下,可以在创建StringBuffer的时候指定大小,这样就避免了在容量不够的时候自动增长,以提高性能。
說明:大部分时候,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部、引用变量显式设为null。但如果方法内需要执行耗时、耗内存的操作,就有必要将对象赋值为null,可以尽早的释放对对象的引用。
說明:二维数据占用的内存空间比一维数组多得多,大概10倍以上。
說明:除非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char),频繁split的可以缓存结果。
說明:一个是线性表,一个是链表,随机查询尽量使用ArrayList,ArrayList优于LinkedList,LinkedList还要移动指针;添加删除的操作LinkedList优于ArrayList,ArrayList还要移动数据。
說明:实际上,将资源清理放在finalize方法中完成是非常不好的选择,由于GC的工作量很大,尤其是回收Young代内存时,大都会引起应用程序暂停,所以再选择使用finalize方法进行资源清理,会导致GC负担更大,程序运行效率更差。
說明:String的以下两个方法会产生字符集的问题,如下:
new String(bytes)
getBytes()
正確的做法:
調用這兩個方法時,會使用JVM默認字符集,因此不同的操作系統下會返回不同的結果,因此必須對在使用String以上兩個方法的地方逐一修改,使用以下兩個方法:
new String(bytes , NAME_OF_CHARSET)
getBytes( NAME_OF_CHARSET)
其中,NAME_OF_CHARSET表示字符集編碼方式。實例:
// 根据默认编码获取字节数组
byte[] bytes=new byte[0];
try {
bytes = str.getBytes("GB18030");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
logger.error(e);
}
關于選用何種字符集?需要根據需求確定,比如需要解析的數據(MIB節點)只支持英文,可選用”ISO-8859-1”。
錯誤的寫法:
Connection conn = DBConnectionManager.getConnection(); // (1)
try{
String sql = "xxxx";
PreparedStatement pt = conn.prepareStatement(sql); // (2)
ResultSet rs = pt.executeQuery(sql); // (3)
while(rs.next()) {
xxxxx;
}
rs.close(); // (4)
pt.close(); // (5)
} catch(Exception e) {
logger.error(e);
} finally {
try {
conn.close();
} catch (Exception e) {
logger.error(e);
}
}
注意以上標記有數字的注釋部分,在try子句內抛異常時有可能引起rs和pt/st沒有關閉。因此建議把聲明和初始化分開,把聲明提到try子句外面去,在finally子句裏面用:
DBConnectionManager.getInstance().free(conn,pt,rs)
來確保全部都能夠關閉。(free方法在釋放資源前有對null的校驗,不用擔心抛空指針)。
正確的書寫方式如下:
Connection conn = DBConnectionManager.getConnection(); // (1)
PreparedStatement pt = null; // (2)
ResultSet rs = null; // (3)
try{
if(conn != null) {
String sql = "xxxx";
pt = conn.prepareStatement(sql); // (4)
rs = pt.executeQuery(sql); // (5)
while(rs.next()) {
xxxxx;
}
}
} catch(Exception e) {
logger.error(e);
} finally {
DBConnectionManager.getInstance().free(conn, pt, rs); // (6)
}
舉例:
fooBar.fChar = barFoo.lchar = ‘c’;
這種寫法是不推薦的。
舉例:
if (booleanException) {
return true;
else {
return false;
}
應該代之以如下方法:
return booleanException;
類似地:
if (condition) {
return x;
}
return y;
應該寫爲:
return (condition ? x : y);
標簽:class java size string ext tab get log type ble set
原文地址:http://www.cnblogs.com/lnlvinso/p/3694641.html