String str="abc";
隐含创建一个“abc”的String对象
并把它作为str的引用
str="abcaa";
创建一个“abcaa”的String对象
并把vstr的引用改为这个对象这时“abc”不再被引用,等着被GC回收
隐含创建一个“abc”的String对象
并把它作为str的引用
str="abcaa";
创建一个“abcaa”的String对象
并把vstr的引用改为这个对象这时“abc”不再被引用,等着被GC回收
解决方案 »
- 有人介绍杭州做java的和上海的区别不?
- 请问Visual Web JSF全局bean,如何在java代码中访问?
- 求救!!!!!!!!!
- java调用webServices出现如下错误,请大侠支招啊
- itext 报表在不同的服务器上产生的格式不一样,晕死了
- 请教各位大虾——请教asant工具使用!
- 怎么测试JSP页面是否已经释放连接池?(急!!!!!!!!!!!!!!!!)
- 50分,大家帮我配置好java&XML运行环境,可以运行就给分
- hibernate+struts,frameset ,session丢失
- jar包
- 我们为您提供专业优惠的虚拟主机,价格绝对国内最低
- Tomcat4.1.30下站点的建立问题
那麼,String str=new String("abc");和String str="abc";之間有什麼區別?
String a="g";
String b="a";
(a==b)为真的事实
然后会分配空间来存储字符串str的值abc
占用的这锻地址空间直到没有任何指针指向它然后被回收这个过程中,他的地址空间,长度,值都是不变的。
你說的
假如是String a=new String("gg")(這種情況是在堆中創建);则要被回收,否則如果是
String str="abc";則不會被回收,對于這种情況我在看thinking in java中看到過這一點,在這里謝謝你再次提醒我.
但是我有一點還是不是很明白:
如果是String str="abc";以這种方式創建的字符串對象不是在堆中創建,您說它是在JVM中分配的另外一塊空間,那它究竟是在什么地方創建(寄存器/棧/靜態存儲/非RAM存儲或是別的地方)?
另外,它在創建之後如果不會被GC回收,那它豈不是會在內存中一直存在,最終會導致內存溢出嗎?
對於以上兩种情況,請你能繼續關注我的問題,謝謝!
回来的路上仔细想想
发现说错了
所以到家赶紧上网纠正,免得被骂^_^(看来已经被骂了)对于String str="abc";
最后一句说错,不是被GC回收但是shangqiao(伤桥)有个地方也说错了
String a=new String("gg")不只是在堆中创建
准确的说是在堆中创建“gg”,然后复制到栈中的a对象中,这就是复制过程
而String str="abc";是直接在栈中创建所以,无论是String str="abc";中的str
还是String a=new String("gg")中的a
都是在创建它们的类或者线程的私有栈中生存,其生存周期同创建它们类或线程
当创建它们的类或线程死掉,它们也从栈中弹出,私有变量栈消失关于这个问题可以看看java rules里面有涉及,但翻译的太烂,所以也不是很详细
最简单的做法运用IDE跟踪
Optimizeit配合JBuilder可以看到
在Optimizeit可以跟踪堆变量
在JBuilder中可以跟踪栈变量,跑一个程序看看就知道了
其他的基本类型都是在堆中创建然后传引用到栈中的
也就是说栈中都是引用,只有String要复制过来