Questions et Réponses sur les Chaînes Java

Introduction

String est l’une des classes Java les plus largement utilisées. Cet article fournit quelques questions et réponses pratiques sur String pour vous aider à vous préparer à un entretien.

Vous pouvez également essayer le Quiz sur les Chaînes Java pour tester vos connaissances sur la classe String.

Qu’est-ce que la classe String en Java? String est-il un type de données?

String est une classe en Java et est définie dans le package java.lang. Ce n’est pas un type de données primitif comme int et long. La classe String représente des chaînes de caractères. String est utilisé dans presque toutes les applications Java. String est immuable et final en Java et le JVM utilise un pool de chaînes pour stocker tous les objets String. Vous pouvez instancier un objet String en utilisant des guillemets doubles et vous pouvez surcharger l’opérateur + pour la concaténation.

Quelles sont les différentes façons de créer un objet String en Java?

Vous pouvez créer un objet String en utilisant l’opérateur new ou en utilisant des guillemets doubles pour créer un objet String. Par exemple :

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

Il existe plusieurs constructeurs disponibles dans la classe String pour obtenir une String à partir d’un tableau de caractères, d’un tableau de bytes, d’un StringBuffer et d’un StringBuilder.

Lorsque vous créez une String en utilisant des guillemets doubles, la JVM recherche dans le pool de chaînes pour voir si une autre String est stockée avec la même valeur. Si la String est déjà stockée dans le pool, la JVM renvoie la référence à cet objet String. Si la nouvelle String n’est pas dans le pool, la JVM crée un nouvel objet String avec la valeur donnée et le stocke dans le pool de chaînes. Lorsque vous utilisez l’opérateur new, la JVM crée l’objet String mais ne le stocke pas dans le pool de chaînes. Vous pouvez utiliser la méthode intern() pour stocker l’objet String dans le pool de chaînes ou renvoyer la référence s’il y a déjà une String avec une valeur égale présente dans le pool.

Écrivez une méthode Java pour vérifier si une chaîne d’entrée est un palindrome.

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

Parfois, un interviewer peut demander de ne pas utiliser une autre classe pour vérifier un palindrome. Dans ce cas, vous pouvez comparer les caractères dans la chaîne des deux extrémités pour déterminer s’il s’agit d’un palindrome. Par exemple:

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

Écrivez une méthode Java qui supprimera un caractère donné d’un objet chaîne.

Nous pouvons utiliser la méthode replaceAll pour remplacer toutes les occurrences d’une chaîne par une autre chaîne. Le point important à noter est que replaceAll() accepte une String comme argument, vous pouvez donc utiliser la classe Character pour créer une chaîne et l’utiliser pour remplacer tous les caractères par une chaîne vide.

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

Comment pouvez-vous mettre une String en majuscules ou en minuscules en Java?

Vous pouvez utiliser la classe String avec les méthodes toUpperCase et toLowerCase pour obtenir un objet String entièrement en majuscules ou minuscules. Ces méthodes ont une variante qui accepte un argument Locale et utilise les règles de la locale donnée pour convertir la chaîne en majuscules ou minuscules.

Quelle est la méthode String subSequence?

Java 1.4 a introduit l’interface CharSequence et la classe String implémente cette interface, c’est pourquoi la classe String a la méthode subSequence. En interne, la méthode subSequence invoque la méthode String substring.

Comment comparez-vous deux chaînes dans un programme Java?

Java String implémente l’interface Comparable, qui possède deux variantes de la méthode compareTo(). La méthode compareTo(String anotherString) compare l’objet String avec l’argument String passé lexicographiquement. Si l’objet String précède l’argument, elle renvoie un entier négatif, et si l’objet String suit l’argument, elle renvoie un entier positif. Elle renvoie zéro lorsque les deux objets String ont la même valeur. Dans ce cas, la méthode equals(String str) renvoie également true. La méthode compareToIgnoreCase(String str) est similaire à la première, à l’exception qu’elle ignore la casse. Elle utilise Comparator avec CASE_INSENSITIVE_ORDER pour une comparaison insensible à la casse. Si la valeur est zéro, alors equalsIgnoreCase(String str) renverra également true.

Comment convertir une String en tableau de caractères en 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.

Comment convertir une String en tableau de bytes en Java?

Vous pouvez utiliser la méthode getBytes() pour convertir un objet String en un tableau d’octets et vous pouvez utiliser le constructeur new String(byte[] arr) pour convertir un tableau d’octets en objet String. En savoir plus sur la conversion d’une chaîne en tableau d’octets.

Pouvez-vous utiliser String dans un switch case en Java?

Java 7 a étendu la capacité du switch case aux Strings; les versions antérieures de Java ne prennent pas en charge cela. Si vous implémentez un flux conditionnel pour les chaînes, vous pouvez utiliser des conditions if-else et vous pouvez utiliser un switch case si vous utilisez Java 7 ou des versions supérieures. En savoir plus sur le switch case string en Java.

Écrivez un programme Java pour afficher toutes les permutations d’une chaîne.

Vous devrez utiliser la récursivité pour trouver toutes les permutations d’une chaîne. Par exemple, les permutations de AAB sont AAB, ABA et BAA. Vous devez également utiliser Set pour vous assurer qu’il n’y a pas de valeurs en double. En savoir plus sur la recherche de toutes les permutations d’une chaîne.

Écrivez une fonction Java pour trouver le plus long palindrome dans une chaîne donnée.

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

