首页 > 试题广场 >

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

[不定项选择题]
下面关于 Java 环境中字符串的描述正确的是:【多选】( )
  • 通过 String s1=new String("abc") 和 String s2="abc",则 s1==s2 为 true。
  • "abc"+"def" 会创建三个字符串对象,第三个是 "abcdef" 。也就是说,在 Java 中对字符串的一切操作,都会产生一个新的字符串对象。
  • StringBuffer 是线程安全的,它比 String 快。
  • StringBuilder 是线程安全的,它比 String 快
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 回复(4)
AD

A 错误
由于s1是new出的新对象,存储在heap中,s2指向的对象 存储在String Pool中,他们肯定不是同一个对象,只是存储的字符串值相同。

B 正确
由于通过new String("abc")和"abc"都会创建一个字符串对象。"abc"+"def"会创建三个字符串对象,第一个是"abc",第二个是"def",第三个则是"abcdef",也就是说在Java中对字符串的一切操作都会产生一个新的字符串。

C正确
D错误
String 字符串常量,StringBuffer 字符串变量(线程安全),StringBuilder 字符串变量(非线程安全);
在大部分情况下 StringBuffer要快于String,StringBuilder比 StringBuffer 要快。


发表于 2015-01-14 12:17:55 回复(7)
本题目答案为BC
String与StringBuffer的比较:
(1)String创建字符串是不可变的,任何对String的改变都会引发新的String对象的生成;
(2)StringBuffer是可变的,任何对它所指代的字符串的改变都不会产生新的对象; 所以,当改变字符串的内容时,StringBuffer能获得更好的性能;
(3)StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高;
(4)StringBuffer是线程安全的
综上所述:在单线程下,StringBulder性能>StringBuffer性能>String性能;但是从线程安全考虑,StringBuffer是线程安全的;
示例代码如下:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/****
 * 该程序对String、StringBuffer、StringBuilder三个类进行比较
 * 
 * String与StringBuffer的比较 String创建字符串是不可变的,任何对String的改变都会引发新的String对象的生成;
 * StringBuffer是可变的,任何对它所指代的字符串的改变都不会产生新的对象; 所以,当改变字符串的内容时,StringBuffer能获得更好的性能;
 * 
 * 
 * 
 * StringBilder 与 StringBuffer的比较 StringBuffer是线程安全的;
 * StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高;
 * 所以,在单线程操作中,StringBuilder比StringBuffer效率更高~
 * 
 * 
 * 
 * 综上所述,如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类;当然,如果要保证线程安全,
 * 自然非StringBuffer莫属了。
 * 
 * @author cxj123
 *
 */

public class StringBuilderTester {
private static final String base = " base string. ";
private static final int count = 2000000;

public static void stringTest() {
long begin, end;
begin = System.currentTimeMillis();
String test = new String(base);
for (int i = 0; i < count / 100; i++) {
test = test + " add ";
}
end = System.currentTimeMillis();
System.out.println((end - begin)
+ " millis has elapsed when used String. ");
}

public static void stringBufferTest() {
long begin, end;
begin = System.currentTimeMillis();
StringBuffer test = new StringBuffer(base);
for (int i = 0; i < count; i++) {
test = test.append(" add ");
}
end = System.currentTimeMillis();
System.out.println((end - begin)
+ " millis has elapsed when used StringBuffer. ");
}

public static void stringBuilderTest() {
long begin, end;
begin = System.currentTimeMillis();
StringBuilder test = new StringBuilder(base);
for (int i = 0; i < count; i++) {
test = test.append(" add ");
}
end = System.currentTimeMillis();
System.out.println((end - begin)
+ " millis has elapsed when used StringBuilder. ");
}

public static String appendItemsToStringBuiler(List<String> list) {
StringBuilder b = new StringBuilder();

for (Iterator i = list.iterator(); i.hasNext();) {
b.append(i.next()).append(" ");
}

return b.toString();
}

public static void addToStringBuilder() {
List<String> list = new ArrayList<String>();
list.add(" I ");
list.add(" play ");
list.add(" Bourgeois ");
list.add(" guitars ");
list.add(" and ");
list.add(" Huber ");
list.add(" banjos ");

System.out.println(StringBuilderTester.appendItemsToStringBuiler(list));
}

public static String appendItemsToStirngBuffer(List<String> list) {
StringBuffer b = new StringBuffer();

for (Iterator i = list.iterator(); i.hasNext();) {
b.append(i.next()).append(" ");
}

return b.toString();
}

public static void addToStringBuffer() {
List<String> list = new ArrayList<String>();
list.add(" I ");
list.add(" play ");
list.add(" Bourgeois ");
list.add(" guitars ");
list.add(" and ");
list.add(" Huber ");
list.add(" banjos ");

System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));
}

public static void main(String[] args) {
stringTest();
stringBufferTest();
stringBuilderTest();
addToStringBuffer();
addToStringBuilder();
}
}

编辑于 2016-01-12 15:09:57 回复(1)
凑,多选题只有一个正确选项
发表于 2022-10-12 16:12:20 回复(0)
我觉的没有一个是对的A中==比较的是地址,所以A不正确,B中也不对,因为字符串还有字符串常量池
C是线程不安全D中也不正确因为要看对字符串进行什么操作
发表于 2016-01-12 23:03:02 回复(2)
答案为: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 回复(0)
有个疑问,javac 在编译时优化不是会把常量如"abc"+"def"合并为"abcdef"吗?我的理解是只有一个字符串对象
发表于 2017-04-06 11:11:52 回复(1)
我笑了,不定项选择也能是单选
发表于 2022-07-24 19:01:43 回复(0)
1. Java中对字符串的操作,都会产生一个新的字符串
2. StringBuffer是线程安全的,StringBuffer的速度比String要快
3. StringBuilder是线程不安全的,但是StringBuilder的速度比StringBuffer的速度要快
发表于 2016-06-18 19:46:29 回复(0)
多选题就一个C ?
编辑于 2024-03-10 21:51:42 回复(0)
无语,只有一个选择是对的,但是又标多选题
编辑于 2024-02-18 17:39:05 回复(0)
"abc"+"def"在编译时,编译器会直接优化成"abcdef"放在常量池中。所以,在那种情况下直接创建三个对象的?
发表于 2022-11-14 22:34:10 回复(0)
这个不是多选嘛 狗得很
发表于 2022-10-14 11:58:54 回复(0)
这题整蒙了,说多远,又只选一个,你要不起啊
发表于 2022-09-09 10:08:23 回复(0)
单说字符串名字指的是指字符串首字符所对应的地址
发表于 2022-07-18 18:05:29 回复(0)
B,字符串有常量池
发表于 2022-07-12 22:59:27 回复(0)
一言不合闹线程
发表于 2022-05-23 05:10:00 回复(0)
?????多选题只有一个选项?????什么玩意啊
发表于 2022-05-10 14:56:56 回复(0)
虽然但是,我不搞java,但是在前端的题里出现java的题,这是不是有些不友好。虽然大部分语言的特性是互通的,但是也有各自的优势和差异。
发表于 2022-04-20 19:46:11 回复(0)
有一个疑惑,如果说在Java中对字符串的一切操作都会产生一个新的字符串
String a = "abc";
String b = "abc";
//此时不应该是b指向了a创建的“abc”的地址么,为什么也叫 “在Java中对字符串的一切操作都会产生一个新的字符串

发表于 2022-03-02 10:25:25 回复(0)