|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习JAVA的目的更多的是培养自身的工作能力,我觉得工作能力的一个核心就是:独立思考能力,因为只有独立思考后,才会有自己的见解编译Java开辟职员熟习在一个轮回中利用StringBuffer来取代串连String对象能取得最好功能。但是,多半开辟职员历来没有对照两种办法发生的字节代码的区分。在Java开辟工具包(JDK)中有一个叫做javap的工具能够告知你为何如许做能够取得最好功能。
Javap将一个类和它的办法的一些转储信息输入到尺度输入。该工具不把代码反编译为java源代码,可是它会把字节代码反汇编成为由Java假造机标准界说的字节代码指令。
在你必要检察编译器为你大概给你做了甚么的时分,大概你想要看一处代码的修改对编译后的类文件有甚么影响的时分,javap相称有效。
如今以我们后面提到的StringBuffer和String作为一个例子。上面是一个专门为例子计划的类,它有两个办法,都前往一个由0到n的数字构成的String,个中n由挪用者供应。两个办法独一的区分在于一个利用String构建了局,别的一个利用StringBuffer构建了局。
publicclassJavapTip{
publicstaticvoidmain(String[]args){}
privatestaticStringwithStrings(intcount){
Strings="";
for(inti=0;i<count;i++){
s+=i;
}
returns;
}
privatestaticStringwithStringBuffer(intcount){
StringBuffersb=newStringBuffer();
for(inti=0;i<count;i++){
sb.append(i);
}
returnsb.toString();
}
}
如今让我们看看对这个类利用?Cc选项运转javap的输入。-c选项告知javap反汇编在类中碰到的字节代码。
运转体例以下:
>javap-cJavapTip
此命令的输入为:
Methodjava.lang.StringwithStrings(int)
0ldc#2
2astore_1
3iconst_0
4istore_2
5goto30
8new#3
11dup
12invokespecial#4
15aload_1
16invokevirtual#5
19iload_2
20invokevirtual#6
23invokevirtual#7
26astore_1
27iinc21
30iload_2
31iload_0
32if_icmplt8
35aload_1
36areturn
Methodjava.lang.StringwithStringBuffer(int)
0new#3
3dup
4invokespecial#4
7astore_1
8iconst_0
9istore_2
10goto22
13aload_1
14iload_2
15invokevirtual#6
18pop
19iinc21
22iload_2
23iload_0
24if_icmplt13
27aload_1
28invokevirtual#7
31areturn
假如你之前没有看过Java汇编器,那末这个输入对你来讲就会对照难明,可是你应当能够看到withString办法在每次轮回的时分都新创立了一个StringBuffer实例。然后它将已有的String确当前值追加到StringBuffer上,然后追加轮回确当前值。最初,它对buffer挪用toString并将了局赋给现有的String援用。
withStringBuffer办法与这个办法恰好相反,在每次轮回的时分withStringBuffer只挪用现有StringBuffer的append办法,没有创立新的对象,也没有新的String援用。
在这类情形下,我们已晓得了利用StringBuffer取代String是一种好的做法,可是假如我们不晓得呢?那末javap能够匡助我们找到谜底。在这里你能够看到更具体的关于String,StringBuffer的注释
你其实不会常常必要一个Java反汇编器,可是当你必要的时分,晓得你本人的呆板已有一个而且用法相称复杂的反汇编器固然是一件功德。假如你感乐趣,看书看看javap的别的选项――也许你会发明在你的情况中必要的特征。
你通过从书的数量和开发周期及运行速度来证明:net和ruby要比java简单。 |
|