String 存取值小问题,在线等
java中
String s="abc";
s="cd";
现问:(1)s abc分别是在堆中,还是在栈中呢
(2)s是用是地址吗,哪里用上了地址
thanks
[解决办法]
String s="abc";
abc 存放在String常量池中,不是堆也不是栈;
s 是一个字符串引用,指向abc所在的地址,s存放在栈中。
[解决办法]
1.s在栈中,abc在堆中
2.s不是地址,只是一个指向abc字符串的一个引用而已。
[解决办法]
"abc"和"cd"是常量,在java堆中
s是变量符号,在符号表中
s是String类型的引用,第一句执行完时,指向"abc",第二句执行完时指向"cd"
真实地址在哪问题看一下另一个帖子,刚才回答的
http://topic.csdn.net/u/20120514/23/a95f2c57-e0ff-47ab-9d5c-0d276013b21b.html?13871
[解决办法]
[解决办法]
[解决办法]
String s="abc";
String k="abc";
1、s==k 比较的是二者的地址,它们都指向abc的地址;而abc只有一个,就是在池中的那个,所以s==k 返回true
2、s.equals(k) 自然比较的是字符串是否相等,这里地址都相等了,那equals想不相等都难了。
[解决办法]
[解决办法]
[解决办法]
[解决办法]
常量池就是指向的堆中的对象
[解决办法]
[解决办法]
[解决办法]
"abc"放在池中,变量s在栈中。
[解决办法]
"abc"在堆中,s存储其地址,放在栈中
[解决办法]
[解决办法]
"abc" 不在堆也不在栈中,而且,数据区也就是常量池。
而s是个引用,在栈中存储。
详细去看郝斌老师的java视频,他讲的很清楚,视频在veryCD可以下载到。
[解决办法]
[解决办法]
本人这样理解的==比较的是地址即栈内存中的对象名而equals比较的是内容即在堆中所保存的值
[解决办法]
个人理解 不用牵扯 常量池
字符串 中的内容 在堆内存中 就像和 new出来的东西一样
而s 的值 是 这些字符串 在堆 内存 的 地址值 s通过这个地址值 指向了对应的字符串
String s="abc";
String k="abc";
问:s==k s.equals(k) 有什么不同呢,
对于这个 我的理解是 s==k 这个对的 他们都是同一个字符串的 地址值
equals 是 string类型 里面 复写了object 类里面的 equals方法 在这里比较的 内容 也就是比较的是 字符串
如果有不对的地方 请指出 谢谢
[解决办法]
String s="abc";
编译时就把abc放到静态变量区了,运行时在栈中生成一个变量s指向abc。
== 比较的是相同地址
equal方法可以重写,比较相同内容。