Java 字符串面试问题与答案

介绍

String是最广泛使用的Java类之一,本文提供了有关String的一些实践问题和答案,以帮助您为面试做准备。

您还可以尝试 Java String Quiz来测试您对‘String’类的知识。

Java 中的 String 类型是什么? String 是一种数据类型吗?

String是Java中的一个类,在java.lang的包中定义的,它不是一个原始的数据类型,如intlongString类代表字符串。String在几乎所有Java应用中都被用来使用。String在Java中是不可变的和最终的,JVM使用一个字符串池来存储所有String对象。

如何在Java中创建一个String对象?

您可以使用运算符创建一个字符串对象,也可以使用双引文创建一个字符串对象。

1String str = new String("abc");
2String str1 = "abc";

字符串类中有几个构建器可用于从char array,byte array,StringBufferStringBuilder中获取字符串

当您使用双引用创建一个String时,JVM 会在 String 池中查看其他任何String是否存储相同值。如果String已经存储在池中,JVM 会返回该String对象的引用。如果新String不在池中,JVM 会创建一个新的String对象,并将其存储在字符串池中。当您使用操作员时,JVM 会创建String对象,但不会将其存储在字符串池中。

写一个 Java 方法来检查输入字符串是否是一个 palindrome。

例如,‘aba’ 是一个 palindrome 字符串.‘String’ 类不提供任何方法来扭转字符串,但‘StringBuffer’ 和‘StringBuilder’ 类有一个 ‘reverse()’ 方法,您可以使用它来检查字符串是否是一个 palindrome。

1private static boolean isPalindrome(String str) {
2    if (str == null)
3        return false;
4    StringBuilder strBuilder = new StringBuilder(str);
5    strBuilder.reverse();
6    return strBuilder.toString().equals(str);
7}

有时,面试者可能会要求你不要使用任何其他类来检查一个符串,在这种情况下,你可以从两端对字符串进行比较,以确定它是否是一个符串。

 1private static boolean isPalindromeString(String str) {
 2    if (str == null)
 3        return false;
 4    int length = str.length();
 5    System.out.println(length / 2);
 6    for (int i = 0; i < length / 2; i++) {
 7         if (str.charAt(i) != str.charAt(length - i - 1))
 8            return false;
 9    }
10    return true;
11}

写一个 Java 方法,将从字符串对象中删除一个特定的字符。

重要的是要注意的是,‘replaceAll()’接受‘String’作为参数,所以你可以使用‘字符’类来创建一个字符串,然后用它来用一个空的字符串代替所有字符。

1private static String removeChar(String str, char c) {
2    if (str == null)
3        return null;
4    return str.replaceAll(Character.toString(c), "");
5}

如何在Java中创建一个String上方或下方案例?

您可以使用StringtoUpperCasetoLowerCase方法在所有上方或下方情况下获取String对象. 这些方法具有接受Locale参数的变量,并使用给定局域的规则将字符串转换为上方或下方情况。

什么是String subSequence方法?

Java 1.4 引入了CharSequence界面,而String类实现了这个界面,这就是为什么String类具有subSequence方法的原因。

如何在Java程序中比较两个字符串?

JavaString实现了比较界面,该界面有compareTo()方法的两种变体。compareTo(String anotherString)方法将String对象与String语法上通过的参数进行比较。如果String对象先于通过的参数,则返回负整数,如果String对象跟随通过的参数,则返回正整数。当String对象具有相同值时,它返回零。在这种情况下,equals(String str)方法也返回truecompareToIgnoreCase(String)方法与第一个相似,除非它忽略了案例。它使用ComparatorCASE_INSITIVE_ORDERER进行

如何在Java中将一个字符串转换为字符串?

一个字符串对象是字符串的序列,所以你不能将其转换为单个字符。你可以使用charAt方法来获取该字符在给定的索引中,或者你可以使用toCharArray()方法将字符串转换为字符串。

如何在Java中将String转换为字节数组?

您可以使用getBytes()方法将一个String对象转换为字节数组,您可以使用构建器new String(byte[] arr)将一个字节数组转换为String对象。

您可以在 Java 中使用 switch case 的「String」吗?

Java 7 将交换场景的功能扩展到Strings;早期 Java 版本不支持此功能. 如果您正在为字符串实现条件流,则可以使用 if-else 条件,如果您正在使用 Java 7 或更高版本,则可以使用交换场景。

写一个Java程序来打印一个字符串的所有转换。

例如,AAB的转换为AAB,ABABAA。你还需要使用Set来确保没有重复值。 了解更多关于(/community/tutorials/permutation-of-string-in-java)。

写一个Java函数来查找给定的字符串中最长的palindrome。

了解更多有关如何找到(/社区/教程/最长的palindrome-substring-string-java)字符串中最长的palindrome字符串。

如何在Java中区分String,StringBufferStringBuilder?

在Java中,一个String对象是不可变的和最终的,所以每次你操纵一个String对象,它就会创建一个新的String对象。

StringBufferStringBuilder是可变的类别。StringBuffer操作是线程安全和同步的,而StringBuilder操作不是线程安全。你应该在多线程环境中使用StringBuffer,并在单线程环境中使用StringBuilder

了解更多有关 [StringBuffer、StringBuffer 和 StringBuilder 之间的区别]( / 社区 / 教程 / string-vs-stringbuffer-vs-stringbuilder)和 [StringBuffer 和 StringBuilder] 的基准( / 社区 / 教程 / string-vs-stringbuffer-vs-stringbuilder)。

