java中
String s="abc";
s="cd";现问:(1)s   abc分别是在堆中,还是在栈中呢
          (2)s是用是地址吗,哪里用上了地址
thanks

解决方案 »

  1.   

    String s="abc";abc 存放在String常量池中,不是堆也不是栈;
    s 是一个字符串引用,指向abc所在的地址,s存放在栈中。
      

  2.   

    1.s在栈中,abc在堆中
    2.s不是地址,只是一个指向abc字符串的一个引用而已。
      

  3.   

    "abc"和"cd"是常量,在java堆中
    s是变量符号,在符号表中
    s是String类型的引用,第一句执行完时,指向"abc",第二句执行完时指向"cd"真实地址在哪问题看一下另一个帖子,刚才回答的
    http://topic.csdn.net/u/20120514/23/a95f2c57-e0ff-47ab-9d5c-0d276013b21b.html?13871
      

  4.   

    再问1楼
    String s="abc";
    String k="abc";
    问:s==k    s.equals(k) 有什么不同呢,
      

  5.   

    我说错了啊  "abc" 和 "cd"是在常量池中
      

  6.   

    String s="abc";
    String k="abc";1、s==k 比较的是二者的地址,它们都指向abc的地址;而abc只有一个,就是在池中的那个,所以s==k 返回true2、s.equals(k) 自然比较的是字符串是否相等,这里地址都相等了,那equals想不相等都难了。
      

  7.   


    s.equals(k)的第一步就是s==k
      

  8.   

    常量池 :在编译的阶段,在堆中分配出来的一块存储区域,用于存储显式 的String,float或者integer.例如String str="abc"; abc这个字符串是显式声明,所以存储在常量池。
      

  9.   

    这位显然错误理解池和栈的关系。
    String常量池是由String类来维护的,它在编译时就已经创建;栈是什么时候创始的?自然在运行时才会创建出来,如果常量池在栈中,那直接用栈不就完了,还搞出个池干什么。再有,11楼说的,“常量池就是指向的堆中的对象”,怕是说反了吧!池指向堆?那要池干什么,直接用堆就好了
      

  10.   

    "=="当比较两个对象为同一个对象时返回true,Object类的equals方法是比较当两个变量指向同一个对象时才返回true,很显然Object类的equals方法不适合String,所以String类重写了Object类的equals方法,当两个对象的字符串序列相等时才返回true
      

  11.   

    "abc"放在池中,变量s在栈中。
      

  12.   

    "abc"在堆中,s存储其地址,放在栈中
      

  13.   


    s==k  false
    s.equals(k)  true
      

  14.   

    "abc" 不在堆也不在栈中,而且,数据区也就是常量池。而s是个引用,在栈中存储。详细去看郝斌老师的java视频,他讲的很清楚,视频在veryCD可以下载到。
      

  15.   


    S,k是在栈中(stack seg)的,字符串常量"abc"是在数据区(data seg)中, s,k分别里面存有一个地址这个地址具体不清楚但是它可以通过这个地址找到数据区的"abc"(也就是指向了abc).
    由于开始分配了一个abc,下次有相同的abc就不用重新分配内存了,所以这里的s,k2个都指向了同一个abc == 这个是用来比较基础类型的,不能比较对象。s==k.s,k都是基础类型只用看他们的内容是否相等就行了,这里明显一样所以返回trueequal 这个方法是用来比较2个对象的引用是否一样,这里明显是2个不同的引用s和k,(Sring比较特殊它既是基础类型也是可以作为一个对象,当new String("abc");它就作为一个对象放在了堆中),本来应该是返回false的。但是String它自己重写了equals方法,它比较的是对象里面实际存的字符序列,这里都是abc所以它也是返回true的,不知道我的说的清楚不,我反正是这么理解的。
      

  16.   

    本人这样理解的==比较的是地址即栈内存中的对象名而equals比较的是内容即在堆中所保存的值
      

  17.   

    个人理解  不用牵扯 常量池字符串 中的内容  在堆内存中    就像和 new出来的东西一样 而s  的值  是  这些字符串 在堆 内存 的 地址值    s通过这个地址值 指向了对应的字符串     String s="abc";
    String k="abc";
    问:s==k s.equals(k) 有什么不同呢,对于这个 我的理解是 s==k  这个对的   他们都是同一个字符串的 地址值equals   是   string类型 里面  复写了object 类里面的 equals方法   在这里比较的  内容  也就是比较的是 字符串如果有不对的地方  请指出  谢谢 
      

  18.   

    String s="abc";
    编译时就把abc放到静态变量区了,运行时在栈中生成一个变量s指向abc。== 比较的是相同地址
    equal方法可以重写,比较相同内容。