Java字符串测验

欢迎参加Java字符串测验。字符串是Java中最重要的类之一。如果你有在Java中做过任何编程,你肯定会用到它。

字符串是Java面试问题或测验中非常流行的话题,所以我收集了一些精彩且有迷惑性的Java字符串测验问题,你可以尝试一下。

Java字符串测验

这个测验共有21个问题。如果你能正确回答15个或更多,那么你可以认为自己在字符串概念上非常擅长。你可以通过点击每个问题后面的“揭示答案”按钮来查看答案和详细解释。

让我们开始弦乐测验,祝你好运!

下面的语句将会有什么输出?

String s = "Java String Quiz";
System.out.println(s.charAt(s.toUpperCase().length()));

A. 将“Z”转换为整数90,并打印“90”
B. 运行时异常
C. 打印“z”
D. 打印“Z”

点击显示答案
**正确答案:B
**运行时会抛出异常。线程”main”中的异常java.lang.StringIndexOutOfBoundsException: String index out of range: 16。这是因为索引值从0开始。

以下语句的输出将会是什么?

String s = "Java String Quiz";
System.out.println(s.substring(5,3));

A. 打印“Str”
B. 运行时异常
C. 索引越界运行时异常
D. 字符串索引越界编译时错误

点击解答会抛出一个运行时异常,错误信息为”Exception in thread “main” java.lang.StringIndexOutOfBoundsException: begin 5, end 3, length 16″。这是因为结束索引小于开始索引。

选择所有有效的String类方法。

A. 剪裁
B. 内部化
C. 转换为小写
D. 分割

点击以展示答案
正确答案:A和B
String类的有效方法有- trim()、intern()、toLowerCase()和split(String regex)。

4. 以下语句的输出将会是什么?

String s1 = "Cat";
String s2 = "Cat";
String s3 = new String("Cat");
System.out.print(s1 == s2);
System.out.print(s1 == s3);

A. 真假
B. 真真
C. 假假
D. 假真

当我们使用双引号来创建字符串时,它首先在字符串池中寻找具有相同值的字符串。如果找到了,则返回该引用,否则它会在字符串池中创建一个新的字符串,然后返回该引用。
然而,使用new操作符,我们强制String类在堆空间中创建一个新的字符串对象。因此s1和s2将引用池中的同一个字符串,而s3将是池外的另一个对象,因此产生了这个输出。

以下哪些陈述对于switch case中的字符串是正确的?

A. 从Java 1.5或更高版本开始,switch case语句中允许使用字符串。
B. 从Java 1.7或更高版本开始,switch case语句中允许使用字符串。
C. switch-case实现中使用了equals()方法,因此添加null检查以避免空指针异常。

点击查看答案
正确答案:B,C
阅读更多关于Java switch case字符串的内容

6. 以下哪些陈述对于StringBuffer和StringBuilder是正确的?

A. StringBuilder 不是线程安全的。
B. StringBuffer 是线程安全的,因为它的方法是同步的。
C. StringBuilder 在 Java 1.4 版本中被引入。
D. StringBuffer 和 StringBuilder 都是不可变的。

点击以显示答案
正确答案:A、B
StringBuffer对象是线程安全的,因为它的方法是同步的。但是在大多数情况下,这是一种开销,因此在Java 1.5中引入了StringBuilder。StringBuilder不是线程安全的。StringBuffer和StringBuilder都是可变的类。请在String vs StringBuffer vs StringBuilder中了解更多信息。

7. 字符串的实现遵循以下哪种设计模式?

A. 享元设计模式
B. 工厂模式
C. 单例模式
D. 以上都不是

点击揭示答案
正确答案:A
字符串池实现遵循享元设计模式。

以下语句的输出将是什么?

String s1 = "abc";
String s2 = "def";
System.out.println(s1.compareTo(s2));

A. 零
B. 真
C. 负三
D. 假

从String compareTo()方法的文档中可以得知,compareTo方法是用来比较两个字符串的字典顺序的。比较是基于字符串中每个字符的Unicode值进行的。将该String对象表示的字符序列与参数字符串表示的字符序列进行字典顺序比较。如果该String对象按字典顺序位于参数字符串之前,则结果是一个负整数。如果该String对象按字典顺序位于参数字符串之后,则结果是一个正整数。如果两个字符串相等,则结果为零;当equals(Object)方法返回true时,compareTo返回0。这就是字典顺序的定义。如果两个字符串不同,那么它们可能在某些索引位置上具有不同的字符,或者它们的长度不同,或者二者都有。如果它们在一个或多个索引位置上具有不同的字符,假设k是最小的这样的索引;那么在位置k上的字符值较小的字符串,按照使用<运算符的字典顺序先于另一个字符串。在这种情况下,compareTo返回两个字符串在位置k上的字符值的差值:
this.charAt(k)-anotherString.charAt(k)

在我们的例子中,“abc”在“def”之前,因此返回一个负整数。然后找到第一个不同字符的最小索引,即0,同时a和d相差-3。

9. 以下程序的输出结果会是什么?

public class Test {
	public static void main(String[] args) {
		String x = "abc";
		String y = "abc";
		x.concat(y);
		System.out.print(x);
	}
}

A. abc – 世界

B. abcabc – 果园果园

C. null – 未定义

点击揭示答案
正确答案:A
x.concat(y) 将创建一个新的字符串,但它没有分配给 x,所以 x 的值并未改变。

以下程序将输出什么?

