Einführung
String
ist eine der am weitesten verbreiteten Java-Klassen. Dieser Artikel bietet einige Übungsfragen und Antworten zu String
, um Ihnen bei der Vorbereitung auf ein Vorstellungsgespräch zu helfen.
Sie können auch das Java String Quiz ausprobieren, um Ihr Wissen über die String
-Klasse zu testen.
Was ist die String
-Klasse in Java? Ist String
ein Datentyp?
String
ist eine Klasse in Java und ist im Paket java.lang
definiert. Es ist kein primitiver Datentyp wie int
und long
. Die Klasse String
repräsentiert Zeichenfolgen. String
wird in fast allen Java-Anwendungen verwendet. String
ist in Java unveränderlich und final, und der JVM verwendet einen String-Pool, um alle String
-Objekte zu speichern. Sie können ein String
-Objekt mit doppelten Anführungszeichen instanziieren, und Sie können den +
-Operator für die Verkettung überladen.
Was sind einige verschiedene Möglichkeiten, ein String
-Objekt in Java zu erstellen?
Sie können ein String
-Objekt mit dem new
-Operator erstellen oder Sie können doppelte Anführungszeichen verwenden, um ein String
-Objekt zu erstellen. Zum Beispiel:
String str = new String("abc");
String str1 = "abc";
Es gibt mehrere Konstruktoren in der String
-Klasse, um einen String
aus einem char-Array
, einem Byte-Array
, einem StringBuffer
und einem StringBuilder
zu erhalten.
Wenn Sie einen String
mit doppelten Anführungszeichen erstellen, sucht die JVM im String-Pool nach einem anderen String
, der denselben Wert hat. Wenn der String
bereits im Pool gespeichert ist, gibt die JVM den Verweis auf dieses String
-Objekt zurück. Wenn der neue String
nicht im Pool ist, erstellt die JVM ein neues String
-Objekt mit dem angegebenen Wert und speichert es im String-Pool. Wenn Sie den new
-Operator verwenden, erstellt die JVM das String
-Objekt, speichert es jedoch nicht im String-Pool. Sie können die intern()
-Methode verwenden, um das String
-Objekt im String-Pool zu speichern oder den Verweis zurückzugeben, wenn bereits ein String
mit gleichem Wert im Pool vorhanden ist.
Schreiben Sie eine Java-Methode, um zu überprüfen, ob ein Eingabestring ein Palindrom ist.
A string is a palindrome if its value is the same when reversed. For example, aba
is a palindrome string. The String
class doesn’t provide any method to reverse the string but the StringBuffer
and StringBuilder
classes have a reverse()
method that you can use to check whether a string is a palindrome. For example:
private static boolean isPalindrome(String str) {
if (str == null)
return false;
StringBuilder strBuilder = new StringBuilder(str);
strBuilder.reverse();
return strBuilder.toString().equals(str);
}
Manchmal kann ein Interviewer verlangen, dass Sie keine andere Klasse verwenden, um ein Palindrom zu überprüfen. In diesem Fall können Sie Zeichen im String von beiden Enden vergleichen, um herauszufinden, ob es sich um ein Palindrom handelt. Zum Beispiel:
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;
}
Schreiben Sie eine Java-Methode, die ein bestimmtes Zeichen aus einem Stringobjekt entfernt.
Wir können die Methode replaceAll
verwenden, um alle Vorkommen eines Strings durch einen anderen String zu ersetzen. Der wichtige Punkt ist, dass replaceAll()
einen String
als Argument akzeptiert. Sie können also die Klasse Character
verwenden, um einen String zu erstellen und ihn verwenden, um alle Zeichen durch einen leeren String zu ersetzen.
private static String removeChar(String str, char c) {
if (str == null)
return null;
return str.replaceAll(Character.toString(c), "");
}
Wie kann man einen String
in Java in Großbuchstaben oder Kleinbuchstaben umwandeln?
Sie können die String
-Klasse verwenden, um die Methoden toUpperCase
und toLowerCase
aufzurufen, um das String
-Objekt in Groß- oder Kleinbuchstaben zu erhalten. Diese Methoden haben eine Variante, die ein Locale
-Argument akzeptiert und die Regeln des angegebenen Gebiets festlegt, um den String in Groß- oder Kleinbuchstaben umzuwandeln.
Was ist die Methode String subSequence
?
Java 1.4 hat das CharSequence
-Interface eingeführt, und die String
-Klasse implementiert dieses Interface. Deshalb hat die String
-Klasse die subSequence
-Methode. Intern ruft die subSequence
-Methode intern die String substring
-Methode auf.
Wie vergleichen Sie zwei Strings in einem Java-Programm?
Java String
implementiert das Comparable
-Interface, das zwei Varianten der Methode compareTo()
hat. Die Methode compareTo(String anotherString)
vergleicht das String
-Objekt lexicographisch mit dem übergebenen String
-Argument. Wenn das String
-Objekt dem übergebenen Argument vorausgeht, gibt es eine negative Ganzzahl zurück, und wenn das String
-Objekt dem übergebenen Argument folgt, gibt es eine positive Ganzzahl zurück. Es gibt null zurück, wenn beide String
-Objekte den gleichen Wert haben. In diesem Fall gibt auch die Methode equals(String str)
true
zurück. Die Methode compareToIgnoreCase(String str)
ist der ersten ähnlich, außer dass sie die Groß- und Kleinschreibung ignoriert. Sie verwendet Comparator
mit CASE_INSENSITIVE_ORDER
für den Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung. Wenn der Wert null ist, gibt equalsIgnoreCase(String str)
ebenfalls true
zurück.
Wie konvertiert man in Java einen String
in ein Zeichenarray?
A String
object is a sequence of characters, so you can’t convert it to a single character. You can use use the charAt
method to get the character at given index or you can use the toCharArray()
method to convert a string to character array. Learn more about converting a string to a character array.
Wie konvertiert man in Java einen String
in ein Byte-Array?
Sie können die getBytes()
-Methode verwenden, um ein String
-Objekt in ein Byte-Array umzuwandeln, und Sie können den Konstruktor new String(byte[] arr)
verwenden, um ein Byte-Array in ein String
-Objekt umzuwandeln. Erfahren Sie mehr über die Umwandlung eines Strings in ein Byte-Array.
Können Sie String
in einem Switch-Case in Java verwenden?
Java 7 hat die Fähigkeit von Switch-Case auf Strings
erweitert; frühere Java-Versionen unterstützen dies nicht. Wenn Sie bedingte Flusssteuerungen für Strings implementieren, können Sie if-else-Bedingungen verwenden, und Sie können Switch-Case verwenden, wenn Sie Java 7 oder höhere Versionen verwenden. Erfahren Sie mehr über Java-Switch-Case-String.
Schreiben Sie ein Java-Programm, um alle Permutationen eines Strings zu drucken.
Sie müssen Rekursion verwenden, um alle Permutationen einer Zeichenkette zu finden. Zum Beispiel sind die Permutationen von AAB
AAB
, ABA
und BAA
. Sie müssen auch Set
verwenden, um sicherzustellen, dass keine doppelten Werte vorhanden sind. Erfahren Sie mehr über das Finden aller Permutationen einer Zeichenkette.
Schreiben Sie eine Java-Funktion, um das längste Palindrom in einer gegebenen Zeichenkette zu finden.
A string can contain palindrome substrings within it. Learn more about how to find the longest palindrome substring in a string.
Was sind die Unterschiede zwischen String
, StringBuffer
und StringBuilder
in Java?
A String
object is immutable and final in Java, so whenever you manipulate a String
object, it creates a new String
object. String manipulations are resource consuming, so Java provides two utility classes for string manipulations, StringBuffer
and StringBuilder
.
StringBuffer
und StringBuilder
sind veränderbare Klassen. Die Operationen von StringBuffer
sind threadsicher und synchronisiert, während die Operationen von StringBuilder
nicht threadsicher sind. In einer Mehrfadenumgebung sollte StringBuffer
verwendet werden, während in einer Einzelfadenumgebung StringBuilder
bevorzugt wird. Die Leistung von StringBuilder
ist aufgrund des fehlenden Synchronisationsaufwands schneller als die von StringBuffer
.
Erfahren Sie mehr über die Unterschiede zwischen String
, StringBuffer
und StringBuilder
sowie über das Benchmarking von StringBuffer und StringBuilder.
Warum ist String
in Java unveränderlich?
String
ist in Java unveränderlich, da dies mehrere Vorteile bietet:
- Der String-Pool ist möglich, weil
String
in Java unveränderlich ist. - Es erhöht die Sicherheit, da ein Hacker seinen Wert nicht ändern kann, und er wird zum Speichern sensibler Informationen wie eines Datenbankbenutzernamens oder -passworts verwendet.
- Aufgrund der Unveränderlichkeit von
String
ist er sicher in der Mehrfadenverarbeitung und erfordert keine Synchronisation. - Zeichenfolgen werden in Java-Klassenladern verwendet und Unveränderlichkeit stellt sicher, dass die richtige Klasse durch die Klasse
ClassLoader
geladen wird.
Erfahren Sie mehr darüber, warum String
in Java unveränderlich ist.
Wie teilt man einen String in Java auf?
Sie können split(String regex)
verwenden, um den String
basierend auf dem angegebenen regulären Ausdruck in ein String
-Array aufzuteilen.
Warum wird in Java ein Zeichenarray bevorzugt, um Passwörter zu speichern?
A String
object is immutable in Java and is stored in the string pool. Once it’s created it stays in the pool until garbage collection completes, so even though you’re done with the password it’s available in memory for longer duration. It’s a security risk because anyone having access to memory dump can find the password as clear text. If you use a character array to store password, you can set it to blank once you’re done with it. You can control for how long it’s available in memory and that avoids the security threat.
Wie überprüft man, ob zwei Strings in Java gleich sind?
Es gibt zwei Möglichkeiten, um festzustellen, ob zwei Strings gleich sind. Sie können den ==
-Operator oder die equals()
-Methode verwenden. Wenn Sie den ==
-Operator verwenden, überprüft er den Wert des String
sowie die Objektreferenz. Oft möchten Sie in der Java-Programmierung nur die Gleichheit des String
-Werts überprüfen. In diesem Fall sollten Sie die equals()
-Methode verwenden, um festzustellen, ob zwei Strings
gleich sind. Es gibt eine weitere Funktion namens equalsIgnoreCase
, die Sie verwenden können, um die Groß-/Kleinschreibung zu ignorieren.
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
Was ist der String-Pool in Java?
Der String-Pool ist ein Pool von String
-Objekten, die im Java-Heap-Speicher gespeichert sind. String
ist eine spezielle Klasse in Java, und Sie können ein String
-Objekt sowohl mit dem new
-Operator als auch durch Bereitstellen von Werten in doppelten Anführungszeichen erstellen. Erfahren Sie mehr über den Java-String-Pool.
Was macht die Java-Methode String intern()
?
Wenn die Methode intern()
aufgerufen wird und der Pool bereits eine String
enthält, die diesem String
-Objekt entspricht, wie durch die Methode equals(Object)
bestimmt, wird der String aus dem Pool zurückgegeben. Andernfalls wird dieses String
-Objekt dem Pool hinzugefügt und eine Referenz auf dieses String
-Objekt zurückgegeben. Diese Methode gibt immer ein String
-Objekt zurück, das den gleichen Inhalt wie dieser String
hat, aber garantiert aus einem Pool einzigartiger Zeichenfolgen stammt.
Ist String
in Java thread-sicher?
A String
object is immutable, so you can’t change its value after creation. This makes the String
object thread-safe and so it can be safely used in a multi-threaded environment. Learn more about thread Safety in Java.
Warum ist String
ein beliebter Schlüssel für HashMap
in Java?
Da ein String
-Objekt unveränderlich ist, wird sein Hashcode zum Zeitpunkt der Erstellung zwischengespeichert und muss nicht erneut berechnet werden. Das macht es zu einem hervorragenden Kandidaten für den Schlüssel in einer Map, da die Verarbeitung schneller ist als bei anderen Schlüsselobjekten von HashMap
.
Vermutete Ausgabe
Testen Sie sich selbst, indem Sie die Ausgabe der folgenden Java-Code-Schnipsel erraten.
public class StringTest {
public static void main(String[] args) {
String s1 = new String("digitalocean");
String s2 = new String("DIGITALOCEAN");
System.out.println(s1 = s2);
}
}
Output
DIGITALOCEAN
Die Ausgabe ist DIGITALOCEAN
, weil der Code den Wert von String s2
der Variable String s1
zuweist. =
ist ein Zuweisungsoperator, der den Wert von y
im Format (x = y)
der Variable x
zuweist. ==
ist ein Vergleichsoperator, der überprüfen würde, ob das Referenzobjekt für die beiden Strings identisch ist.
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);
}
}
Output
Test.java:12: error: reference to foo is ambiguous
new Test().foo(null);
^
both method foo(String) in Test and method foo(StringBuffer) in Test match
Dieser Code führt zu einem Kompilierungsfehler, da beide foo
-Methoden denselben Namen haben und der Aufruf der foo
-Methode in main
null
übergibt. Der Compiler weiß nicht, welche Methode aufgerufen werden soll. Sie können auch auf den Fehler „Methode X ist mehrdeutig für den Typ Y“ verweisen.
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
Output
false
Die Ausgabe ist false
, weil der Code den new
-Operator verwendet, um das String
-Objekt zu erstellen. Daher wird es im Heap-Speicher erstellt, und s1
und s2
haben unterschiedliche Referenzen. Wenn Sie die Zeichenketten nur mit doppelten Anführungszeichen erstellen, befinden sie sich im Zeichenkettenpool, und es wird true
gedruckt.
String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));
Output
false
Die Ausgabe ist false
, weil s2
nicht vom Typ String
ist. Die Implementierung der equals()
-Methode in der String
-Klasse verwendet den instanceof
-Operator, um zu überprüfen, ob der übergebene Objekttyp String
ist, und gibt false
zurück, wenn das Objekt nicht vom Typ String
ist.
String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);
Output
false
Die Ausgabe ist false
. Die Methode intern()
gibt die Referenz des String
-Objekts aus dem Zeichenkettenpool zurück. Der Code weist es jedoch nicht s2
zu, und es gibt keine Änderung in s2
, sodass s1
und s2
unterschiedliche Objektreferenzen haben. Wenn Sie den Code in Zeile 3 zu s2 = s2.intern();
ändern, lautet die Ausgabe true
.
Wie viele String
-Objekte werden durch den folgenden Code erstellt?
String s1 = new String("Hello");
String s2 = new String("Hello");
Answer
Die Antwort lautet drei. Der Code in Zeile 1 erstellt ein String
-Objekt mit dem Wert Hello
im String-Pool (erstes Objekt) und erstellt dann ein neues String
-Objekt mit dem Wert Hello
im Heap-Speicher (zweites Objekt). Der Code in Zeile 2 erstellt ein neues String
-Objekt mit dem Wert Hello
im Heap-Speicher (drittes Objekt) und verwendet den Hello
-String aus dem String-Pool erneut.
Fazit
In diesem Artikel wurden einige Java-Interviewfragen speziell zu String
behandelt.
Empfohlene Lektüre:
Source:
https://www.digitalocean.com/community/tutorials/java-string-interview-questions-and-answers