搜尋
首頁Javajava教程如何優化Java程式碼,在工作上有哪些實用技巧可用?

1.類別成員與方法的可見性最小化

範例:如果是一個private的方法,想刪除就刪除

如果一個 publicservice方法,或是public的成員變量,刪除一下,不得思考很多。

2.使用位移操作替代乘除法

計算機是使用二進位表示的,位移操作會大大提高性能。

> 右移相當於除以2;

>>> 無符號右移相當於除以2,但它會忽略符號位,空位都以0 補齊。

a = val << 3;
b = val >> 1;

3.盡量減少對變數的重複計算

我們知道對方法的呼叫是有消耗的,包括創建堆疊幀、調用方法時保護現場,恢復現場等。

//反例
for (int i = 0; i < list.size(); i++) {
  System.out.println("result");
}
//正例
for (int i = 0, length = list.size(); i < length; i++) {
  System.out.println("result");
}

list.size()很大的時候,就減少了很多的消耗。

4.不要捕捉RuntimeException

RuntimeException 不應該透過 catch 語句去捕捉,而應該使用編碼手段進行規避。

如下面的程式碼,list 可能會出現陣列越界異常。

是否越界是可以透過程式碼提前判斷的,而不是等到發生異常時去捕捉。

事先判斷這種方式,程式碼會更優雅,效率也更高。

public String test1(List<String> list, int index) {
    try {
        return list.get(index);
    } catch (IndexOutOfBoundsException ex) {
        return null;
    }
}
//正例
public String test2(List<String> list, int index) {
    if (index >= list.size() || index < 0) {
        return null;
    }
    return list.get(index);
}

5.使用局部變數可避免在堆上分配

由於堆資源是多執行緒共享的,是垃圾回收器工作的主要區域,過多的物件會造成GC 壓力,可以透過局部變數的方式,將變數在堆疊上分配。這種方式變數會隨著方法執行的完畢而銷毀,能夠減輕 GC 的壓力。

6.減少變數的作用範圍

注意變數的作用範圍,盡量減少物件的建立。

如下面的程式碼,變數 s 每次進入方法都會創建,可以將它移到 if 語句內部。

public void test(String str) {
    final int s = 100;
    if (!StringUtils.isEmpty(str)) {
        int result = s * s;
    }
}

7.懶載入策略

盡量採用懶載入的策略,在需要的時候才建立

String str = "月伴飞鱼";
if (name == "公众号") {
  list.add(str);
}
if (name == "公众号") {
  String str = "月伴飞鱼";
  list.add(str);
}

8.存取靜態變數直接使用類別名稱

使用物件存取靜態變量,這種方式多了一步尋址操作,需要先找到變數對應的類,再找到類別對應的變數。

 // 反例
int i = objectA.staticMethod();
 // 正例
int i = ClassA.staticMethod();

9.字串拼接使用StringBuilder

字串拼接,使用 StringBuilder 或 StringBuffer,不要使用 號。

//反例
public class StringTest {
    @Test
    public void testStringPlus() {
        String str = "111";
        str += "222";
        str += "333";
        System.out.println(str);
    }
}
//正例
public class TestMain {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("111");
        sb.append("222");
        sb.append(333);
        System.out.println(sb.toString());
    }
}

10.重寫物件的HashCode

重寫物件的HashCode,不要簡單地回傳固定值

有同學在開發重寫HashCode 和Equals 方法時,會把HashCode 的值回傳固定的0,而這樣做是不恰當的

當這些物件存入HashMap 時,效能就會非常低,因為HashMap 是透過HashCode 定位到Hash 槽,有衝突的時候,才會使用鍊錶或紅黑樹組織節點,固定地回傳0,相當於把Hash 位址功能無效了。

11.HashMap等集合初始化

HashMap等集合初始化的時候,指定初始值大小

這樣的物件有很多,例如ArrayList,StringBuilder 等,透過指定初始值大小可減少擴容造成的性能損耗。

初始值大小計算:

如何優化Java程式碼,在工作上有哪些實用技巧可用?

#12.循環內建立物件參考

循環內不要不斷建立物件參考

//反例
for (int i = 1; i <= size; i++) {
    Object obj = new Object();    
}
//正例
Object obj = null;
for (int i = 0; i <= size; i++) {
    obj = new Object();
}

第一種會導致記憶體中有size個Object物件參考存在,size很大的話,就耗費記憶體了

13.遍歷Map 使用EntrySet 方法

使用EntrySet 方法,可以直接返回set 對象,直接拿來用即可;而使用KeySet 方法,得到的是key 的集合,需要再進行一次get 操作,多了一個操作步驟,所以更建議使用EntrySet 方式遍歷Map。

Set<Map.Entry<String, String>> entryseSet = nmap.entrySet();
for (Map.Entry<String, String> entry : entryseSet) {
    System.out.println(entry.getKey()+","+entry.getValue());
}

14.不要在多執行緒下使用同一個Random

Random 類別的seed 會在並發存取的情況下發生競爭,造成效能降低,建議在多執行緒環境下使用ThreadLocalRandom類。

 public static void main(String[] args) {
        ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();
        Thread thread1 = new Thread(()->{
            for (int i=0;i<10;i++){
                System.out.println("Thread1:"+threadLocalRandom.nextInt(10));
            }
        });
        Thread thread2 = new Thread(()->{
            for (int i=0;i<10;i++){
                System.out.println("Thread2:"+threadLocalRandom.nextInt(10));
            }
        });
        thread1.start();
        thread2.start();
    }

