Java字符串面试问题及答案

简介 jiè)

字符串是Java类中使用最广泛的之一。本文提供了一些关于字符串的练习问题和答案,以帮助您为面试做准备。

你还可以尝试Java字符串测验来测试你对字符串类的了解。

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

字符串是Java中的一个类,定义在java.lang包中。它不是像int和long那样的原始数据类型。字符串类表示字符串。字符串在几乎所有的Java应用程序中都被使用。在Java中,字符串是不可变的和final的,并且JVM使用字符串池来存储所有的字符串对象。您可以使用双引号实例化一个字符串对象,并且您可以重载+运算符用于字符串连接。

在Java中有哪些不同的方法可以创建一个String对象?

你可以使用new运算符创建一个String对象,也可以使用双引号创建一个String对象。例如:

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

String类提供了几个构造器,可以从字符数组、字节数组、StringBuffer和StringBuilder中获取一个字符串。

在使用双引号创建字符串时,JVM会在字符串池中查找是否已经存在具有相同值的其他字符串。如果字符串已经存储在池中,JVM会返回对该字符串对象的引用。如果新字符串不在池中,JVM会创建一个具有给定值的新字符串对象,并将其存储在字符串池中。当使用new运算符时,JVM会创建字符串对象,但不会将其存储在字符串池中。您可以使用intern()方法将字符串对象存储在字符串池中,或者如果池中已经存在相等值的字符串,则返回对其引用。

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

如果一个字符串在反转后与原始值相同,那么它就是一个回文串。例如,aba就是一个回文串。String类没有提供任何方法来反转字符串,但是StringBuffer和StringBuilder类有一个reverse()方法,可以用来检查一个字符串是否是一个回文串。例如:

private static boolean isPalindrome(String str) {
    if (str == null)
        return false;
    StringBuilder strBuilder = new StringBuilder(str);
    strBuilder.reverse();
    return strBuilder.toString().equals(str);
}

有时候,面试官可能要求你不使用任何其他类来检查是否为回文。在这种情况下,你可以从字符串两端比较字符,以确定其是否为回文。例如:

private static boolean isPalindromeString(String str) {
    if (str == null)
        return false;
    int length = str.length();
    System.out.println(length / 2);
    for (int i = 0; i < length / 2; i++) {
         if (str.charAt(i) != str.charAt(length - i - 1))
            return false;
    }
    return true;
}

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

我们可以使用replaceAll方法将字符串中的所有出现替换为另一个字符串。需要注意的重要一点是,replaceAll()接受字符串作为参数,因此可以使用Character类创建一个字符串,并将其用作将所有字符替换为空字符串的方式。

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

在Java中,您可以如何将字符串转为大写或小写?

你可以使用String类的toUpperCase和toLowerCase方法将字符串转换为全大写或全小写。这些方法有一个接受Locale参数的变体,并且使用给定区域设置的规则来将字符串转换为大写或小写。

字符串的subSequence方法是什么?

Java 1.4 引入了 CharSequence 接口,并且 String 类实现了这个接口,因此 String 类拥有了 subSequence 方法。在内部,subSequence 方法调用了 String 的 substring 方法。

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

Java字符串实现了Comparable接口,它有两个compareTo()方法的变体。compareTo(String anotherString)方法是基于字典顺序比较String对象和传入的String参数。如果String对象在参数之前,它返回一个负整数;如果String对象在参数之后,它返回一个正整数;当两个String对象的值相同时,返回0。在这种情况下,equals(String str)方法也返回true。compareToIgnoreCase(String str)方法与第一个方法类似,但忽略大小写。它使用Comparator和CASE_INSENSITIVE_ORDER进行不区分大小写的比较。如果返回值为0,则equalsIgnoreCase(String str)也将返回true。

在Java中,如何将字符串转换为字符数组?

一个字符串对象是一个字符序列,所以无法将其转换为单个字符。您可以使用charAt方法获取给定索引处的字符,或者可以使用toCharArray()方法将字符串转换为字符数组。了解更多关于将字符串转换为字符数组的信息。

在Java中,如何将字符串转换为字节数组?

你可以使用getBytes()方法将String对象转换成字节数组,并且你可以使用构造函数new String(byte[] arr)将字节数组转换成String对象。了解更多关于将字符串转换成字节数组的方法。

在Java中,你能在switch case语句中使用字符串吗?

Java 7增强了对字符串的switch case能力,之前的Java版本不支持此功能。如果您需要对字符串进行条件流程控制,您可以使用if-else条件语句,而如果您使用的是Java 7或更高版本,您也可以使用switch case语句。了解更多关于Java switch case字符串的知识。

编写一个Java程序,打印出一个字符串的所有排列。

你需要使用递归来找出字符串的所有排列。例如,字符串 AAB 的排列有 AAB、ABA 和 BAA。你还需要使用集合 Set 来确保没有重复的值。了解更多关于找到字符串的所有排列的知识。

用Java编写一个函数,在给定的字符串中找到最长的回文。

一个字符串中可以包含回文子串。了解更多关于如何找到最长回文子串的方法。

Java中的String、StringBuffer和StringBuilder有哪些区别?

在Java中,字符串对象是不可变的和最终的,所以每当你操作一个字符串对象时,它会创建一个新的字符串对象。字符串操作是消耗资源的,因此Java提供了两个用于字符串操作的实用类,StringBuffer和StringBuilder。

StringBuffer和StringBuilder是可变的类。StringBuffer的操作是线程安全且同步的,而StringBuilder的操作则不是线程安全的。在多线程环境下应该使用StringBuffer,在单线程环境下应该使用StringBuilder。StringBuilder的性能更快,因为没有同步的开销。