为什么在Java中String是不可变的?

String在Java中是不可变的,因为它提供了几个好处:

它增加了安全性,因为任何黑客都无法改变其值,它被用来存储敏感信息,如数据库用户名或密码

  • 由于String是不可变的,它是安全的在多线程使用,你不需要任何同步
  • 字符串在Java类加载器中使用,不可变性确保正确的类被ClassLoader类加载

了解更多关于 为什么‘String’在Java中是不可变的

如何在Java中分割一个字符串?

您可以使用「split(String regex)」將「String」分割為基於所提供的正規表現的「String」數列。

为什么在Java中储存密码的字符数列优于字符串?

一个字符串对象在Java中是不可变的,并存储在字符串池中。一旦创建,它将留在字符串中,直到垃圾收集完成,所以即使你完成了密码,它仍可在内存中存储更长时间。 这是一个安全风险,因为任何有访问内存垃圾的人都可以找到密码作为清晰的文本。

如何在Java中检查两个字符串是否相等?

有两种方法可以检查两个字符串是否等同. 您可以使用 == 操作员或 equals() 方法. 当您使用 ==操作员时,它会检查String的值以及对象参考。 通常在 Java 编程中,您只想检查String值的等同性。 在这种情况下,您应该使用equals() 方法来检查两个 Strings 是否等同。

1String s1 = "abc";
2String s2 = "abc";
3String s3 = new String("abc");
4
5System.out.println("s1 == s2 ? " + (s1 == s2)); //true
6System.out.println("s1 == s3 ? " + (s1 == s3)); //false
7System.out.println("s1 equals s3 ? " + (s1.equals(s3))); //true

Java 中的 String Pool 是什么?

字符串池是存储在 Java 堆积内存储的字符串对象的集合。字符串是 Java 中的一个特殊类,您可以使用运算器以及在双引文中提供值来创建一个字符串对象。

Java 的 String intern() 方法是什么?

内部()方法被召唤时,如果池中已经包含一个相当于这个字符串对象的字符串,如等于(对象)方法所确定,那么从池中返回的字符串。

String在Java中是安全的吗?

一个字符串对象是不可变的,所以你不能在创建后更改其值。这使得字符串对象是安全的,所以它可以在多字符串的环境中安全地使用。

为什么String是Java中流行的HashMap密钥?

由于一个字符串对象是不可变的,它的哈希代码在创建时被缓存,不需要重新计算,这使得它成为地图中的关键候选人,因为其处理速度比其他HashMap关键对象更快。

猜测结果

通过猜测以下Java代码片段的输出来测试自己。

1public class StringTest {
2
3    public static void main(String[] args) {
4    	String s1 = new String("digitalocean");
5    	String s2 = new String("DIGITALOCEAN");
6    	System.out.println(s1 = s2);
7    }
8
9}

(详情输出)

1DIGITALOCEAN

输出是DIGITALOCEAN,因为代码将String s2的值分配给String s1=是一个分配运算器,在格式(x = y)中分配yx的值。


 1public class Test {
 2
 3     public void foo(String s) {
 4     System.out.println("String");
 5     }
 6
 7     public void foo(StringBuffer sb) {
 8     System.out.println("StringBuffer");
 9     }
10
11     public static void main(String[] args) {
12    	new Test().foo(null);
13    }
14
15}

(详情输出)

1Test.java:12: error: reference to foo is ambiguous
2    	new Test().foo(null);
3    	           ^
4  both method foo(String) in Test and method foo(StringBuffer) in Test match

此代码会导致编译时间错误,因为两个foo方法都有相同的名称,而main中的foo方法的调用将通过null。编译器不知道要调用哪种方法。你也可以参考 方法X对于Y类型的错误是模糊的


1String s1 = new String("abc");
2String s2 = new String("abc");
3System.out.println(s1 == s2);

(详情输出)

1false

输出是假的,因为代码使用运算器来创建字符串对象,所以它是在堆积内存中创建的,而s1s2将具有不同的参考。


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

(详情输出)

1false

输出是false,因为s2不是类型的String。在String类中的equals()方法实现有一个instanceof运算符来检查通过对象的类型是否是String,如果对象不是String,则返回 false。


1String s1 = "abc";
2String s2 = new String("abc");
3s2.intern();
4System.out.println(s1 == s2);

(详情输出)

1false

输出是falseintern()方法从字符串池中返回String对象引用,但是代码不会将其分配回s2,并且在s2s1中没有变化,并且s2具有不同的对象引用。

以下代码创建了多少个String对象?

1String s1 = new String("Hello");  
2String s2 = new String("Hello");

[详细解答 答案是三个。第1行中的代码在字符串池中创建一个具有值的‘Hello’的‘String’对象(第一个对象),然后创建一个具有值的‘Hello’的新‘String’对象(第2个对象)。第2行中的代码在字符串池中创建一个具有值的‘Hello’的新‘String’对象(第3个对象),并从字符串池中重复使用‘Hello’字符串。

结论

在本文中,您审查了一些关于String的Java面试问题。

推荐阅读:**

[Java 编程问题]( / 社区 / 教程 / Java 编程 - 面试 - 问题) [ Java 编程中的字符串程序]( / 社区 / 教程 / 字符串程序 - 在 Java)

Published At
Categories with 技术
comments powered by Disqus