Inleiding
String
is een van de meest gebruikte klassen in Java. Dit artikel biedt enkele oefenvragen en antwoorden over String
om je voor te bereiden op een sollicitatiegesprek.
Je kunt ook de Java String Quiz proberen om je kennis van de klasse String
te testen.
Wat is de String
-klasse in Java? Is String
een gegevenstype?
String
is een klasse in Java en is gedefinieerd in het pakket java.lang
. Het is geen primitief gegevenstype zoals int
en long
. De klasse String
vertegenwoordigt tekenreeksen. String
wordt gebruikt in bijna alle Java-toepassingen. String
is onveranderlijk en definitief in Java en de JVM gebruikt een stringpool om alle String
-objecten op te slaan. Je kunt een String
-object instantiëren met dubbele aanhalingstekens en je kunt de +
-operator overbelasten voor concatenatie.
Hoe kun je een String
object in Java aanmaken?
Je kunt een String
object aanmaken met de new
operator of je kunt dubbele aanhalingstekens gebruiken om een String
object te maken. Bijvoorbeeld:
String str = new String("abc");
String str1 = "abc";
Er zijn verschillende constructors beschikbaar in de String
klasse om een String
te krijgen van char array
, byte array
, StringBuffer
en StringBuilder
.
Wanneer je een String
maakt met dubbele aanhalingstekens, zoekt de JVM in de String pool om te vinden of er al een andere String
is opgeslagen met dezelfde waarde. Als de String
al in de pool is opgeslagen, geeft de JVM de referentie naar dat String
object terug. Als de nieuwe String
niet in de pool is, maakt de JVM een nieuw String
object aan met de gegeven waarde en slaat het op in de stringpool. Wanneer je de new
operator gebruikt, maakt de JVM het String
object aan maar slaat het niet op in de stringpool. Je kunt de intern()
methode gebruiken om het String
object in de String pool op te slaan of de referentie terug te geven als er al een String
met gelijke waarde aanwezig is in de pool.
Schrijf een Java-methode om te controleren of een invoerreeks een palindroom is.
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);
}
Soms kan een interviewer vragen dat je geen andere klasse gebruikt om te controleren op een palindroom. In dat geval kun je tekens in de reeks van beide uiteinden vergelijken om te bepalen of het een palindroom is. Bijvoorbeeld:
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;
}
Schrijf een Java-methode die een opgegeven karakter uit een tekenreeksobject verwijdert.
We kunnen de replaceAll
-methode gebruiken om alle voorkomens van een tekenreeks te vervangen door een andere tekenreeks. Het belangrijke punt om op te merken is dat replaceAll()
een String
als argument accepteert, dus je kunt de Character
-klasse gebruiken om een tekenreeks te maken en deze gebruiken om alle tekens te vervangen door een lege tekenreeks.
private static String removeChar(String str, char c) {
if (str == null)
return null;
return str.replaceAll(Character.toString(c), "");
}
Hoe kun je een String
hoofdletters of kleine letters maken in Java?
U kunt de klasse String
gebruiken met de methoden toUpperCase
en toLowerCase
om het String
-object volledig in hoofdletters of kleine letters te krijgen. Deze methoden hebben een variant die een Locale
-argument accepteert en de regels van de opgegeven regio gebruikt om de string naar hoofdletters of kleine letters te converteren.
Wat is de methode String subSequence
?
Java 1.4 introduceerde de interface CharSequence
en de klasse String
implementeert deze interface, daarom heeft de klasse String
de methode subSequence
. Intern roept de methode subSequence
intern de methode String substring
aan.
Hoe vergelijkt u twee strings in een Java-programma?
Java String
implementeert de Comparable
-interface, die twee varianten heeft van de methode compareTo()
. De methode compareTo(String anotherString)
vergelijkt het String
-object lexicografisch met het meegegeven String
-argument. Als het String
-object voorafgaat aan het meegegeven argument, wordt een negatief getal geretourneerd. Als het String
-object volgt op het meegegeven argument, wordt een positief getal geretourneerd. Het retourneert nul wanneer beide String
-objecten dezelfde waarde hebben. In dat geval retourneert de methode equals(String str)
ook true
. De methode compareToIgnoreCase(String str)
is vergelijkbaar met de eerste methode, behalve dat het hoofdlettergebruik wordt genegeerd. Het gebruikt Comparator
met CASE_INSENSITIVE_ORDER
voor hoofdletterongevoelige vergelijking. Als de waarde nul is, zal equalsIgnoreCase(String str)
ook true
retourneren.
Hoe converteer je een String
naar een karakterarray in Java?
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.
Hoe converteer je een String
naar een byte-array in Java?
U kunt de methode getBytes()
gebruiken om een String
-object naar een byte-array te converteren en u kunt de constructor new String(byte[] arr)
gebruiken om een byte-array naar een String
-object te converteren. Leer meer over het converteren van een string naar een byte-array.
Kun je String
gebruiken in een switch-case in Java?
Java 7 heeft de mogelijkheid van switch-case uitgebreid naar Strings
; eerdere Java-versies ondersteunen dit niet. Als u conditionele doorstroming voor strings implementeert, kunt u if-else-voorwaarden gebruiken en kunt u switch-case gebruiken als u Java 7 of hogere versies gebruikt. Leer meer over Java switch-case string.
Schrijf een Java-programma om alle permutaties van een string af te drukken.
Je moet recursie gebruiken om alle permutaties van een string te vinden. Bijvoorbeeld, de permutaties van AAB
zijn AAB
, ABA
en BAA
. Je moet ook Set
gebruiken om ervoor te zorgen dat er geen duplicaatwaarden zijn. Meer informatie over het vinden van alle permutaties van een string.
Schrijf een Java-functie om het langste palindroom in een gegeven string te vinden.
A string can contain palindrome substrings within it. Learn more about how to find the longest palindrome substring in a string.
Wat zijn de verschillen tussen String
, StringBuffer
en 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
en StringBuilder
zijn mutabele klassen. De bewerkingen van StringBuffer
zijn thread-safe en gesynchroniseerd, terwijl de bewerkingen van StringBuilder
niet thread-safe zijn. Je zou StringBuffer
moeten gebruiken in een multi-threaded omgeving en StringBuilder
in een single-threaded omgeving. De prestaties van StringBuilder
zijn sneller dan die van StringBuffer
vanwege het ontbreken van synchronisatie-overhead.
Leer meer over de verschillen tussen String
, StringBuffer
en StringBuilder
en benchmarking van StringBuffer en StringBuilder.
Waarom is String
onveranderlijk in Java?
String
is onveranderlijk in Java omdat dit verschillende voordelen biedt:
- String pool is mogelijk omdat
String
onveranderlijk is in Java. - Het verhoogt de veiligheid omdat een hacker de waarde niet kan wijzigen en het wordt gebruikt voor het opslaan van gevoelige informatie zoals een database gebruikersnaam of wachtwoord.
- Omdat
String
onveranderlijk is, is het veilig te gebruiken in multi-threading en heb je geen synchronisatie nodig. - Strings worden gebruikt in Java-classloaders en onveranderlijkheid zorgt ervoor dat de juiste klasse wordt geladen door de
ClassLoader
-klasse.
Leer meer over waarom String
onveranderlijk is in Java.
Hoe splits je een string in Java?
Je kunt split(String regex)
gebruiken om de String
te splitsen in een String
-array op basis van de meegegeven reguliere expressie.
Waarom heeft een karakterarray de voorkeur boven String
voor het opslaan van wachtwoorden in Java?
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.
Hoe controleer je of twee Strings gelijk zijn in Java?
Er zijn twee manieren om te controleren of twee Strings gelijk zijn. Je kunt de ==
-operator gebruiken of de equals()
-methode. Wanneer je de ==
-operator gebruikt, controleert het zowel de waarde van de String
als de objectreferentie. Vaak wil je in Java-programmering alleen controleren op de gelijkheid van de String
-waarde. In dat geval moet je de equals()
-methode gebruiken om te controleren of twee Strings
gelijk zijn. Er is nog een functie genaamd equalsIgnoreCase
die je kunt gebruiken om hoofdlettergevoeligheid te negeren.
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
Wat is de string pool in Java?
De stringpool is een pool van String
-objecten opgeslagen in het Java heapgeheugen. String
is een speciale klasse in Java en je kunt een String
-object maken met behulp van de new
-operator, evenals door waarden tussen dubbele aanhalingstekens te plaatsen. Leer meer over de Java string pool.
Wat doet de Java String intern()
-methode?
Wanneer de intern()
-methode wordt aangeroepen en de pool bevat al een String
die gelijk is aan deze String
-instantie zoals bepaald door de equals(Object)
-methode, wordt de string uit de pool geretourneerd. Anders wordt deze String
-instantie aan de pool toegevoegd en wordt er een verwijzing naar deze String
-instantie geretourneerd. Deze methode retourneert altijd een String
-object met dezelfde inhoud als deze String
, maar het is gegarandeerd dat het afkomstig is uit een pool van unieke strings.
Is String
thread-safe in Java?
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.
Waarom is String
een populaire sleutel in een HashMap
in Java?
Aangezien een String
-object onveranderlijk is, wordt de hashcode ervan opgeslagen op het moment van creatie en hoeft deze niet opnieuw te worden berekend. Dit maakt het een uitstekende kandidaat voor de sleutel in een Map, aangezien de verwerking ervan sneller is dan andere sleutelobjecten zoals HashMap
.
Raad de uitvoer
Test jezelf door de uitvoer van de volgende Java-codefragmenten te raden.
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
De uitvoer is DIGITALOCEAN
omdat de code de waarde van String s2
toekent aan String s1
. =
is een toekenningsoperator die de waarde van y
toekent aan x
in het formaat (x = y)
. ==
is een vergelijkingsoperator die zou controleren of het referentieobject hetzelfde is voor de twee strings.
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
Deze code resulteert in een compilefout omdat beide foo
-methoden dezelfde naam hebben en de oproep voor de foo
-methode in main
null
doorgeeft. De compiler weet niet welke methode moet worden aangeroepen. Je kunt ook verwijzen naar de methode X is ambigu voor het type Y-fout.
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
Output
false
De uitvoer is \texttt{false} omdat de code de \texttt{new} operator gebruikt om het \texttt{String} object te maken, dus het wordt aangemaakt in het heapgeheugen en \texttt{s1} en \texttt{s2} zullen een verschillende referentie hebben. Als je de strings alleen met dubbele aanhalingstekens maakt, zullen ze in de string pool zijn en zal het \texttt{true} printen.
String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));
Output
false
De uitvoer is \texttt{false} omdat \texttt{s2} niet van het type \texttt{String} is. De \texttt{equals()} methode-implementatie in de \texttt{String} klasse heeft een \texttt{instanceof} operator om te controleren of het type van het doorgegeven object \texttt{String} is en geeft \texttt{false} terug als het object niet \texttt{String} is.
String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);
Output
false
De uitvoer is \texttt{false}. De \texttt{intern()} methode retourneert de \texttt{String} objectreferentie uit de string pool. Echter, de code wijst het niet terug naar \texttt{s2} en er is geen verandering in \texttt{s2} en dus hebben \texttt{s1} en \texttt{s2} een verschillende objectreferentie. Als je de code in regel 3 verandert naar \texttt{s2 = s2.intern();}, dan zal de uitvoer \texttt{true} zijn.
Hoeveel \texttt{String} objecten worden er gemaakt door de volgende code?
String s1 = new String("Hello");
String s2 = new String("Hello");
Answer
Het antwoord is drie. De code op regel 1 maakt een String
-object met de waarde Hello
in de string pool (eerste object) en maakt vervolgens een nieuw String
-object met de waarde Hello
in het heapgeheugen (tweede object). De code op regel 2 maakt een nieuw String
-object met de waarde Hello
in het heapgeheugen (derde object) en hergebruikt de Hello
-string uit de string pool.
Conclusie
In dit artikel heb je enkele Java-interviewvragen bekeken die specifiek gaan over String
.
Aanbevolen Lectuur:
Source:
https://www.digitalocean.com/community/tutorials/java-string-interview-questions-and-answers