论坛首页 综合技术论坛

【总结】String in Java

浏览 37154 次
该帖已经被评为良好帖
作者 正文
   发表时间:2010-03-25  
liu_weiaa 写道
楼主厉害啊!
程序运行时间是用什么看的?


int begin=System.currentTimeMillis();
//... program
int end=System.currentTimeMillis();

System.out.println("run time="+(end-begin)+"ms");

这只是一个粗略的计算,不同系统不同运行环境下同一程序可能结果不一样。
0 请登录后投票
   发表时间:2010-03-25  
(3) 操作码助忆符指令集
     将String s=new String("Hello world");编译成class文件后的指令(由eclipse打开class文件查看的):
Class字节码指令集代码

0  new java.lang.String [15]  
3  dup
4  ldc <String "Hello word"> [17] 
6  invokespecial java.lang.String(java.lang.String) [19]
9  astore_1 [s]
10  return


    下面通俗的解释一下这些指令,详细见《深入Java虚拟机》第二版附表:按操作码助忆符排列的指令集。
    ★ new指令: 在内存的堆区域中为新字符串对象分配足够大的空间,并将对象的实例变量设为默认值。
    ★ ldc指令:在内存的方法区常量池中找到String类型字面值常量表 的入口,然后定位到的"Hello word"所在内存中的位置。
在类的常量池表中查找"Hello world"这个字符串,位置就是后面跟的17,然后把这个字符串的地址再压入栈顶

    ★ invokespecial指令:调用指定的类构造器(这里调用的是String(String)这一个构造器。将ldc指令所找到的"Hello word"的内容传入到new指令所开辟在堆中的字符串对象中。(这个指令完成后会把String对象的地址放在当前方法的栈的栈顶)
    ★ astore_1:将new指令所开辟堆的内存位置存入局部变量s中 。
这个指令应该是把得到的String对象的地址存入局部变量1中,不是S,呵呵
0 请登录后投票
   发表时间:2010-03-26   最后修改:2010-03-26
引用
int begin=System.currentTimeMillis();
//... program
int end=System.currentTimeMillis();

System.out.println("run time="+(end-begin)+"ms");

这只是一个粗略的计算,不同系统不同运行环境下同一程序可能结果不一样。


多谢楼主,我还以为有什么工具可以直接看呢。
0 请登录后投票
   发表时间:2010-04-07  
lz讲的很好,给我们这些新手很大的帮助啊
0 请登录后投票
   发表时间:2010-04-07  
<!--StartFragment -->

 

准确地说:String对象调用intern()方法时,如果池中不存在和String对象所代表的字符串相等的串时,将String对象的字符串值拷贝一份添加到池中,然后返回池中的引用。 

0 请登录后投票
   发表时间:2010-04-13  
一定要好好看看LZ的文章,对深入的了解JAVA是很有好处的。
    同时很幸喜的看到《深入Java 虚拟机》这本书。晚上买来就狠狠看看。
0 请登录后投票
   发表时间:2010-09-14  
感受到楼主强大的力场,终于跑去把二妹和三妹脱 光 光,看了一遍,意犹未尽啊。
0 请登录后投票
   发表时间:2010-09-25  
0 请登录后投票
   发表时间:2010-10-08  
帖子写得很好,有深度的剖析了String类的特色,同时也解决了很多疑问。
0 请登录后投票
   发表时间:2010-10-12  
分析的够深刻。。。
真是学无止境,受教了。。。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics