经典 小代码 解释

joezhpf 2008-11-25 05:58:15
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

为什么啊!
是因为第一个 是在常量池中并不是对象的关系?
...全文
259 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
joezhpf 2008-12-01
  • 打赏
  • 举报
回复
结贴了. s.toUpperCase() api上说返回的是 待修改的那个字符串,但是看了src下的源码,发现如果s里面全部都是大写的字符串的话就返回的是this,如果不是也是会new String()的.通过代码测试也是如此. 而 s.substring(2, 5);源码楼上有人已经贴出来了.出了抛出异常外,也是会new String() 的.
所以就这道题目来讲 答案应该就是 4 建立了4个对象.
bigbro001 2008-11-27
  • 打赏
  • 举报
回复
这么复杂啊
kbyst 2008-11-27
  • 打赏
  • 举报
回复

false
312017024
1094643840

true
-540425984
-540425984
kbyst 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gdqsh 的回复:]
学习了,toUpperCase()不重新建立对象
[/Quote]
运行我上面的代码 看来不是这样
kbyst 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 joezhpf 的回复:]
结果是
false
false
false
[/Quote]


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());
}
}


是这么个事 学习了 楼主看看
-box- 2008-11-27
  • 打赏
  • 举报
回复
收藏
renmms 2008-11-27
  • 打赏
  • 举报
回复
看来大家都迷糊了。

从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个!


胡须棉花糖 2008-11-27
  • 打赏
  • 举报
回复
有意思
erlin10 2008-11-27
  • 打赏
  • 举报
回复
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();
只是内容改变了,而内存指向并没有改变!
nihuajie05 2008-11-26
  • 打赏
  • 举报
回复
9L的说的是实际情况,但是不能用来解释toUpperCase()不会生成新的对象
源码我就不贴了。大家可以自己去看
其实很简单,有没有新的生成就看方法的最后在 return的是什么就可以了。
至少我看到的版本是return new String(0, result.length, result);这样的return 怎么会不产生新的对象呢?
疑问


我想告诉LZ一句话是:尽信书不如无书。
当初看《JAVA程序员面试宝典》,觉得还可以。后来。。。我直接扔了,误人子弟!
nihuajie05 2008-11-26
  • 打赏
  • 举报
回复
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里面找到的,不是我写的。
一目了然了
kevin-yy 2008-11-26
  • 打赏
  • 举报
回复
仔细翻了一下源码,认为应该是4个,但s.substring(2, 5); 操作后生成的新的String中的字符数组仍然是第一个对象里的
joezhpf 2008-11-26
  • 打赏
  • 举报
回复
又迷糊了....
joezhpf 2008-11-26
  • 打赏
  • 举报
回复
结果是
false
false
false
joezhpf 2008-11-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 kbyst 的回复:]
答案没有错 是3个 别误导楼主 请调试过后再下结论

代码如下:
Java codepublicclassT4 {publicstaticvoidmain(String[] args) {//TODO Auto-generated method stubString 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());
}
}


[/Quote]

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());


}
}



kbyst 2008-11-26
  • 打赏
  • 举报
回复
答案没有错 是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
dengfeiling 2008-11-26
  • 打赏
  • 举报
回复
果然不出我所料
gdqsh 2008-11-26
  • 打赏
  • 举报
回复
学习了,toUpperCase()不重新建立对象
joezhpf 2008-11-26
  • 打赏
  • 举报
回复
找到答案了.

这道题答案是 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
berlou 2008-11-26
  • 打赏
  • 举报
回复
第一反应是4个, 后来觉得3楼说的貌似有道理。
加载更多回复(7)
  在有关算法的书中,有一些叙述非常严谨,但不够全面;另一些涉及了大量的题材,但又缺乏严谨性。本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。全书各章自成体系,可以作为独立的学习单元;算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂;说明和解释力求浅显易懂,不失深度和数学严谨性。 《算法导论(原书第3版)》选材经典、内容丰富、结构合理、逻辑清晰,对本科生的数据结构课程和研究生的算法课程都是非常实用的教材,在it专业人员的职业生涯中,本书也是一本案头必备的参考书或工程实践手册。    第3版的主要变化:    新增了van emde boas树和多线程算法,并且将矩阵基础移至附录。    修订了递归式(现在称为“分治策略”)那一章的内容,更广泛地覆盖分治法。    移除两章很少讲授的内容:二项堆和排序网络。    修订了动态规划和贪心算法相关内容。    流网络相关材料现在基于边上的全部流。    由于关于矩阵基础和strassen算法的材料移到了其他章,矩阵运算这一章的内容所占篇幅更小。    修改了对knuth-morris-pratt字符串匹配算法的讨论。    新增100道练习和28道思考题,还更新并补充了参考文献。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