首页 > 试题广场 >

下面程序的输出是:() String x="fmn";...

[单选题]
下面程序的输出是:()
String x="fmn";
x.toUpperCase();
String y=x.replace('f','F');
y=y+"wxy";
System.out.println(y);
  • FmNwxy
  • fmnwxy
  • wxyfmn
  • Fmnwxy
本题主要考察String对象的不可变性。
toUpperCase()会对当前对象进行检查 如果不需要转换直接返回当前对象,否则new一个新对象返回;
replace()如果两个参数相同,则直接返回,否则new一个新对象,所以这里y指向"Fmn";
y=y+"wxy" 这里修改y所指向的字符串对象,让它由指向"Fmn"变成指向"Fmnxyz".
发表于 2015-12-12 20:57:40 回复(1)
String x="fmn";  “fmn”是在常量池里的不可变对象。
x.toUpperCase();   在堆中new一个"FMN"对象,但无任何引用指向它。
String y=x.replace('f','F'); 在堆中 new一个"Fmn"对象,y指向它。
y=y+"wxy"; 在堆中 重新new一个"Fmnwxy"对象, 修改y指向,现在y指向它。


编辑于 2016-07-14 16:48:25 回复(17)
String对象是不可变的!
不可变对象的状态在创建之后就不能发生改变,任何对它的改变都应该产生一个新的对象。
1、x.toUpperCase(); //并没有改变x,而是 new一个新的String对象并返回。只不过这里并没有对返回的对象进行处理。
2、如果是x= x.toUpperCase(); // new一个新的String对象,x指向它。顺便提下,x是对返回的新String对象的引用,不是对象本身。
编辑于 2017-06-12 00:07:21 回复(0)
这道题就是考值传递,虽然string是引用数据类型,但是当做参数时还是当做基本数据类型的,toUpperCase方法一经弹栈,string就仍然是其原值.
发表于 2016-09-18 00:21:03 回复(0)
借用牛客800598号的答案:
String x="fmn";
x.toUpperCase();
System.out.println(x);
x = x.toUpperCase();
System.out.println(x);

输出:
fmn
FMN    String对象本身不可改变,但是并不是String对象的引用不能改变,这里x= x.toUpperCase();改变了引用,对对象本身没有改变
发表于 2016-09-03 21:53:03 回复(0)
toUpperCase的意思是将所有的英文字符转换为大写字母。
发表于 2015-11-21 12:26:49 回复(0)
String 一当创建不可再被修改
发表于 2015-11-17 22:22:58 回复(0)
首先,fmn 会给字符串常量池管理,是不可修改的。 然后x.toUpperCase()new 一个新的String放入堆内存,数据为FMN没有引用指向。 然后String y=x.replace 也是在堆中new一个对象y,y的数据指向Fmn 最后y=y+wxy 此时字符串拼接存在变量,编译器在编译的时候会通过StringBuffer 优化,创建一个StringsBuffer 实例,调用append方法拼接字符串,所以结果是Fmnwxy.
发表于 2022-03-18 10:41:57 回复(0)
这里其实主要注意的是x.toUpperCase()是没有返回值接收的,x自己并未改变。
发表于 2021-12-16 16:20:35 回复(0)
要注意x.toUpperCase();这一句确实new了一个新的对象,但是没有引用指向这个新对象
同样的  x.replace(...)新建了对象,但是有y指向它
发表于 2021-02-20 22:37:49 回复(0)
发表于 2019-05-31 17:07:00 回复(0)
第二行代码:x.toUpperCase();
调用该方法 x 的值不变,结果仍然是“fmn”
除非写成:
x = x.toUpperCase();
编辑于 2018-02-28 15:53:49 回复(0)
x.toUpperCase()并没有new一个新对象接收这个值,如果是String x = x.toUpperCase(); 再输出x的话就会全部转化成大写,这样明白了吧,考察眼力劲
发表于 2017-09-09 11:46:17 回复(0)
String对象不可变!!!!toUpperCase()会对当前对象进行检查 如果不需要转换直接返回当前对象,否则new一个新对象返回;
replace()如果两个参数相同,则直接返回,否则new一个新对象,所以这里y指向"Fmn";
发表于 2017-06-06 13:33:41 回复(0)
D
发表于 2015-11-16 13:35:07 回复(1)
String x="fmn";
x.toUpperCase();
System.out.println(x);
x = x.toUpperCase();
System.out.println(x);

输出:
fmn
FMN

发表于 2015-11-19 16:55:31 回复(12)
D 使用String str=“xxx”时,JVM会在字符串常量池中创建“xxx”,即在编译时就可计算出来的字符串值,是不可改变的。如果改变str就会在字符串常量池里产生新的实例。 题目里调用toUpperCase()确实返回了大写字符串,但是没有覆盖原来的,所以字符串还是小写的。
发表于 2016-01-10 17:18:28 回复(0)
String对象是不可变的。String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容,而最初的String对象则未变。

发表于 2016-01-22 14:21:52 回复(1)
炫头像
x.toUpperCase()会返回x字符串的大写形式,但是没有对原x进行覆盖
x= x.toUpperCase()就可以对原x进行覆盖
发表于 2016-06-02 13:05:44 回复(0)
记住String对象的不可变性就能解决这个问题。所以String的方法都不会改变原对象,而是新创建对象(如果需要创建的话)。
查看String.toUpperCase()方法的源码可以得知,该方法首先判断是否有需要转换为大写的字符,如果没有,return this;否则返回新生成的字符串。所以x.toUpperCase()无论如何都不会改变x的值。
x.replace会替换掉字符串中相应的字符。y=x.replace('f', 'F');后y=Fmn
结果选D
发表于 2016-04-02 23:08:31 回复(0)