一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java編程代碼性能優化

Java編程代碼性能優化

2020-01-21 15:10hebedich JAVA教程

本文介紹了 Java 代碼優化的過程,總結了優化 Java 程序的一些最佳實踐,分析了進行優化的方法,并解釋了性能提升的原因,需要的朋友可以參考下

一、咱們之所以這么干的目的:  

  1.效率(最重要)

  2.可讀性,便于后期維護。(同樣很重要)

二、代碼優化的要求:

  1.減小代碼的體積。

  2.提高代碼的運行效率。

三、常用的代碼的優化:

  1、盡量重用對象 :

    特別是String對象的重用。最常用的就是字符串的拼接:

        當遇到頻繁擦拼接String時。記住一定用StringBuilder/StringBuffer

    例如:

?
1
2
3
4
5
6
7
ArrayList<String> list;
//省去list初始化。
StringBuilder builder = new StringBuilder();
for (String s : list) {
  builder.append(s);
}
String result = builder.toString();

    原因:Java虛擬機不僅要花時間生成對象,而且還要花時間處理和回收對象,生成過多對象必定會給程序性能帶來影響。

  2. 盡可能使用局部變量 :

    局部變量在棧中創建,創建速度快,用完即自動消失,不需要額外的垃圾回收。

    而靜態變量、實例變量等在堆中創建,創建速度慢,同時還依賴Java垃圾回收機制處理。

  3. 及時關閉流 :

    Java程序開發中,在對I/O,數據庫操作結束后,一定要記住關閉流。

    原因:未關閉流會對系統造成很大的開銷,甚至會對數據造成嚴重的后果。

  4. 使用懶加載

    懶加載 : 當要用的時候才創建該對象。

    例如:

?
1
2
3
4
String prefix = "gebi";
if ("laowang".equals(name)) {
  list.add(prefix + name);
}

           替換為:

?
1
2
3
4
if("laowang".equals(name)) {
  String prefix = "gebi";
  list.add(prefix + name);
}

  5.避免在循環中使用try...catch,在循環外層使用try...catch

  6.try...catch不宜太大。

    不要將無用代碼,即不會拋出異常的代碼統統放入try...catch塊中,減小try...catch代碼塊的大小。

    保證代碼的可讀性,易維護性,健壯性。

  7.循環內盡量避免創建對象的引用。

    尤其是循環量大的時候。

?
1
2
3
while (i<1000) {
  Object object = new Object();
}

            建議修改為:

?
1
2
3
Object object = null;
while (i<1000) {
  object = new Object();

    每次new Object()的時候,Object對象引用指向Object對象。

    當循環次數多的時候,如第一種,JVM會創建1000個對象的引用,而第二種內存中只有一份Object對象引用。這樣就大大節省了內存空間了。

  8.不要隨意使用static變量。

    當對象被聲明為static的變量所引用時,此時,Java垃圾回收器不會清理這個對象所占用的堆內存。

    靜態變量所占用的堆內存直到該變量所在類所在程序結束才被釋放。 即靜態變量生命周期=類生命周期。

  9.不要創建一些不使用的對象,不要導入一些不使用的類。

  10.使用帶緩沖的I/O流:

    帶緩沖的I/O流可以極大提高I/O效率。BufferedWriter, BufferedReader, BufferedInputStream, BufferedOutputStream。

  11.包裝類數據轉換為字符串使用: toString  

    Integer i = 1;

     包裝類數據轉換為字符串方法速度排名 :

       i.toString > String.valueOf(i) > "" + i 

  12.Map遍歷效率 : entrySet > keySet

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//entrySet()
for (Entry<String, String> entry : map.entrySet()) {
  String key = entry.getKey();
  String value = entry.getValue();
  System.out.println(key + " : " + value);
}
 
//上下對比
 
//keySet()
for (String key : map.keySet()) {
String value = map.get(key);
System.out.println(key + " : " + value);
}

  13.關于Iterator與forEach()的集合遍歷舍取。

    算法導論上說:算法是為了提高空間效率和時間效率。但往往時間和空間不能并存。

    時間效率:Iterator > forEach()

    代碼可讀性 : forEach() > Iterator

?
1
2
3
4
5
6
7
8
9
10
//Iterator
Set<Entry<String, String>> entrySet = map.entrySet();
Iterator<Entry<String, String>> iter = entrySet.iterator();
 
while (iter.hasNext()) {
  Entry<String, String> entry = iter.next();
  String key = entry.getKey();
  String value = entry.getValue();
  System.out.println(key + " : " + value);
 }

    對比:

?
1
2
3
4
5
6
//forEach()
for (Entry<String, String> entry : map.entrySet()) {
  String key = entry.getKey();
  String value = entry.getValue();
  System.out.println(key + " : " + value);
}

            個人認為:當處理大數據時推薦使用Iterator遍歷集合。

         但處理小數據的話,為了可讀性和后期維護還是使用forEach()。

         兩者結合使用,都應該掌握。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品久久久久久久午夜片 | 四虎永久免费地址在线观看 | 亚洲spank男男实践网站 | 日本xxwwwxxxx| 视频在线网站 | 91精品国产99久久 | 国产一级持黄大片99久久 | beeg日本高清xxxx18 | 天天干天天操天天碰 | 国产精品拍拍拍福利在线观看 | 天天有好逼 | 成人做视频免费 | 国内精品视频一区二区三区八戒 | xxx95日本老师xxx学生 | 欧美日韩精彩视频 | 果冻传媒第一二三专区 | 天堂在线观看中文字幕 | 九九99亚洲精品久久久久 | tube69xxxxhd日本 | 高h巨肉play 高h短篇辣肉各种姿势bl | 亚洲欧美日韩特级毛片 | 国产精品久久久久一区二区三区 | 高清麻生希在线 | 欧美人shou交在线播放 | 疯狂激吻添下边小说 | 99热这里只有精品在线播放 | 羞羞麻豆国产精品1区2区3区 | 粗了大了 整进去好爽视频 刺激一区仑乱 | 精品在线免费观看 | 操mm| 女教师系列三上悠亚在线观看 | 国产卡一卡二卡三乱码手机 | 大肚孕妇的高h辣文 | 亚洲欧美成人综合 | 亚洲AVAV天堂AV在线网爱情 | 99ri国产在线观看 | 亚洲AV 日韩 国产 有码 | 色综合97天天综合网 | 日本大巴车强thepro | 亚洲AV久久久噜噜噜久久 | 亚洲国产精品无圣光一区二区 |