Domande e risposte sull’intervista alle stringhe Java

Introduzione

String è una delle classi Java più utilizzate. Questo articolo fornisce alcune domande e risposte pratiche su String per aiutarti a prepararti per un colloquio.

Puoi anche provare il Quiz sulle Stringhe Java per testare la tua conoscenza della classe String.

Cos’è la classe String in Java? È String un tipo di dato?

String è una classe in Java e è definita nel pacchetto java.lang. Non è un tipo di dato primitivo come int e long. La classe String rappresenta stringhe di caratteri. String è utilizzato in quasi tutte le applicazioni Java. String è immutabile e finale in Java e la JVM utilizza un pool di stringhe per memorizzare tutti gli oggetti String. Puoi istanziare un oggetto String usando le virgolette doppie e puoi sovraccaricare l’operatore + per la concatenazione.

alcune diverse modalità per creare un oggetto String in Java:

Puoi creare un oggetto String usando l’operatore new o puoi usare le virgolette doppie per creare un oggetto String. Ad esempio:

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

Nella classe String sono disponibili diversi costruttori per ottenere una String da un array di char, un array di byte, un StringBuffer e un StringBuilder.

Quando si crea una String usando le virgolette doppie, la JVM cerca nel pool di stringhe per vedere se esiste già un’altra String memorizzata con lo stesso valore. Se la String è già memorizzata nel pool, la JVM restituisce il riferimento a quell’oggetto String. Se la nuova String non è nel pool, la JVM crea un nuovo oggetto String con il valore dato e lo memorizza nel pool di stringhe. Quando si usa l’operatore new, la JVM crea l’oggetto String ma non lo memorizza nel pool di stringhe. Si può utilizzare il metodo intern() per memorizzare l’oggetto String nel pool di stringhe o restituire il riferimento se esiste già una String con lo stesso valore presente nel pool.

Scrivi un metodo Java per verificare se una stringa di input è un palindromo.

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);
}

A volte, un intervistatore potrebbe richiedere di non utilizzare altre classi per verificare se una stringa è un palindromo. In tal caso, è possibile confrontare i caratteri nella stringa da entrambe le estremità per determinare se è un palindromo. Ad esempio:

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;
}

Scrivi un metodo Java che rimuova un carattere specificato da una stringa.

Possiamo utilizzare il metodo replaceAll per sostituire tutte le occorrenze di una stringa con un’altra stringa. Il punto importante da notare è che replaceAll() accetta una String come argomento, quindi è possibile utilizzare la classe Character per creare una stringa e utilizzarla per sostituire tutti i caratteri con una stringa vuota.

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

Come si può rendere una stringa maiuscola o minuscola in Java?

Puoi utilizzare la classe String i metodi toUpperCase e toLowerCase per ottenere l’oggetto String in tutte le lettere maiuscole o minuscole. Questi metodi hanno una variante che accetta un argomento Locale e utilizza le regole della località fornita per convertire la stringa in maiuscolo o minuscolo.

Che cos’è il metodo String subSequence?

Java 1.4 ha introdotto l’interfaccia CharSequence e la classe String implementa questa interfaccia, ecco perché la classe String ha il metodo subSequence. Internamente, il metodo subSequence invoca il metodo String substring.

Come si confrontano due stringhe in un programma Java?

La classe Java String implementa l’interfaccia Comparable, che ha due varianti del metodo compareTo(). Il metodo compareTo(String anotherString) confronta l’oggetto String con l’argomento String passato in modo lessicografico. Se l’oggetto String precede l’argomento passato, restituisce un numero intero negativo, e se l’oggetto String segue l’argomento passato, restituisce un numero intero positivo. Restituisce zero quando entrambi gli oggetti String hanno lo stesso valore. In questo caso, il metodo equals(String str) restituisce anche true. Il metodo compareToIgnoreCase(String str) è simile al primo, tranne che ignora il caso. Utilizza il Comparator con CASE_INSENSITIVE_ORDER per il confronto senza distinzione tra maiuscole e minuscole. Se il valore è zero, allora equalsIgnoreCase(String str) restituirà anche true.

Come convertire una String in un array di caratteri 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.

Come convertire una String in un array di byte in Java?

Puoi utilizzare il metodo getBytes() per convertire un oggetto String in un array di byte e puoi utilizzare il costruttore new String(byte[] arr) per convertire un array di byte in un oggetto String. Scopri di più sulla conversione di una stringa in un array di byte.

Puoi utilizzare String nel caso switch in Java?

Java 7 ha esteso la capacità del caso switch alle String; le versioni precedenti di Java non supportano questo. Se stai implementando flussi condizionali per le stringhe, puoi usare condizioni if-else e puoi utilizzare il caso switch se stai usando Java 7 o versioni più recenti. Scopri di più su Java switch case stringa.

Scrivi un programma Java per stampare tutte le permutazioni di una stringa.

Dovrai utilizzare la ricorsione per trovare tutte le permutazioni di una stringa. Ad esempio, le permutazioni di AAB sono AAB, ABA e BAA. Devi anche utilizzare Set per assicurarti che non ci siano valori duplicati. Scopri di più su trovare tutte le permutazioni di una stringa.

Scrivi una funzione Java per trovare il palindromo più lungo in una data stringa.

A string can contain palindrome substrings within it. Learn more about how to find the longest palindrome substring in a string.

