首页 > 试题广场 >

下面关于 Java 环境中字符串的描述正确的是?

[单选题]
下面关于 Java 环境中字符串的描述正确的是:( )
  • 通过 String s1=new String("abc") 和 String s2="abc",则 s1==s2 为 true。
  • "abc"+"def" 会创建三个字符串对象,第三个是 "abcdef" 。也就是说,在 Java 中对字符串的一切操作,都会产生一个新的字符串对象。
  • StringBuffer 是线程安全的
  • StringBuilder 是线程安全的
1、三者执行速度:StringBuilder > StringBuffer > String ;
2、StringBuilder:线程非安全的;
3、StringBuffer:线程安全的;
4、用String操作字符串时,实际上是在不断地创建新对象,而原来的对象会作为垃圾被回收;

对于A: s1利用new 操作后,为该对象在堆(Heap)区分配了一块内存; s2是字符串常量,存放在内存的”文字常量区“ ;虽然两个对象的值相同,但由于两者位于不同的地址,不是相同的对象,因此 s1==s2 为false。 A错
发表于 2016-06-28 17:01:08 回复(5)
答案为:C,解析如下:
关于A选项:Java中拥有一个字符串常量池,通过 String name = "aaa" 类似方式创建的字符串都会被编译器拿来与字符串常量池中的值作比较,若该值先前已定义过,那么该变量会直接指向字符串常量池中该值的地址,不会再新建对象。但是,如果使用 String name = new String("aaa") 的方式创建字符串,则不会进行上述比较,直接产生一个新的字符串对象。因为 "==" 运算符比较的是地址,所以A错误。

关于B选项:在现在的JDK版本中,编译器会对"abc"+"def"这类字符串进行优化,在编译完毕后,它们会被合并为"abcdef",故不存在三个对象。后面那一句:在 Java 中对字符串的一切操作,都会产生一个新的字符串对象,对于String类来说,可以认为是正确的。

关于C选项和D选项:(摘自String、StringBuffer和StringBuilder类的区别 (biancheng.net))StringBuilder 和 StringBuffer 功能基本相似,方法也差不多。不同的是,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高。因此在通常情况下,如果需要创建一个内容可变的字符串对象,则应该优先考虑使用 StringBuilder 类。

一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。

操作少量的数据使用 String。单线程操作大量数据使用 StringBuilder。多线程操作大量数据使用 StringBuffer。

发表于 2023-03-25 11:19:18 回复(1)
有个疑问,javac 在编译时优化不是会把常量如"abc"+"def"合并为"abcdef"吗?我的理解是只有一个字符串对象
发表于 2017-04-06 11:11:52 回复(1)
ni9头像 ni9
A: s1利用new 操作后,为该对象在堆(Heap)区分配了一块内存; s2是字符串常量,存放在内存的”文字常量区“ ;虽然两个对象的值相同,但由于两者位于不同的地址,不是相同的对象,因此 s1==s2 为false。 A错
关于B选项:在现在的JDK版本中,编译器会对"abc"+"def"这类字符串进行优化,在编译完毕后,它们会被合并为"abcdef",故不存在三个对象。后面那一句:在 Java 中对字符串的一切操作,都会产生一个新的字符串对象,对于String类来说,可以认为是正确的
关于C选项和D选项:(摘自String、StringBuffer和StringBuilder类的区别 (biancheng.net))StringBuilder 和 StringBuffer 功能基本相似,方法也差不多。不同的是,StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能,所以性能略高。因此在通常情况下,如果需要创建一个内容可变的字符串对象,则应该优先考虑使用 StringBuilder 类。 

作者:GeekKid
发表于 2024-10-11 10:07:27 回复(0)
"abc"+"def"在编译时,编译器会直接优化成"abcdef"放在常量池中。所以,在那种情况下直接创建三个对象的?
发表于 2022-11-14 22:34:10 回复(0)
单说字符串名字指的是指字符串首字符所对应的地址
发表于 2022-07-18 18:05:29 回复(0)
一言不合闹线程
发表于 2022-05-23 05:10:00 回复(0)
有一个疑惑,如果说在Java中对字符串的一切操作都会产生一个新的字符串
String a = "abc";
String b = "abc";
//此时不应该是b指向了a创建的“abc”的地址么,为什么也叫 “在Java中对字符串的一切操作都会产生一个新的字符串

发表于 2022-03-02 10:25:25 回复(0)
速度StringBuilder>StringBuffer>String,越快越不安全。 new出来的对象在堆区,直接赋值的在常量区。
发表于 2020-10-03 00:10:56 回复(0)
B、jvm编译是会把"abc"+"def" 优化直接创建"abcdef",不会创建"abc" 和“def”吧
发表于 2020-07-27 23:45:45 回复(0)
stringbuffer是线程安全,它比string快
发表于 2019-06-22 01:21:53 回复(0)
wf5头像 wf5
b代码编译完不是就变为"abcdef",怎么会有三个对象
发表于 2019-03-09 08:13:18 回复(0)
完美避开正确答案!!
发表于 2018-08-23 16:08:56 回复(0)
1、三者执行速度:StringBuilder > StringBuffer > String ; 2、StringBuilder:线程非安全的; 3、StringBuffer:线程安全的; 4、用String操作字符串时,实际上是在不断地创建新对象,而原来的对象会作为垃圾被回收; 对于A: s1利用new 操作后,为该对象在堆(Heap)区分配了一块内存; s2是字符串常量,存放在内存的”文字常量区“ ;虽然两个对象的值相同,但由于两者位于不同的地址,不是相同的对象,因此 s1==s2 为false。 A错
发表于 2017-09-16 12:30:03 回复(0)
执行速度比较:
StringBuilder>StringBuffer>String
线程安全比较:
StringBuffer线程安全,String可理解为常量,线程安全!StringBuilder线程不安全
对String操作字符串时,实际上在不断创建新对象,原来的对象会被回收!
发表于 2017-06-01 10:48:01 回复(0)
String str = new String(“abc”),“abc”在内存中的分配是堆,字符串常量区。

当你new String("abc")时,其实会先在字符串常量区生成一个abc的对象,然后new String()时会在堆中分配空间,

然后此时会把字符串常量区中abc复制一个给堆中的String,故abc应该在堆中和字符串常量区。


"abc"+"def"则会创建三个字符串对象,第三个是"abcdef"。也就是说,在Java中对字符串的一切操作,都会产生一个新的字符串对象。

StringBuffer是线程安全的,它比String快。 1、三者执行速度:StringBuilder > StringBuffer > String ;

StringBuilder:线程非安全的;

StringBuffer:线程安全的;

发表于 2017-03-29 09:58:08 回复(0)
Java中String是静态常量,不能改变的。
发表于 2017-03-10 16:21:10 回复(0)
"abc"+"def"则会创建三个字符串对象,第三个是"abcdef"。也就是说,在Java中对字符串的一切操作,都会产生一个新的字符串对象。
StringBuffer是线程安全的,它比String快。 1、三者执行速度:StringBuilder > StringBuffer > String ;
2、StringBuilder:线程非安全的;
3、StringBuffer:线程安全的;
4、用String操作字符串时,实际上是在不断地创建新对象,而原来的对象会作为垃圾被回收;
(1)String创建字符串是不可变的,任何对String的改变都会引发新的String对象的生成;
(2)StringBuffer是可变的,任何对它所指代的字符串的改变都不会产生新的对象; 所以,当改变字符串的内容时,StringBuffer能获得更好的性能;
(3)StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高;

发表于 2016-12-14 15:29:48 回复(0)