Java字符串测验

欢迎来到Java字符串测验。字符串是Java中最重要的类之一。如果你在Java中进行过任何编程,你一定使用过它。

在涉及Java面试问题或测验时,字符串非常受欢迎。因此,我收集了一些很棒且有技巧的Java字符串测验问题,你应该尝试一下。

Java字符串测验

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

让我们开始字符串测验,祝你好运。

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

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

A. Convert “Z” to int 90 and prints “90”
B. Runtime Exception
C. Prints “z”
D. Prints “Z”

Click to Reveal Answer

**正确答案:B
**
它将抛出运行时异常。Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 16 这是因为索引值从0开始。

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

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

A. Prints “Str”
B. Runtime Exception
C. IndexOutOfBoundsException Runtime Exception
D. StringIndexOutOfBoundsException Compile-time error

Click to Reveal Answer

**正确答案:B
**
它将抛出运行时异常,错误消息为Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 5, end 3, length 16。这是因为结束索引小于开始索引。

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

A. trim()
B. intern()
C. toLower()
D. split()

Click to Reveal Answer

正确答案: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. truefalse
B. truetrue
C. falsefalse
D. falsetrue

Click to Reveal Answer

**正确答案:A
**
当我们使用双引号创建字符串时,它首先在字符串池中查找具有相同值的字符串。如果找到,则返回引用,否则在池中创建一个新的字符串,然后返回引用。

然而,使用new运算符,我们强制String类在堆空间中创建一个新的字符串对象。因此,s1和s2将引用池中相同的字符串,而s3将是池外的一个不同对象,因此产生了输出。

5. 以下哪些语句适用于switch case中的字符串?

A. String is allowed in switch case for Java 1.5 or higher versions.
B. String is allowed in switch case for Java 1.7 or higher versions.
C. The equals() method is used by switch-case implementation, so add null check to avoid NullPointerException.

Click to Reveal Answer

正确答案:B,C

java switch case string中了解更多信息

6. 以下哪些语句对StringBuffer和StringBuilder是正确的?

A. StringBuilder is not thread-safe.
B. StringBuffer is thread safe because its methods are synchronized.
C. StringBuilder was introduced in Java 1.4
D. StringBuffer and StringBuilder are immutable.

Click to Reveal Answer

正确答案:A,B

StringBuffer对象是线程安全的,因为其方法是同步的。但在大多数情况下,这是一个开销,因此在Java 1.5中引入了StringBuilder。StringBuilder不是线程安全的。StringBuffer和StringBuilder是可变类。在String vs StringBuffer vs StringBuilder中了解更多信息。

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

A. Flyweight Design Pattern
B. Factory Pattern
C. Singleton Pattern
D. None of the above

Click to Reveal Answer

正确答案:A

字符串池的实现遵循享元设计模式

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

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

A. 0
B. true
C. -3
D. false

Click to Reveal Answer

**正确答案:C
**
**
来自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

Click to Reveal Answer

正确答案:A

x.concat(y)会创建一个新的字符串,但它没有被赋给x,所以x的值没有改变。

10. 下面的程序将输出什么?

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

A. false
B. s1 == s2 is:true
C. s1 == s2 is:false
D. true

Click to Reveal Answer

正确答案:A

给定的语句输出将为“false”,因为在Java中,+运算符的优先级高于==运算符。因此,给定的表达式将被计算为“s1 == s2 is:abc” == “abc”,即false。

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

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

A. Java3Quiz7
B. Java12Quiz7
C. Java12Quiz34
D. Java3Quiz34

Click to Reveal Answer

正确答案:B

首先,执行括号中的表达式。然后是+运算符,所以它们从左到右执行。

我们得到每次连接的字符串,因此输出如下所示。

“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. 1
B. 2
C. 3
D. 4

Click to Reveal Answer

正确答案:C

在语句1中,“abc”在字符串池中被创建。

在语句2中,首先在字符串池中创建了”abcd”。然后它作为参数传递给String new运算符,另一个字符串在堆内存中创建。

因此总共创建了3个字符串对象。

13. 下面语句的输出是什么?

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

A. falsetrue
B. falsefalse
C. truetrue
D. truefalse

Click to Reveal Answer

正确答案:A

s1在字符串池中,而s2在堆内存中创建。

因此s1==s2返回false。

当调用s2.intern()方法时,它检查池中是否有值为”abc”的字符串。因此它返回s1的引用。现在s1和s2都指向同一个字符串实例。

因此s1==s2.intern()返回true。

14. 选出String类实现的所有接口。

A. Serializable
B. Comparable
C. Constable
D. Cloneable

Click to Reveal Answer

正确答案:A, B, C

String是可序列化和可比较的。Constable是Java 12版本中的一个新接口。

15. 选出使String成为Map键的所有原因。

A. String is immutable
B. String is final
C. String properly implements hashCode() and equals() method
C. String hashcode is cached

Click to Reveal Answer

**正确答案: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. true
D. false

Click to Reveal Answer

**正确答案:A
**
它将打印”JAVA”,因为println()方法中的参数是一个赋值语句。因此它将被视为System.out.println("JAVA")

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

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

A. false
B. true
C. ClassCastException at runtime
D. Compile-time error

Click to Reveal Answer

正确答案: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. false
B. true
C. null

Click to Reveal Answer

正确答案:A

这是一个棘手的问题,输出将是false。我们知道intern()方法将从字符串池中返回String对象引用,但由于我们没有将它赋值回s2,所以s2没有变化。因此s1和s2都有不同的引用。

如果我们将第3行的代码更改为s2 = s2.intern();,那么输出将为true。

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

A. StringBuffer
B. StringBuilder
C. StringWriter
D. None

Click to Reveal Answer

**正确答案:D
**
这是一个棘手的问题。String是一个final类,所以你不能扩展它。

20. 关于Java中的String,以下哪些陈述是正确的?

A. We can extend String class like StringBuffer does it.
B. String class is defined in java.util package.
C. String is immutable in Java.
D. String is thread-safe in Java.
E. String is case sensitive in Java.

Click to Reveal Answer

正确答案:C,D,E

我们不能扩展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. nullnull
B. null followed by NullPointerException
C. NullPointerException

Click to Reveal Answer

正确答案:B

第2行将打印null,因为print方法有类似这样的null检查:

if (s == null) { s = "null";}

第3行会抛出NullPointerException,因为我们试图在null上调用toString()函数。

结论

I have tried to cover most of the important points about String in this Quiz. If you think some interesting concept has been missed, please let me know through comments. If you liked the Quiz, share it with others too.

Source:
https://www.digitalocean.com/community/tutorials/java-string-quiz