锁定老帖子 主题:【总结】String in Java
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-25
liu_weiaa 写道 楼主厉害啊!
程序运行时间是用什么看的? int begin=System.currentTimeMillis(); //... program int end=System.currentTimeMillis(); System.out.println("run time="+(end-begin)+"ms"); 这只是一个粗略的计算,不同系统不同运行环境下同一程序可能结果不一样。 |
|
返回顶楼 | |
发表时间: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,呵呵 |
|
返回顶楼 | |
发表时间:2010-03-26
最后修改:2010-03-26
引用 int begin=System.currentTimeMillis();
//... program int end=System.currentTimeMillis(); System.out.println("run time="+(end-begin)+"ms"); 这只是一个粗略的计算,不同系统不同运行环境下同一程序可能结果不一样。 多谢楼主,我还以为有什么工具可以直接看呢。 |
|
返回顶楼 | |
发表时间:2010-04-07
lz讲的很好,给我们这些新手很大的帮助啊
|
|
返回顶楼 | |
发表时间:2010-04-07
<!--StartFragment -->
准确地说:String对象调用intern()方法时,如果池中不存在和String对象所代表的字符串相等的串时,将String对象的字符串值拷贝一份添加到池中,然后返回池中的引用。 |
|
返回顶楼 | |
发表时间:2010-04-13
一定要好好看看LZ的文章,对深入的了解JAVA是很有好处的。
同时很幸喜的看到《深入Java 虚拟机》这本书。晚上买来就狠狠看看。 |
|
返回顶楼 | |
发表时间:2010-09-14
感受到楼主强大的力场,终于跑去把二妹和三妹脱 光 光,看了一遍,意犹未尽啊。
|
|
返回顶楼 | |
发表时间:2010-09-25
|
|
返回顶楼 | |
发表时间:2010-10-08
帖子写得很好,有深度的剖析了String类的特色,同时也解决了很多疑问。
|
|
返回顶楼 | |
发表时间:2010-10-12
分析的够深刻。。。
真是学无止境,受教了。。。 |
|
返回顶楼 | |