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 为什么啊!
是因为第一个 是在常量池中并不是对象的关系?
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 为什么啊!
是因为第一个 是在常量池中并不是对象的关系?
13. s = s + “47”;
14. s = s.substring(2, 5);
15. s = s.toUpperCase(); 一步一个 呵呵
这一步操作后的s还是指向原来的地址,只是String中的offset和count属性变了
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仔细看看题目是不是把答案看错了~~
12. String s = “Fred”;
13. s = s + “47”;
14. s = s.substring(2, 5);
15. s = s.toUpperCase();
以上每一步都创建了一个String对象,所以说应该是4个。
以上只是我的观点,不知道是否正确。
原因是在 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
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
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());
}
}
false
false
false
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里面找到的,不是我写的。
一目了然了
源码我就不贴了。大家可以自己去看
其实很简单,有没有新的生成就看方法的最后在 return的是什么就可以了。
至少我看到的版本是return new String(0, result.length, result);这样的return 怎么会不产生新的对象呢?
疑问
我想告诉LZ一句话是:尽信书不如无书。
当初看《JAVA程序员面试宝典》,觉得还可以。后来我直接扔了,误人子弟!
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());
}
}
是这么个事 学习了 楼主看看
false
312017024
1094643840true
-540425984
-540425984
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();
只是内容改变了,而内存指向并没有改变!
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个!
所以就这道题目来讲 答案应该就是 4 建立了4个对象.