了解更多关于String、StringBuffer和StringBuilder之间的区别,以及StringBuffer和StringBuilder的基准测试。

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

Java中的字符串是不可变的,这带来了几个好处。

  • String pool is possible because String is immutable in Java.
  • It increases security because any hacker can’t change its value and it’s used for storing sensitive information such as a database username or password.
  • Since String is immutable, it’s safe to use in multi-threading and you don’t need any synchronization.
  • Strings are used in Java class loaders and immutability provides assurance that the correct class is getting loaded by the ClassLoader class.

了解一下为什么在Java中String是不可变的。

在Java中如何分割字符串?

你可以使用split(String regex)根据提供的正则表达式将字符串分割成一个字符串数组。

为什么在Java中,用字符数组来存储密码比字符串更受青睐?

Java中的String对象是不可变的,并存储在字符串池中。一旦创建,它会一直保留在池中,直到垃圾回收完成,因此即使您使用密码完毕,它仍然在内存中可用更长时间。这是一个安全风险,因为任何可以访问内存转储的人都可以以明文形式找到密码。如果您使用字符数组来存储密码,您可以在使用完毕后将其设置为空。您可以控制它在内存中可用的时间长度,从而避免安全威胁。

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

判断两个字符串是否相等有两种方法。你可以使用”==”运算符或者equals()方法。当你使用”==”运算符时,它会检查字符串的值以及对象引用。在Java编程中,通常你只想检查字符串的值是否相等。在这种情况下,你应该使用equals()方法来判断两个字符串是否相等。还有一个名为equalsIgnoreCase的函数,你可以使用它来忽略大小写。

String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");

System.out.println("s1 == s2 ? " + (s1 == s2)); //true
System.out.println("s1 == s3 ? " + (s1 == s3)); //false
System.out.println("s1 equals s3 ? " + (s1.equals(s3))); //true

Java中的字符串池是什么?

字符串池是存储在Java堆内存中的String对象池。在Java中,String是一个特殊的类,你可以使用new运算符创建一个String对象,也可以使用双引号提供值来创建一个String对象。了解更多关于Java字符串池的信息。

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

当调用intern()方法时,如果池中已经包含一个与该String对象相等的String对象(通过equals(Object)方法确定),则返回池中的字符串。否则,将该String对象添加到池中,并返回对该String对象的引用。该方法始终返回一个具有与该String相同内容但保证来自唯一字符串池的String对象。

在Java中,字符串是否是线程安全的?

一个String对象是不可变的,所以在创建后无法改变它的值。这使得String对象是线程安全的,因此可以在多线程环境中安全地使用它。在Java中了解更多关于线程安全性的知识。

为什么在Java中,字符串变量作为HashMap的键非常受欢迎?

由于String对象是不可变的,所以它的哈希码在创建时被缓存,不需要重新计算。这使得它成为Map中的理想键选项,因为它的处理速度比其他HashMap键对象更快。

猜测输出

通过猜测以下Java代码段的输出来进行自我测试。

public class StringTest {
    
  	public static void main(String[] args) {
   		String s1 = new String("digitalocean");
   		String s2 = new String("DIGITALOCEAN");
   		System.out.println(s1 = s2);
   	}
    
}
输出
数字大洋由于代码将String s2的值赋给String s1,所以输出结果为数字大洋。=是一个赋值运算符,将y的值赋给x,其格式为(x = y)。==是一个比较运算符,会检查两个字符串的引用对象是否相同。


public class Test {
    
   	 public void foo(String s) {
   	 System.out.println("String");
   	 }
    
   	 public void foo(StringBuffer sb) {
   	 System.out.println("StringBuffer");
   	 }
    
   	 public static void main(String[] args) {
   		new Test().foo(null);
   	}
    
}
输出
Test.java:12: 错误:foo的引用不明确
new Test().foo(null);
^
Test类中的foo(String)方法和foo(StringBuffer)方法都匹配这段代码在编译时产生了错误,因为两个foo方法具有相同的名称,在main方法中调用foo方法时传递了null参数。编译器不知道调用哪个方法。你也可以参考方法X对类型Y是不明确的错误。


String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
输出
错误输出为错误,因为代码使用new运算符创建了String对象,所以它被创建在堆内存中,s1和s2将有不同的引用。如果只使用双引号创建字符串,则它们将位于字符串池中,输出为真。


String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));
输出
错误输出为 false 是因为 s2 不是 String 类型。String 类中的 equals() 方法实现中使用了 instanceof 运算符来检查传入对象的类型是否为 String,并在对象不是 String 类型时返回 false。


String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);
输出结果为false。intern()方法从字符串池中返回String对象引用。然而,代码没有将其赋值回s2,因此s2没有改变,并且s1和s2具有不同的对象引用。如果将第3行的代码更改为s2 = s2.intern();,则输出结果将为true。

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

String s1 = new String("Hello");  
String s2 = new String("Hello");
答案是三。第1行的代码在字符串池中创建了一个值为“Hello”的String对象(第一个对象),然后在堆内存中创建了一个新的值为“Hello”的String对象(第二个对象)。第2行的代码在堆内存中创建了一个新的值为“Hello”的String对象(第三个对象),并且复用了字符串池中的Hello字符串。

结论

在这篇文章中,你对一些关于String的Java面试问题进行了回顾。

中文-原生推荐阅读:

Java编程问题
Java中的字符串程序

广告
将在 10 秒后关闭
bannerAds