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。
作者:京东零售 姜波 来源:京东云开发者社区 转载请注明来源