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

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

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 在Java中如何避免創建不必要的對象

在Java中如何避免創建不必要的對象

2022-02-27 15:14李子捌 Java教程

作為Java開發者,我們每天創建很多對象,但如何才能避免創建不必要的對象呢?這需要我們好好學習,這篇文章主要給大家介紹了關于在Java中如何避免創建不必要對象的相關資料,需要的朋友可以參考下

 

簡介

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

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

 

1、String和Boolean

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

錯誤寫法

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

正確寫法

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

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

// 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是常用的類型,在開發中也應該使用Boolean.valueof()而不是new Boolean(),從Boolean的源碼可以看出,Boolean類定義了兩個final static的屬性,而Boolean.valueof()直接返回的是定義的這兩個屬性,而new Boolean()卻會創建新的對象。

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

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

 

2、自動拆箱和裝箱

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

我們來測試下性能

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

使用Integer耗時3毫秒

在Java中如何避免創建不必要的對象

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毫秒

在Java中如何避免創建不必要的對象

因此關于自動拆箱裝箱的使用,我們其實也可以做適當的考慮,畢竟有時候代碼性能就是一點點擠出來的嘛!!!

 

3、正則表達式

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

public static void main(String[] args) {

    String email = "[email protected]";
    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);

}

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

在Java中如何避免創建不必要的對象

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

public static void main(String[] args) {

    String email = "[email protected]";
    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);

}

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

在Java中如何避免創建不必要的對象

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

 

總結

到此這篇關于在Java中如何避免創建不必要對象的文章就介紹到這了,更多相關Java避免創建不必要對象內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/7022078337837170701

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本特黄一级大片 | 精品亚洲欧美中文字幕在线看 | 国产实拍会所女技师在线 | 乌克兰呦12~14 | ipx 在线播放| 国内精品一区视频在线播放 | 4438全国最大成人网视频 | yjzz视频| 国产91影院 | 日本国产高清色www视频在线 | 嫩草影院精品视频在线观看 | 好男人资源在线观看免费的 | 91免费永久在线地址 | 麻豆婷婷 | 国产精品久久久久久久久久久久久久 | 国产精品一区牛牛影视 | 天天天做天天天天爱天天想 | 国产免费大片 | 奶茶视频有容乃大 | 韩国靠逼 | 亚洲v日韩v欧美在线观看 | 九九热在线观看视频 | 欧美日韩成人在线 | 精品国产一区二区三区在线观看 | 久久久亚洲国产精品主播 | 阿 好深 快点 老师受不了 | 亚洲视频在线一区二区 | 蜜色影院 | 国产在线步兵一区二区三区 | 青草青青在线视频 | 国产精品1024永久免费视频 | 好大好深视频 | 国产乱人乱精一区二区视频密 | 四虎影院永久网站 | 学校女性奴sm训练调教 | 催眠白丝舞蹈老师小说 | 四虎精品成人免费视频 | 91久久综合九色综合欧美98 | 好姑娘完整版在线观看中文 | 亚洲精品青青草原avav久久qv | 国产精品99久久 |