15.自增推薦使用LongAddr

自增運算可以透過synchronized volatile 的組合來控制執行緒安全,或者也可以使用原子類別(例如AtomicLong)。

後者的速度比前者高一些,AtomicLong 使用CAS 進行比較替換,在線程多的情況下會造成過多無效自旋,可以使用LongAdder 替換AtomicLong 進行進一步的性能提升。

public class Test {
    public int longAdderTest(Blackhole blackhole) throws InterruptedException {
        LongAdder longAdder = new LongAdder();
        for (int i = 0; i < 1024; i++) {
            longAdder.add(1);
        }
        return longAdder.intValue();
    }
}

16.程式中要少用反射

反射的功能很強大,但它是透過解析字節碼實現的,效能就不是很理想。

現實中有很多對反射的最佳化方法,例如把反射執行的過程(例如 Method)快取起來,使用複用來加快反射速度。

Java 7.0 之後,加入了新的套件java.lang.invoke#,同時加入了新的JVM 字節碼指令invokedynamic,用來支援從JVM 層面,直接透過字串對目標方法進行呼叫。

以上是如何優化Java程式碼,在工作上有哪些實用技巧可用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
JVM如何促進Java的'寫作一次,在任何地方運行”(WORA)功能?JVM如何促進Java的'寫作一次,在任何地方運行”(WORA)功能?May 02, 2025 am 12:25 AM

JVM通過字節碼解釋、平台無關的API和動態類加載實現Java的WORA特性:1.字節碼被解釋為機器碼,確保跨平台運行;2.標準API抽像操作系統差異;3.類在運行時動態加載,保證一致性。

Java的較新版本如何解決平台特定問題?Java的較新版本如何解決平台特定問題?May 02, 2025 am 12:18 AM

Java的最新版本通過JVM優化、標準庫改進和第三方庫支持有效解決平台特定問題。 1)JVM優化,如Java11的ZGC提升了垃圾回收性能。 2)標準庫改進,如Java9的模塊系統減少平台相關問題。 3)第三方庫提供平台優化版本,如OpenCV。

說明JVM執行的字節碼驗證的過程。說明JVM執行的字節碼驗證的過程。May 02, 2025 am 12:18 AM

JVM的字節碼驗證過程包括四個關鍵步驟:1)檢查類文件格式是否符合規範,2)驗證字節碼指令的有效性和正確性,3)進行數據流分析確保類型安全,4)平衡驗證的徹底性與性能。通過這些步驟,JVM確保只有安全、正確的字節碼被執行,從而保護程序的完整性和安全性。

平台獨立性如何簡化Java應用程序的部署?平台獨立性如何簡化Java應用程序的部署?May 02, 2025 am 12:15 AM

Java'splatFormIndepentEncealLowsApplicationStorunonAnyOperatingsystemwithajvm.1)singleCodeBase:writeandeandcompileonceforallplatforms.2)easileupdates:updatebybytecodeforsimultanane deployment.3)testOnOneOnePlatForforurouniverSalpeforuluniverSalpehavior formafforulululyiversalivernave.444.44.444

Java的平台獨立性如何隨著時間的流逝而發展?Java的平台獨立性如何隨著時間的流逝而發展?May 02, 2025 am 12:12 AM

Java的平台獨立性通過JVM、JIT編譯、標準化、泛型、lambda表達式和ProjectPanama等技術不斷增強。自1990年代以來,Java從基本的JVM演進到高性能的現代JVM,確保了代碼在不同平台的一致性和高效性。

在Java應用程序中緩解平台特定問題的策略是什麼?在Java應用程序中緩解平台特定問題的策略是什麼?May 01, 2025 am 12:20 AM

Java如何緩解平台特定的問題? Java通過JVM和標準庫來實現平台無關性。 1)使用字節碼和JVM抽像操作系統差異;2)標準庫提供跨平台API,如Paths類處理文件路徑,Charset類處理字符編碼;3)實際項目中使用配置文件和多平台測試來優化和調試。

Java的平台獨立性與微服務體系結構之間有什麼關係?Java的平台獨立性與微服務體系結構之間有什麼關係?May 01, 2025 am 12:16 AM

java'splatformentenceenhancesenhancesmicroservicesharchitecture byferingDeploymentFlexible,一致性,可伸縮性和便攜性。 1)DeploymentFlexibilityAllowsibilityAllowsOllowsOllowSorlowsOllowsOllowsOllowSeStorunonAnyPlatformwithajvM.2)penterencyCrossServAccAcrossServAcrossServiCessImplifififiesDeevelopmentandeDe

GRAALVM與Java的平台獨立目標有何關係?GRAALVM與Java的平台獨立目標有何關係?May 01, 2025 am 12:14 AM

GraalVM通過三種方式增強了Java的平台獨立性:1.跨語言互操作,允許Java與其他語言無縫互操作;2.獨立的運行時環境,通過GraalVMNativeImage將Java程序編譯成本地可執行文件;3.性能優化,Graal編譯器生成高效的機器碼,提升Java程序的性能和一致性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器