Quali sono le differenze tra String, StringBuffer e 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 e StringBuilder sono classi mutabili. Le operazioni di StringBuffer sono thread-safe e sincronizzate, mentre le operazioni di StringBuilder non lo sono. Dovresti utilizzare StringBuffer in un ambiente multi-threaded e utilizzare StringBuilder in un ambiente single-threaded. Le prestazioni di StringBuilder sono più veloci di StringBuffer a causa dell’assenza di overhead di sincronizzazione.

Scopri di più sulle differenze tra String, StringBuffer e StringBuilder e sui test di StringBuffer e StringBuilder.

Perché è immutabile String in Java?

String è immutabile in Java perché offre diversi vantaggi:

  • Il pool di stringhe è possibile perché String è immutabile in Java.
  • Aumenta la sicurezza perché nessun hacker può cambiarne il valore ed è utilizzato per memorizzare informazioni sensibili come nome utente o password del database.
  • Dato che String è immutabile, è sicuro utilizzarlo nel multi-threading e non è necessaria alcuna sincronizzazione.
  • Le stringhe sono utilizzate nei caricatori di classi Java e l’immutabilità garantisce che la classe corretta venga caricata dalla classe ClassLoader.

Per saperne di più su perché String è immutabile in Java.

Come si divide una stringa in Java?

Puoi utilizzare split(String regex) per dividere la String in un array di String basato sull’espressione regolare fornita.

Perché si preferisce un array di caratteri rispetto a String per memorizzare le password 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.

Come si verifica se due stringhe sono uguali in Java?

Ci sono due modi per verificare se due stringhe sono uguali. Puoi usare l’operatore == o il metodo equals(). Quando usi l’operatore ==, controlla il valore della String oltre al riferimento dell’oggetto. Spesso nella programmazione Java vuoi controllare solo l’uguaglianza del valore della String. In questo caso, dovresti usare il metodo equals() per verificare se due Stringhe sono uguali. C’è un’altra funzione chiamata equalsIgnoreCase che puoi usare per ignorare il caso.

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

Cos’è il pool di stringhe in Java?

Il pool di stringhe è un insieme di oggetti String memorizzati nella memoria heap di Java. String è una classe speciale in Java e puoi creare un oggetto String usando l’operatore new così come fornendo valori tra virgolette doppie. Scopri di più sul pool di stringhe Java.

Cosa fa il metodo Java String intern()?

Quando viene invocato il metodo intern(), se il pool contiene già una stringa uguale a questo oggetto String determinato dal metodo equals(Object), viene restituita la stringa dal pool. Altrimenti, questo oggetto String viene aggiunto al pool e viene restituito un riferimento a questo oggetto String. Questo metodo restituisce sempre un oggetto String che ha lo stesso contenuto di questo String ma è garantito di provenire da un pool di stringhe uniche.

È 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.

Essendo un oggetto String immutabile, il suo hashcode viene memorizzato al momento della creazione e non è necessario ricalcolarlo. Questo lo rende un ottimo candidato per la chiave in una mappa, poiché il suo processo è più veloce rispetto agli altri oggetti chiave di HashMap.

Testa le tue conoscenze indovinando l’output dei seguenti frammenti di codice 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);
   	}
    
}
Output
DIGITALOCEAN

L’output è DIGITALOCEAN perché il codice assegna il valore di String s2 a String s1. = è un operatore di assegnazione che assegna il valore di y a x nel formato (x = y). == è un operatore di confronto che verifica se l’oggetto di riferimento è lo stesso per le due stringhe.


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

Questo codice genera un errore di compilazione perché entrambi i metodi foo hanno lo stesso nome e la chiamata del metodo foo in main passa null. Il compilatore non sa quale metodo chiamare. Puoi fare riferimento anche all’errore il metodo X è ambiguo per il tipo Y.


String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
Output
false

Il risultato è `false` perché il codice utilizza l’operatore `new` per creare l’oggetto `String`, quindi viene creato nella memoria heap e `s1` e `s2` avranno un riferimento diverso. Se crei le stringhe usando solo le virgolette doppie, saranno nel pool di stringhe e stamperà `true`.


String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));
Output
false

Il risultato è `false` perché `s2` non è del tipo `String`. L’implementazione del metodo `equals()` nella classe `String` utilizza l’operatore `instanceof` per verificare se il tipo dell’oggetto passato è `String` e restituisce `false` se l’oggetto non è `String`.


String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);
Output
false

Il risultato è `false`. Il metodo `intern()` restituisce il riferimento all’oggetto `String` dal pool di stringhe. Tuttavia, il codice non lo assegna nuovamente a `s2` e non vi è alcuna modifica in `s2`, quindi `s1` e `s2` hanno un riferimento a oggetti diverso. Se cambi il codice alla riga 3 in `s2 = s2.intern();`, allora l’output sarà `true`.

Quanti oggetti `String` vengono creati dal seguente codice?

String s1 = new String("Hello");  
String s2 = new String("Hello");
Answer

La risposta è tre. Il codice nella riga 1 crea un oggetto String con il valore Hello nel pool di stringhe (primo oggetto) e quindi crea un nuovo oggetto String con il valore Hello nella memoria heap (secondo oggetto). Il codice nella riga 2 crea un nuovo oggetto String con valore Hello nella memoria heap (terzo oggetto) e riutilizza la stringa Hello dal pool di stringhe.

Conclusione

In questo articolo hai esaminato alcune domande di intervista Java specificamente riguardanti String.

Lettura consigliata:

Domande di programmazione Java
Programmi Stringa in Java

Source:
https://www.digitalocean.com/community/tutorials/java-string-interview-questions-and-answers