idea和javap反編譯
A. Intellij IDEA 怎麼向Eclipse一樣在編譯jar文件的時候修改jdk版本
可以試試
在jar包中,用winrar解壓一個類文件,然後在命令行下面輸入
javap -verbose classname
會輸出一些信息,大致如下:
Compiled from "HtmlCrawer.java"
public class org.eagleeye.html.HtmlCrawer extends java.lang.Object
SourceFile: "HtmlCrawer.java"
minor version: 0
major version: 50
Constant pool:
const #1 = class #2; // org/eagleeye/html/HtmlCrawer
const #2 = Asciz org/eagleeye/html/HtmlCrawer;
const #3 = class #4; // java/lang/Object
const #4 = Asciz java/lang/Object;
const #5 = Asciz client;
B. 字元拼接你選擇string.format()還是「+」來進行拼接
各位小夥伴在字元串拼接時應該都見過下面這種提示:
內容翻譯:報告 StringBuffer、StringBuilder 或 StringJoiner 的任何用法,這些用法可以用單個 java.lang.String 串聯來替換。使用字元串串聯可以使代碼更短、更簡單。只有當得到的串聯至少與原始代碼一樣高效或更高效時,此檢查才會報告。
大家普遍認知中,字元串拼接要使用 StringBuilder,那為什麼 idea 會建議你是用 「+」 呢,那到底 StringBuilder 和 「+」 有什麼具體區別呢,我們一起來探究一下。
在普通的幾個字元串拼接成一個字元串時,使用 「+」 拼接字元串,實際上,從 JDK5 開始,Java 編譯器就做了優化,使用 「+」 拼接字元串,編譯器編譯後實際就自動優化為使用 StringBuilder。新建測試類 StringTest,分別創建使用 「+」 拼接字元串和使用 StringBuilder 拼接字元串的方法;並新增 Junit 測試用例,分別調用拼接字元串 100000 次,列印耗時。執行 Junit 用例,看耗時統計輸出,差異雖小,考慮執行了 100000 次,每次耗時差異更小,程序執行有各種因素影響執行效率,基本一致。從 class 文件所在目錄,執行 javap -c StringTest.class,對 class 文件進行反編譯,查看編譯後的代碼差異。從圖上可以看出兩種拼接方法反編譯後完全一樣,執行效率自然也是一樣的。既然執行效率一樣,從代碼簡潔利於閱讀考慮,推薦使用 「+」 拼接字元串。
而在循環拼接一個字元串時,雖然 「+」 拼接字元串編譯後也會變成 StringBuilder,但是每次循環處理都會 new 一個 StringBuilder 對象,耗時會大大增加。直接使用 StringBuilder,new 一次就可以了,效率相對高。新增 2 個 Junit 測試用例,循環拼接 10000 次拼接一個字元串,執行 Junit 用例,看耗時統計輸出,差異明顯。
總結來說:
- 單純字元串拼接使用 「+」,更快更簡潔。
- 循環拼接時使用 「+」 拼接字元串效率較低,推薦使用 StringBuilder。
作者:京東零售 姜波 來源:京東雲開發者社區 轉載請註明來源