Quelles sont les différences entre String, StringBuffer et StringBuilder en 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 et StringBuilder sont des classes mutables. Les opérations de StringBuffer sont thread-safe et synchronisées, tandis que les opérations de StringBuilder ne le sont pas. Vous devriez utiliser StringBuffer dans un environnement multi-thread et utiliser StringBuilder dans un environnement mono-thread. Les performances de StringBuilder sont plus rapides que celles de StringBuffer en raison de l’absence de surcharge de synchronisation.

Apprenez-en davantage sur les différences entre String, StringBuffer et StringBuilder et le benchmarking de StringBuffer et StringBuilder.

Pourquoi String est-il immuable en Java?

String est immuable en Java car cela offre plusieurs avantages :

  • Le pool de chaînes est possible car String est immuable en Java.
  • Cela augmente la sécurité car aucun pirate informatique ne peut modifier sa valeur et il est utilisé pour stocker des informations sensibles telles qu’un nom d’utilisateur ou un mot de passe de base de données.
  • Étant donné que String est immuable, il est sûr de l’utiliser dans le multi-threading et vous n’avez pas besoin de synchronisation.
  • Les chaînes de caractères sont utilisées dans les chargeurs de classes Java et l’immutabilité garantit que la classe correcte est chargée par la classe ClassLoader.

Apprenez-en plus sur pourquoi String est immutable en Java.

Comment divisez-vous une chaîne de caractères en Java?

Vous pouvez utiliser split(String regex) pour diviser la chaîne de caractères en un tableau de chaînes de caractères en fonction de l’expression régulière fournie.

Pourquoi un tableau de caractères est-il préféré à String pour stocker les mots de passe en 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.

Comment vérifiez-vous si deux chaînes de caractères sont égales en Java?

Il existe deux façons de vérifier si deux chaînes de caractères sont égales. Vous pouvez utiliser l’opérateur == ou la méthode equals(). Lorsque vous utilisez l’opérateur ==, il vérifie la valeur de la String ainsi que la référence de l’objet. Souvent en programmation Java, vous voulez vérifier uniquement l’égalité de la valeur de la String. Dans ce cas, vous devriez utiliser la méthode equals() pour vérifier si deux Strings sont égales. Il existe une autre fonction appelée equalsIgnoreCase que vous pouvez utiliser pour ignorer la casse.

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

Qu’est-ce que le pool de chaînes de caractères en Java?

Le pool de chaînes de caractères est un ensemble d’objets String stockés dans la mémoire heap de Java. String est une classe spéciale en Java et vous pouvez créer un objet String en utilisant l’opérateur new ainsi qu’en fournissant des valeurs entre guillemets doubles. En savoir plus sur le pool de chaînes de caractères Java.

Que fait la méthode intern() de Java?

Lorsque la méthode intern() est invoquée, si le pool contient déjà un objet String égal à cet objet String tel que déterminé par la méthode equals(Object), alors la chaîne du pool est renvoyée. Sinon, cet objet String est ajouté au pool et une référence à cet objet String est renvoyée. Cette méthode renvoie toujours un objet String qui a le même contenu que cet objet String, mais qui est garanti d’être issu d’un pool de chaînes uniques.

Est-ce que String est thread-safe en 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.

Puisqu’un objet String est immuable, son code de hachage est mis en cache au moment de sa création et n’a pas besoin d’être recalculé. Cela en fait un excellent candidat pour la clé dans une Map car son traitement est plus rapide que celui d’autres objets clé HashMap.

Devinez la sortie

Testez-vous en devinant la sortie des extraits de code Java suivants.

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

La sortie est DIGITALOCEAN car le code affecte la valeur de String s2 à String s1. = est un opérateur d’affectation qui assigne la valeur de y à x au format (x = y). == est un opérateur de comparaison qui vérifierait si l’objet de référence est le même pour les deux chaînes.


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

Ce code entraîne une erreur de compilation car les deux méthodes foo ont le même nom et l’appel de la méthode foo dans main passe null. Le compilateur ne sait pas quelle méthode appeler. Vous pouvez également vous référer à l’erreur la méthode X est ambiguë pour le type Y.


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

La sortie est faux car le code utilise l’opérateur new pour créer l’objet String, il est donc créé dans la mémoire heap et s1 et s2 auront une référence différente. Si vous créez les chaînes de caractères en utilisant uniquement des guillemets doubles, alors elles seront dans le pool de chaînes de caractères et cela affichera vrai.


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

La sortie est faux car s2 n’est pas de type String. La méthode equals() de la classe String utilise l’opérateur instanceof pour vérifier si le type de l’objet passé est String et renvoie faux si l’objet n’est pas de type String.


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

La sortie est faux. La méthode intern() renvoie la référence de l’objet String depuis le pool de chaînes de caractères. Cependant, le code ne l’assigne pas à nouveau à s2 et il n’y a aucun changement dans s2, donc s1 et s2 ont une référence d’objet différente. Si vous modifiez le code à la ligne 3 par s2 = s2.intern();, alors la sortie sera vrai.

Combien d’objets String sont créés par le code suivant ?

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

La réponse est trois. Le code à la ligne 1 crée un objet String avec la valeur Hello dans le pool de chaînes (premier objet) puis crée un nouvel objet String avec la valeur Hello dans la mémoire heap (deuxième objet). Le code à la ligne 2 crée un nouvel objet String avec la valeur Hello dans la mémoire heap (troisième objet) et réutilise la chaîne Hello du pool de chaînes.

Conclusion

Dans cet article, vous avez passé en revue quelques questions d’entretien Java spécifiquement sur les String.

Lecture recommandée:

Questions de programmation Java
Programmes de chaînes en Java

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