怎么一会句柄一会对象的???s就是句柄,对象是“asdf”String s = "asdf"  如果已经存在一个这个asdf对象,那么这个语句不会新作成一个对象。如果不存在的话会新做成一个对象String s = new String("asdf")肯定会新生成一个对象就是说String s1 = "asdf";
String s2 = "asdf";
String s3 = "asdf";
String s4 = "asdf";
大家指向的是同一片内存空间

String s1 = new String("asdf")
String s2 = new String("asdf")
String s3 = new String("asdf")
String s4 = new String("asdf")
大家指向的是不同的内存空间

解决方案 »

  1.   

    讨论一下!
    String s = "asdf"和String s = new String("asdf")
    有区别吗?
    我觉得效果是一样的.
    对于String s = "asdf"楼主说s是句柄,不知道有没有根据?
    这时候java为字符串文字"asdf"隐式的创建了一个String对象
    而String s = new String("asdf")
    显示的创建一个对象实例
      

  2.   

    当然有根据啦!不信可以看一下thinkinjava中的2.1和2.2!
      

  3.   

    应该说java中,对于程序编写人员来说,堆栈和堆的区别是没有的!不象c++!!!!
      

  4.   

    堆栈和堆还是有区别的,
    主要在于Java的垃圾自动回收机制上。
    但是对我们的确不是很重要。
      

  5.   

    bluesmile979(笑着) :就是说String s1 = "asdf";
    String s2 = "asdf";
    String s3 = "asdf";
    String s4 = "asdf";
    大家指向的是同一片内存空间同一片内存空间什么意思?难道s1改变了s2,s3,s4也都会改变吗?
      

  6.   

    同一片内存空间就是同一片内存空间,是一块内存区域。
    s1改变了,代表它指向的内存空间变了。
    s2,s3,s4不受影响,不会改变。
    当然,s1指向的内存空间的内容变了,s2,s3,s4指向的内存空间的内容也相应改变。
      

  7.   

    两段程序:
    public class test {
      public static void main(String[] args) {
        String s1 = "asdf";
        String s2 = "asdf";
        System.out.println(s1==s2);
      }
    }
    运行结果为true,表示相同句柄。
    public class test {
      public static void main(String[] args) {
        String s1 = new String("asdf");
        String s2 = new String("asdf");
        System.out.println(s1==s2);
      }
    }
    运行结果为false,表示句柄不同。
      

  8.   

    yes
    是这样的
    同意楼上的
      

  9.   

    String s = new String("asdf")参数本身就是一个对象
    这样无形中就创建了2个对象。
    对于string来说
    用 String s="asdf";比较好!!!
      

  10.   

    老问题了
    String.equals()方法比较的是字符串的内容。使用了equals()方法,会对字符串中的所有字符一个接一个地进行比较,如果完全相等,那么返回true.
    而运算符==比较的是String对象的引用如:
    String s0="abc";
    String s1=new String("abc");
    String s2="a"+"b"+"c";s0.equals(s1);      ---->true
    s0.equals(s2);      ---->true
    s0==s1;             ---->false
    s0==s2;             ---->true在这里你或许对s0==s2为true有疑问,这是因为
    "abc","a","b","c"是字符串常量,它们在编译期就被确定了。
    如s2,它同样在编译期就被解析为一个字符串常量。
    Java确保一个字符串常量只有一份拷贝,所以当
    "abc"和"a"+"b"+"c"被确定为值相等时,当JVM执行了常量池解析的操作,
    Java会设置两个变量的引用为同一个常量的引用。
    在constant pool即常量池(在编译期被确定,并已被保存在已编译的.class文件中的一些数据,它包含了方法、类、接口、字符串常量等)中,Java会跟踪所有的字符串常量。
      

  11.   

    http://expert.csdn.net/Expert/topic/2137/2137218.xml?temp=.5687982
      

  12.   

    String s1 = "asdf";
    先说这种吧,碰到"asdf"时,JVM在内存中申请一块空间,然后把s1指向它
    String s2 = "asdf";
    因为刚才JVM已经在内容中申请了一块空间存放“asdf”了,这时只要把s2也指向它就OK了!
    所以这一块内容的内容是无法改变的,只有在程序结束的时候释放。
    但是对于
    String s3 = new String("asdf");
    JVM为s3申请空间,然后在这块空间上存放"asdf";
    可见对内存的使用情况不同,但是好像意义不大!confusing
      

  13.   

    我刚才测试了一下
    Runtime rt=Runtime.getRuntime();
    System.out.println(rt.freeMemory());
    如果我使用
    String s1=new String("abc");
    String s2=new String("abc");
    String s3=new String("abc");
    则freeMemory=1772304
    如果用
    String s1="abc";
    String s2="abc";
    String s3="abc";
    则freeMemory=1772456
    可见用s="abc"要比s=new String("abc");节省空间
      

  14.   

    我想:
      1。String s="abc";  s是句柄在栈中存储  "abc"这个东东在静态存储空间存储(常量存贮区)
      1。String s=new String("abc"); s是句炳在栈中存储   "abc"这个东东在堆中存储。
      

  15.   

    String s= "asdf";和
    String s= new String("asdf");
    都是建立一个新的String对象s,他们的形式虽不一样,结果是完全一样的String对象的实例化虽然区别与其他类
    但是两种方法都是创建了String的一个实例str,而且在创建前都要检查实例str是否已经存在,如果str已经存在则两种方法都会导致编译器报错,所以它们的效果是完全一样的,只是形式不同
    (sun为了方便大家才这么做)不过要注意的是:
    String str="String";   和  
    str="String";  是不一样的
    前者是创建String的一个实例str,后者是给已经创建好的str赋值
    (前提是在两句的上面都没有声明  String str)
      

  16.   

    谈谈我的理解:
    String的定义就是public final class
    这是一个不变模式,一个String对象一旦创建,他所指向的内存内容就不能改变。比如:
    String s = "abc";
    现在内存某个地方存储了"abc",s指向它。
    如果下一条语句:
    s = "xyz";
    那么内存中又有了一份"xyz", s现在指向"xyz"原来的"abc"呢?如果没有其他的String指向它,他就会被GC回收。所以:
    String s1="abc";
    String s2="abc";
    如果编译器足够聪明,可以在编译期判断出s1, s2指向同一内容,那就只用一份"abc"就足够了。
    所以 (s1==s2) = true;至于
    String s1="abc";
    String s2=new String("abc");
    本质上是一样的,可能编译器一定要给new String("abc")分配新的内存。
    结果(s1==s2)=false但是我认为jvm绝不可能在运行时先遍历内存看看有没有现成的"xxxx"
    所以你写String x = "xxxx" jvm一定会生成新的"xxxx"而不管内存中是否有没有。
    至于优化是在编译期进行的。所以判断s1==s2实在没什么意义。
    s1.equals(s2)才是比较他们所指向的内存的内容的。
      

  17.   

    关注ing    这个问题很深刻    必须解决