這個太簡單了,我也不會
假設 userId 是 int 型,想 要一個 String 型別的 userId,String.valueOf(userId) 更好還是 userId + "" 更好。
最近有同學問了這樣一個問題,咋一看似乎只是一個打碼風格問題,但是如果非讓你選一個好的怎麼辦呢,還是得測試一下呀。
簡單的模擬一下場景:
//寫法一:
public class Test{
public static void main(String[] args){
int i=0;
System.out.println(i + "");
}
}
//寫法二:
public class Test2{
public static void main(String[] args){
int i=1;
System.out.println(String.valueOf(1));
}
}
單從寫法上我是更傾向於第二種寫法的,雖然多寫幾個字母但我認為這樣更符合編碼的習慣,畢竟➕一個空字元總感覺多了一些什麼奇怪的東西。
但是這樣說很蒼白無力啊,誰也說服不了,為了證明我的喜好更好,來看看位元組碼。
zeal-pc:test zeal$ javap -c Test
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
5: new #3 // class java/lang/StringBuilder
8: dup
9: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
12: iload_1
13: invokevirtual #5 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
16: ldc #6 // String
18: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
27: return
}
zeal-pc:test zeal$ javap -c Test2
Compiled from "Test2.java"
public class Test2 {
public Test2();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
5: iconst_1
6: invokestatic #3 // Method java/lang/String.valueOf:(I)Ljava/lang/String;
9: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
12: return
}
嗯,第一個比第二個長,我贏了。
還有就是,“+”在編譯期會被用StringBuilder來實現這個想必大家都是知道的,從第一個可以看到程式碼執行了兩次append方法,而第二個只是執行了一個valueOf方法。同時對比StringBuilder和String的原始碼可以發現append裡面執行了一次getChars方法(ensureCapacityInternal陣列拷貝這種情況並不會觸發;append int是讀表操作,append string是陣列拷貝),valueOf裡只是執行了一次getChars(讀表)方法。
總結一下String.valueOf 速度更快,寫法更優雅。
然而寫法一在現在的多核多G機器上也並不會有啥影響。
相關文章
- springboot + rabbitmq 做智慧家居,我也沒想到會這麼簡單Spring BootMQ
- Python爬蟲入門並不難,甚至進階也很簡單,掌握了這些就簡單了Python爬蟲
- Redis 也支援全文搜尋?這也太強了Redis
- 我也沒想到 Springboot + Flowable 開發工作流會這麼簡單Spring Boot
- 我用這個 AI 工具生成單元測試,簡直不要太爽!AI
- 簡單的單例模式其實也不簡單單例模式
- 👅媽媽在也不用擔心我不會寫介面了
- oracle增加主鍵也不會了Oracle
- 別問了,我真的不喜歡這個註解!
- "人機"對戰:電腦太簡單了,我是射手 skr~skr~skr
- 這個 bug 讓我更加理解 Spring 單例了Spring單例
- 我太菜了
- 這 個 鍋 我 不 背
- Android螢幕適配很麻煩嗎?不!太簡單了。。。(持續更新)Android
- 3 月書訊丨如果我早點看到這套書,數學也不會學成這個鬼樣子
- 我是學習了c#(不算精通),又轉戰php的,看了下php的框架laravel,感覺這個作者也太牛了C#PHP框架Laravel
- noip模擬29[簡單的板子題](雖然我不會)
- 面試官問我會不會Elasticsearch,我語塞了...面試Elasticsearch
- 會用Docker的人都別裝了,這多簡單吶Docker
- 美團的這些AI應用,倒把我給整不會了AI
- 這個教程,真的讓我學會了正規表示式
- springboot + rabbitmq 做智慧家居,我也沒想到會這Spring BootMQ
- 簡單的 for 迴圈也會踩的坑
- 面試了一個 5 年 Java 程式設計師,一個問題也不會。。面試Java程式設計師
- 【圖文並茂】 做開發這麼久了,還不會搭建伺服器Maven私有倉庫?這也太Low了吧伺服器Maven
- 【圖文並茂】做開發這麼久了,還不會搭建伺服器Maven私有倉庫?這也太Low了吧伺服器Maven
- JVM,我就不信學不會你了JVM
- 太牛了,這個待辦事項清單工具讓你告別加班。
- 這 5 個簡單的面試題,把群炸了面試題
- 有了這個平臺,企業開發應用更簡單了!
- 原來我也可以這麼優秀(一)一個簡單的極限測試(還在修訂中)
- 我也列個閱讀計劃清單
- ChatGPT這波熱潮會不會讓我失業?ChatGPT
- 這篇 Java 基礎,我吹不動了Java
- 這幾個換臉 GitHub 專案太牛了!Github
- 我不寫單元測試,被批了
- ???又一個管理端框架上線了,設計理念簡單而不簡約框架
- 我們實在太難了——