最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Java中如何避免創(chuàng)建不必要的對象

 更新時間:2021年10月25日 09:27:15   作者:李子捌  
作為Java開發(fā)者,我們每天創(chuàng)建很多對象,但如何才能避免創(chuàng)建不必要的對象呢?這需要我們好好學(xué)習(xí),這篇文章主要給大家介紹了關(guān)于在Java中如何避免創(chuàng)建不必要對象的相關(guān)資料,需要的朋友可以參考下

簡介

在Java開發(fā)中,程序員要盡可能的避免創(chuàng)建相同的功能的對象,因為這樣既消耗內(nèi)存,又影響程序運行速度。在這種情況下可以考慮重復(fù)利用對象。

接下來舉例幾種對象重復(fù)利用的場景,看看我們是不是有中招了,如果有趕緊趁著還沒被發(fā)現(xiàn)悄悄改掉,被發(fā)現(xiàn)了會被diss啦!

1、String和Boolean

如下兩種寫法看似沒有什么區(qū)別,但是如果深入jvm底層了解,我們可以利用jvm運行時常量池的特性,避免創(chuàng)建具有相同功能的String對象(尤其是在循環(huán)內(nèi)部創(chuàng)建)可以帶來比較可觀的性能優(yōu)化以及節(jié)約內(nèi)存。

錯誤寫法

// 每次都會創(chuàng)建一個新的String對象,且不會加入常量池
String name2 = new String("李子捌");

正確寫法

// 正確寫法
String name1 = "李子捌";

除此之外,剛寫Java代碼的程序員們,也要正確的選擇String、StringBuilder、StringBuffer類的使用。String為不可變對象,通常用于定義不變字符串;StringBuilder、StringBuffer用于可變字符串操作場景,如字符串拼接;其中StringBuffer是線程安全的,它通過Synchronized關(guān)鍵字來實現(xiàn)線程同步。

// StringBuffer中的append()方法
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

// StringBuilder中的append()方法
public StringBuilder append(String str) {
    super.append(str);
    return this;
}

Boolean是常用的類型,在開發(fā)中也應(yīng)該使用Boolean.valueof()而不是new Boolean(),從Boolean的源碼可以看出,Boolean類定義了兩個final static的屬性,而Boolean.valueof()直接返回的是定義的這兩個屬性,而new Boolean()卻會創(chuàng)建新的對象。

public static final Boolean TRUE = new Boolean(true);

public static final Boolean FALSE = new Boolean(false);

2、自動拆箱和裝箱

Java提供了基本數(shù)據(jù)類型的自動拆箱和裝箱功能,那是不是意味著我們可以在代碼中隨意的使用這兩個類型呢?其實理論上在代碼層面是沒得問題,不過在具體的性能方面還是有優(yōu)化的空間啦?。?!

我們來測試下性能

long start = System.currentTimeMillis();
Integer sum = 0;
for (int i = 0; i < 100000; i++) {
    sum += i;
}
System.out.println(System.currentTimeMillis() - start);

使用Integer耗時3毫秒

long start = System.currentTimeMillis();
// 修改Integer 為 int 
int sum = 0;
for (int i = 0; i < 100000; i++) {
    sum += i;
}
System.out.println(System.currentTimeMillis() - start);

使用int耗時0毫秒

因此關(guān)于自動拆箱裝箱的使用,我們其實也可以做適當?shù)目紤],畢竟有時候代碼性能就是一點點擠出來的嘛!??!

3、正則表達式

正則表達式我們經(jīng)常用于字符串是否合法的校驗,我們先來看一段簡單的代碼(大家有沒有一眼看出問題呢?我想你肯定看出來了?。。。?/p>

public static void main(String[] args) {

    String email = "1057301174@qq.com";
    String regex = "^([a-z0-9A-Z]+[-|\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$";

    long start = System.currentTimeMillis();
    for (int i = 0; i < 10000; i++) {
        email.matches(regex);
    }

    System.out.println(System.currentTimeMillis() - start);

}

執(zhí)行這段代碼的時間,一共耗時71毫秒,看似好像挺快的!

但是我們做個非常簡單的優(yōu)化,優(yōu)化后的代碼如下所示:

public static void main(String[] args) {

    String email = "1057301174@qq.com";
    String regex = "^([a-z0-9A-Z]+[-|\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$";
    Pattern pattern = Pattern.compile(regex);

    long start = System.currentTimeMillis();
    for (int i = 0; i < 10000; i++) {
        //email.matches(regex);
        pattern.matcher(email);
    }

    System.out.println(System.currentTimeMillis() - start);

}

再次執(zhí)行代碼,一共耗時1毫秒,快了70倍呀!??!

這是因為String.matches()方法在循環(huán)中創(chuàng)建時,每次都需要執(zhí)行Pattern.compile(regex),而創(chuàng)建Patter實例的成本很高,因為需要將正則表達式編譯成一個有限狀態(tài)機( finite state machine)。這種我們經(jīng)常會因為Java api提供了比較方便的方法調(diào)用而忽略了性能考究,往往不容易被發(fā)現(xiàn)。這個時候就需要優(yōu)秀的你,去“咬文嚼字”啦!

總結(jié)

到此這篇關(guān)于在Java中如何避免創(chuàng)建不必要對象的文章就介紹到這了,更多相關(guān)Java避免創(chuàng)建不必要對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解自動注冊Gateway網(wǎng)關(guān)路由配置

    詳解自動注冊Gateway網(wǎng)關(guān)路由配置

    這篇文章主要為大家介紹了自動注冊Gateway網(wǎng)關(guān)路由配置的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • IDEA JeeSite框架httpSession.invalidate()無效問題解決方案

    IDEA JeeSite框架httpSession.invalidate()無效問題解決方案

    這篇文章主要介紹了IDEA JeeSite框架httpSession.invalidate()無效問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • java通過證書訪問etcd的實現(xiàn)步驟

    java通過證書訪問etcd的實現(xiàn)步驟

    Etcd提供了多種語言的客戶端庫,本文主要介紹了java通過證書訪問etcd的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • spring boot中多線程開發(fā)的注意事項總結(jié)

    spring boot中多線程開發(fā)的注意事項總結(jié)

    spring boot 通過任務(wù)執(zhí)行器 taskexecutor 來實現(xiàn)多線程和并發(fā)編程。下面這篇文章主要給大家介紹了關(guān)于spring boot中多線程開發(fā)的注意事項,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-09-09
  • jdk中keytool的使用以及如何提取jks文件中的公鑰和私鑰

    jdk中keytool的使用以及如何提取jks文件中的公鑰和私鑰

    JKS文件由公鑰和密鑰構(gòu)成利用Java?Keytool工具生成的文件,它是由公鑰和密鑰構(gòu)成的,下面這篇文章主要給大家介紹了關(guān)于jdk中keytool的使用以及如何提取jks文件中公鑰和私鑰的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • SpringBoot 集成 activiti的示例代碼

    SpringBoot 集成 activiti的示例代碼

    這篇文章主要介紹了SpringBoot 集成 activiti的示例代碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Java線程休眠_動力節(jié)點Java學(xué)院整理

    Java線程休眠_動力節(jié)點Java學(xué)院整理

    sleep() 的作用是讓當前線程休眠,即當前線程會從“運行狀態(tài)”進入到“休眠(阻塞)狀態(tài)”。下面通過實例代碼給大家介紹Java線程休眠的知識,需要的朋友參考下吧
    2017-05-05
  • 學(xué)習(xí)Java中的List集合

    學(xué)習(xí)Java中的List集合

    這篇文章主要介紹了學(xué)習(xí)Java中的List集合,List是一個有序集合, 說是集合,其實只是只是Collection接口的一個子接口,下面關(guān)于List的相關(guān)資料 需要的小伙伴可以參考一下,希望對你有所幫助
    2022-02-02
  • 關(guān)于idea更新到2020.2.3無法創(chuàng)建web項目原因 library is not specified

    關(guān)于idea更新到2020.2.3無法創(chuàng)建web項目原因 library is not specified

    這篇文章主要介紹了關(guān)于idea更新到2020.2.3無法創(chuàng)建web項目原因 library is not specified,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Java使用join方法暫停當前線程

    Java使用join方法暫停當前線程

    這篇文章主要為大家詳細介紹了Java使用join方法暫停當前線程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04

最新評論

景洪市| 外汇| 黄龙县| 阳山县| 云南省| 思南县| 阆中市| 揭西县| 通州区| 鱼台县| 怀远县| 延长县| 隆化县| 济阳县| 林西县| 平顶山市| 昌邑市| 布尔津县| 汉中市| 酉阳| 延川县| 咸宁市| 克山县| 同心县| 随州市| 平果县| 大丰市| 台东县| 沙洋县| 昌黎县| 惠州市| 博湖县| 新干县| 永康市| 井冈山市| 鄱阳县| 舞阳县| 绿春县| 永仁县| 汝南县| 赣榆县|