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.
Pourquoi String
est-il une clé populaire de HashMap
en 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