介绍
String
是最广泛使用的Java类之一,本文提供了有关String
的一些实践问题和答案,以帮助您为面试做准备。
您还可以尝试 Java String Quiz来测试您对‘String’类的知识。
Java 中的 String 类型是什么? String 是一种数据类型吗?
String
是Java中的一个类,在java.lang的包中定义的,它不是一个原始的数据类型,如int
和long
。String
类代表字符串。String
在几乎所有Java应用中都被用来使用。String
在Java中是不可变的和最终的,JVM使用一个字符串池来存储所有String
对象。
如何在Java中创建一个String
对象?
您可以使用新
运算符创建一个字符串
对象,也可以使用双引文创建一个字符串
对象。
1String str = new String("abc");
2String str1 = "abc";
在字符串
类中有几个构建器可用于从char array
,byte array
,StringBuffer
和StringBuilder
中获取字符串
。
当您使用双引用创建一个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
上方或下方案例?
您可以使用String
类toUpperCase
和toLowerCase
方法在所有上方或下方情况下获取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)方法
也返回true
。compareToIgnoreCase(String)
方法与第一个相似,除非它忽略了案例。它使用Comparator
和CASE_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
,ABA
和BAA
。你还需要使用Set
来确保没有重复值。 了解更多关于(/community/tutorials/permutation-of-string-in-java)。
写一个Java函数来查找给定的字符串中最长的palindrome。
了解更多有关如何找到(/社区/教程/最长的palindrome-substring-string-java)字符串中最长的palindrome字符串。
如何在Java中区分String
,StringBuffer
和StringBuilder
?
在Java中,一个String
对象是不可变的和最终的,所以每次你操纵一个String
对象,它就会创建一个新的String
对象。
StringBuffer
和StringBuilder
是可变的类别。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)
中分配y
到x
的值。
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
输出是假的
,因为代码使用新
运算器来创建字符串
对象,所以它是在堆积内存中创建的,而s1
和s2
将具有不同的参考。
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
输出是false
。intern()
方法从字符串池中返回String
对象引用,但是代码不会将其分配回s2
,并且在s2
和s1
中没有变化,并且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)