Given:
11. public String makinStrings() {
12. String s = “Fred”;
13. s = s + “47”;
14. s = s.substring(2, 5);
15. s = s.toUpperCase();
16. return s.toString();
17. }
How many String objects will be created when this method is invoked?
A. 1
B. 2
C. 3
D. 4
E. 5
F. 6答案是 3 为什么啊!
是因为第一个 是在常量池中并不是对象的关系? 

解决方案 »

  1.   

    要说我4个 12. String s = “Fred”; 
    13. s = s + “47”; 
    14. s = s.substring(2, 5); 
    15. s = s.toUpperCase(); 一步一个 呵呵
      

  2.   

    s = s.substring(2, 5); 
    这一步操作后的s还是指向原来的地址,只是String中的offset和count属性变了
      

  3.   

    Given: 
    11. public String makinStrings() { 
    12. String s = “Fred”; //定义一个S
    13. s = s + “47”;//现在的s="Fred47"
    14. s = s.substring(2, 5); //现在的s=ed4
    15. s = s.toUpperCase(); //现在的s=ED4
    16. return s.toString(); 
    17. } 
    SCJP上面的题目~~答案应该是4个~~LZ仔细看看题目是不是把答案看错了~~
      

  4.   

    应该是4个吧。String对象代表的是字符串,字符串常量是不可更改的,所以String对象是不可改变的。String类中的每一个看似修改了String的方法其实返回的是全新的String对象,而最初的String对象并没有修改。查看JDK文档可以发现里面方法返回的都是全新的String对象。
    12. String s = “Fred”; 
    13. s = s + “47”; 
    14. s = s.substring(2, 5); 
    15. s = s.toUpperCase(); 
    以上每一步都创建了一个String对象,所以说应该是4个。
    以上只是我的观点,不知道是否正确。
      

  5.   

    找到答案了.这道题答案是 3.
    原因是在    toUpperCase() 这里.在java JavaTM Platform
    Standard Ed. 6 的api 中 可以看到. public String toUpperCase()使用默认语言环境的规则将此 String 中的所有字符都转换为大写。此方法等效于 toUpperCase(Locale.getDefault())。    注: 此方法与语言环境有关,如果用于应独立于语言环境解释的字符串,则可能生成不可预料的结果。示例有编程语言标识符、协议键、HTML 标记。例如,"title".toUpperCase() 在 Turkish(土耳其语)语言环境中返回 "T?TLE",其中“?”是 LATIN CAPITAL LETTER I WITH DOT ABOVE 字符。对于与语言环境有关的字符,要获得正确的结果,请使用 toUpperCase(Locale.ENGLISH)。    返回:
            要转换为大写的 String。
        另请参见:
            toUpperCase(Locale)
    同理 public String toLowerCase() 也是返回的要转换为大写的String 即就是传入调用这个方法的 String
      

  6.   

    答案没有错 是3个 别误导楼主 请调试过后再下结论代码如下:public class T4 {
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    String s = "aaaaaaaa";
    s = s + "88";
    // s = s.substring(2, 5);
    s = s.toUpperCase();
    s.toString(); System.out.println(s);
    System.out.println(s == s.substring(2, 5));
    System.out.println(s == s.toUpperCase());
    }
    }
    结果如下:AAAAAAAA88
    false
    true
    问题在于:s == s.toUpperCase() 为true
      

  7.   


    public class T4 { 


    public static void main(String[] args) { 
    // TODO Auto-generated method stub  
     String s = "aaaaaaaa";
            
            // s = s.substring(2, 5);
    //         s = s.toUpperCase();
            s.toString();         System.out.println(s == s+"jj");
            System.out.println(s == s.substring(2, 5));
            System.out.println(s == s.toUpperCase());


    }
    }
      

  8.   

    结果是 
    false 
    false 
    false 
      

  9.   

    仔细翻了一下源码,认为应该是4个,但s.substring(2, 5); 操作后生成的新的String中的字符数组仍然是第一个对象里的
      

  10.   

    3L的解释。。大家看源码吧 public String substring(int beginIndex, int endIndex) {
    if (beginIndex < 0) {
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    if (endIndex > count) {
        throw new StringIndexOutOfBoundsException(endIndex);
    }
    if (beginIndex > endIndex) {
        throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
    }
    return ((beginIndex == 0) && (endIndex == count)) ? this :
        new String(offset + beginIndex, endIndex - beginIndex, value);
        }
    JDK下的SCR里面找到的,不是我写的。
    一目了然了
      

  11.   

    9L的说的是实际情况,但是不能用来解释toUpperCase()不会生成新的对象
    源码我就不贴了。大家可以自己去看
    其实很简单,有没有新的生成就看方法的最后在 return的是什么就可以了。
    至少我看到的版本是return new String(0, result.length, result);这样的return 怎么会不产生新的对象呢?
    疑问
    我想告诉LZ一句话是:尽信书不如无书。
    当初看《JAVA程序员面试宝典》,觉得还可以。后来我直接扔了,误人子弟!
      

  12.   

    public class T6 {
    public static void main(String[] args) {
    String s = "aaaaaaaa";
    String b = "bbbbbbbb"; // s = s.toUpperCase();
    b = b.toUpperCase(); System.out.println(s == s.toUpperCase());
    System.out.println(s.hashCode());
    System.out.println(s.toUpperCase().hashCode()); System.out.println(); System.out.println(b == b.toUpperCase());
    System.out.println(b.hashCode());
    System.out.println(b.toUpperCase().hashCode());
    }
    }
    是这么个事  学习了  楼主看看
      

  13.   


    false
    312017024
    1094643840true
    -540425984
    -540425984
      

  14.   

    Given: 
    11. public String makinStrings() { 
    12. String s = “Fred”; 
    13. s = s + “47”; 
    14. s = s.substring(2, 5); 
    15. s = s.toUpperCase(); 
    16. return s.toString();第一个是12. String s = “Fred”;
    第二个是“47”
    第三个是 s = s + “47”;前面的s
    后面的
    14. s = s.substring(2, 5); 
    15. s = s.toUpperCase();
    只是内容改变了,而内存指向并没有改变!
      

  15.   

    看来大家都迷糊了。从13楼的代码看来,我运行了一下:
    public class T4 {
        public static void main(String[] args) {   
            String s = "Freddd";
    System.out.println(s);
    System.out.println(s==(s + "47"));
    System.out.println(s == s.substring(2, 5));  
            System.out.println(s == s.toUpperCase());
    s.toString(); //No
        }
    }
    输出结果:c:\J>java T4
    Freddd
    false
    false
    false所以我认为还是4个!
      

  16.   

    结贴了. s.toUpperCase() api上说返回的是 待修改的那个字符串,但是看了src下的源码,发现如果s里面全部都是大写的字符串的话就返回的是this,如果不是也是会new String()的.通过代码测试也是如此. 而 s.substring(2, 5);源码楼上有人已经贴出来了.出了抛出异常外,也是会new String() 的.
     所以就这道题目来讲 答案应该就是 4 建立了4个对象.