如果 “” 和 “abc”  在字符常量池中已经存在,则一个对象都不创建。

解决方案 »

  1.   

    选择A   
    这是我自己的理解 String s1 = "abc";//能编译成功,也能执行,既然s1能有toString属性,那么s1肯定是Object;
    System.out.println(s1.toString());

    String s2 = "";//能编译成功,也能执行,只是输出的也是"",既然s2能有toString属性,那么s2肯定是Object;
    System.out.println(s2.toString());

    // String s3 = null;//可以通过编译,但是运行的时候会抛出NullPointerException,因此次处没有创建新的对象;
    // System.out.println(s3.toString());

    String tp = s2;//此处是s2的地址传给tp,是址传递,所以也没有创建新对象;
    System.out.println(tp==s2);//输出true
    System.out.println(tp.equals(s2));//输出true

    String tp1 = "";/*String类型的数据是放在内存的data segment里面的,而8中基本数据类型是存放在栈中的常量池;
    执行此句的时候,虚拟机会首先在内存的data segment搜索是否已经存在空字符串"",如果没有,
    则创建.如果已经有了,则直接将tp1指向这个地址,因此也没有创建新的对象,这种机制类似常量池;
    这种数据的共享是由编译器完成的,tp1的修改并不会影响到s2;
      */ System.out.println(tp1==s2);//输出true
    System.out.println(tp1.equals(s2));//输出true
      

  2.   

    应该这样问的
    String s =””,String s1= “abc”,String str =null,String tp = s;String sx= “abc”
      

  3.   

    创建了两个对象 前面创建了一个对象是空字符, 还有一个是常量字符串  倒数第二个是空地址,没有指向堆中的对象,所以是空对象,最后一个是将s的地址赋值给了tp所以tp也指向空字符字符串对象,所以只创建了两个
      

  4.   

    对象是 new 出来的 ,存放在 堆中String s =””,String s1= “abc”,String str =null,String tp = s;s 是一个引用 ,存放在 栈 中
    “” 是一个字符串,存放在 常量池中
    s1  同  s  ,存放在  栈  中 
    “abc” 同 空串  ,存放在 常量池中 
    str  存放在  栈 中  ,指向null
    tp 和  s  指向 同一块内存地址 ,同样也是存放在 stack  中 
    分析完了,根本没有  对象出现在 堆中 ,
    所以  答案应该是   0     
      

  5.   

    String s="abc";
    abc是放在常量池中的,常量池不是在堆上吗?
    我记得老师说过:
    如果abc在常量池中不存在,则会new 一个“abc”存在常量池中
    所以:
    String s ="abc";创建0或1个对象;

    而:
    String s =new String ("abc");
    会创建两个对象:一个是new 出的正常的对象    另一个则是为了性能,它会在常量池中备份一个“abc”对象(如果没有的话)
    所以:String s =new String ("abc");出来1-2个对象
      

  6.   


    常量池  在方法去  中  ,方法区  不在  堆上,jvm规范在描述  方法区的 时候  用了  non-Heap,就是为了要和 堆  区分开。
    童鞋,不要那你们老师来吓我哦