public class Test {
	public static void main(String[] args) {
		String s1 = "abc";
		String s2 = "abc";
		System.out.println("s1 == s2 is:" + s1 == s2);
	}
}

A. 错误
B. s1 == s2 是真的
C. s1 == s2 是假的
D. 真的

点击显示答案
正确答案:A
给定的语句的输出结果将是“false”,因为在Java中,”+”运算符的优先级高于”==”运算符。因此,给定的表达式将被计算为“s1 == s2 is:abc” == “abc”,即为false。

11. 以下语句的输出将是什么?

String s = "Java"+1+2+"Quiz"+""+(3+4);
System.out.println(s);

A. Java3Quiz7 –
答案:A. Java3测验7
B. Java12测验7
C. Java12测验34
D. Java3测验34

首先,执行括号中的表达式。然后是所有的加号运算符,所以它们从左到右依次执行。我们通过每个拼接操作得到一个String,因此输出结果如下所示。
“Java”+1+2+“Quiz”+“”+(3+4)
= “Java”+1+2+“Quiz”+“”+7
= “Java1”+2+“Quiz”+“”+7
= “Java12”+“Quiz”+“”+7
= “Java12Quiz”+“”+7
= “Java12Quiz”+7
= “Java12Quiz7”

12. 在下面的语句中创建了多少个String对象?

String s = "abc"; // statement 1
String s1 = new String("abcd"); // statement 2

A. 一
B. 二
C. 三
D. 四

点击显示答案
正确答案:C
在语句1中,“abc”被创建在字符串池中。
在语句2中,首先在字符串池中创建了“abcd”。然后它作为参数传递给String的new运算符,另一个字符串在堆内存中被创建。
因此总共创建了3个字符串对象。

以下语句将输出什么内容?

String s1 = "abc";
String s2 = new String("abc");
System.out.print(s1==s2);
System.out.println(s1==s2.intern());

A. 真假
B. 假假
C. 真真
D. 真假

点击“显示答案”
正确答案:A
字符串s1在字符串池中,而s2在堆内存中创建。
因此s1==s2将返回false。
当调用s2.intern()方法时,它会检查字符串池中是否有“abc”值的字符串。因此它返回s1的引用。现在s1和s2都指向同一个字符串实例。
因此s1==s2.intern()将返回true。

选择所有由String类实现的接口。

A. 可序列化的
B. 可比较的
C. 警官
D. 可克隆的

点击查看答案
正确答案:A, B, C
String是可序列化和可比较的。Constable是Java 12发布的一个新接口。

选择所有使String成为Map键的理由。

A. 字符串是不可变的
B. 字符串是最终的
C. 字符串正确实现了hashCode() 和 equals() 方法
C. 字符串的hashCode被缓存

点击显示答案
**正确答案:A,B,C
**
对于 Map 的键,正确实现 hashCode() 和 equals() 方法是必须的。由于该字符串是 final 和不可变的,所以不存在键数据损坏的可能。

16. 以下代码片段的输出将是什么?

String s1 = new String("java");
String s2 = new String("JAVA");
System.out.println(s1 = s2);

A. Java
B. Java
C. 真
D. 假

当列印方法内的参数为赋值语句时,它会打印出”JAVA”。因此它将被视为System.out.println(“JAVA”)。

17. 以下语句的输出将是什么?

String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));

A. 错误
B. 正确
C. 运行时的ClassCastException
D. 编译时错误

点击显示答案
正确答案:A
它会打印出false,因为s2不是String类型。如果你看一下String的equals()方法的实现,你会发现它使用instanceof运算符进行检查,以检查传入的对象的类型是否是String?如果不是,则返回false。

18. 以下代码片段的输出结果将会是什么?

String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);

A. 错误
B. 正确
C. 无值

点击显示答案 正确答案:A 这是一个棘手的问题,输出结果将是false。我们知道intern()方法会从字符串池中返回String对象的引用,但由于我们没有将其赋值给s2,所以s2没有发生变化。因此s1和s2都具有不同的引用。如果我们将第3行的代码改为s2 = s2.intern();,则输出结果将为true。

19. 选择所有继承了String类的类。 String de .)

A. StringBuffer – 字符串缓冲器
B. StringBuilder – 字符串生成器
C. StringWriter – 字符串写入器
D. None – 无

点击显示答案
**正确答案:D**
这是一个棘手的问题。String类是final类,所以无法通过继承来扩展它。

以下哪些关于Java中的String字符串的陈述是正确的?

A. 我们可以像StringBuffer一样扩展String类。
B. String类在java.util包中定义。
C. 在Java中,String是不可变的。
D. 在Java中,String是线程安全的。
E. 在Java中,String对大小写敏感。

字符串类无法扩展,因为它是final的。StringBuffer类没有继承它。String类定义在java.lang包中。字符串在Java中是不可变的,因此是线程安全的。字符串是区分大小写的,所以“abc”不等于“ABC”。

21. 以下语句的输出将是什么?

String s1 = null;
System.out.print(s1); // line 2
System.out.print(s1.toString()); // line 3

A. 空值空值
B. 空值跟随NullPointerException
C. NullPointerException

点击显示答案
正确答案:B
第2行会打印出null,因为print方法有一个空值检查,如下所示:
如果(s == null) { s = “null”; }
第3行将抛出NullPointerException,因为我们试图在空值上调用toString()函数。

结论

我在这份测验中试图涵盖字符串的大部分重要内容。如果你认为有一些有趣的概念被遗漏了,请通过评论告诉我。如果你喜欢这份测验,也请与他人分享。

发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds