Introducción
String
es una de las clases Java más utilizadas. Este artículo proporciona algunas preguntas de práctica y respuestas sobre String
para ayudarte a prepararte para una entrevista.
También puedes probar el Cuestionario de Java String para evaluar tu conocimiento de la clase String
.
¿Qué es la clase String
en Java? ¿Es String
un tipo de dato?
String
es una clase en Java y está definida en el paquete java.lang
. No es un tipo de dato primitivo como int
y long
. La clase String
representa cadenas de caracteres. String
se utiliza en casi todas las aplicaciones Java. String
es inmutable y final en Java y la JVM utiliza un pool de cadenas para almacenar todos los objetos String
. Puedes instanciar un objeto String
usando comillas dobles y puedes sobrecargar el operador +
para concatenación.
¿Cuáles son algunas formas diferentes de crear un objeto String
en Java?
Puedes crear un objeto String
utilizando el operador new
o puedes usar comillas dobles para crear un objeto String
. Por ejemplo:
String str = new String("abc");
String str1 = "abc";
Existen varios constructores disponibles en la clase String
para obtener un String
a partir de un array de caracteres
, un array de bytes
, un StringBuffer
y un StringBuilder
.
Cuando creas un String
utilizando comillas dobles, la JVM busca en el pool de cadenas para verificar si hay algún otro String
almacenado con el mismo valor. Si el String
ya está almacenado en el pool, la JVM devuelve la referencia a ese objeto String
. Si el nuevo String
no está en el pool, la JVM crea un nuevo objeto String
con el valor dado y lo almacena en el pool de cadenas. Cuando usas el operador new
, la JVM crea el objeto String
pero no lo almacena en el pool de cadenas. Puedes utilizar el método intern()
para almacenar el objeto String
en el pool de cadenas o devolver la referencia si ya hay un String
con un valor igual presente en el pool.
Escribe un método en Java para verificar si una cadena de entrada es un palíndromo.
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 veces, un entrevistador podría solicitar que no uses ninguna otra clase para verificar si es un palíndromo. En ese caso, puedes comparar caracteres en la cadena desde ambos extremos para averiguar si es un palíndromo. Por ejemplo:
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;
}
Escribe un método en Java que elimine un carácter dado de un objeto de cadena.
Podemos usar el método replaceAll
para reemplazar todas las ocurrencias de una cadena con otra cadena. El punto importante a tener en cuenta es que replaceAll()
acepta un argumento de tipo String
, por lo que puedes usar la clase Character
para crear una cadena y usarla para reemplazar todos los caracteres con una cadena vacía.
private static String removeChar(String str, char c) {
if (str == null)
return null;
return str.replaceAll(Character.toString(c), "");
}
¿Cómo puedes convertir una String
a mayúsculas o minúsculas en Java?
Puedes usar la clase `String
` y los métodos `toUpperCase
` y `toLowerCase
` para obtener el objeto `String
` en mayúsculas o minúsculas. Estos métodos tienen una variante que acepta un argumento `Locale
` y utilizan las reglas de la localidad dada para convertir la cadena a mayúsculas o minúsculas.
¿Cuál es el método `String subSequence
`?
Java 1.4 introdujo la interfaz `CharSequence
` y la clase `String
` implementa esta interfaz, por eso la clase `String
` tiene el método `subSequence
`. Internamente, el método `subSequence
` invoca al método `String substring
`.
¿Cómo comparas dos cadenas en un programa Java?
La clase Java String
implementa la interfaz Comparable
, la cual tiene dos variantes del método compareTo()
. El método compareTo(String anotherString)
compara el objeto String
con el argumento String
pasados de manera lexicográfica. Si el objeto String
precede al argumento, devuelve un entero negativo, y si el objeto String
sigue al argumento, devuelve un entero positivo. Devuelve cero cuando ambos objetos String
tienen el mismo valor. En este caso, el método equals(String str)
también devuelve true
. El método compareToIgnoreCase(String str)
es similar al primero, excepto que ignora el caso. Utiliza Comparator
con CASE_INSENSITIVE_ORDER
para la comparación insensible a mayúsculas y minúsculas. Si el valor es cero, entonces equalsIgnoreCase(String str)
también devolverá true.
¿Cómo se convierte un String
en un arreglo de caracteres 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.
¿Cómo se convierte un String
en un arreglo de bytes en Java?
Puedes utilizar el método getBytes()
para convertir un objeto String
a una matriz de bytes, y puedes usar el constructor new String(byte[] arr)
para convertir una matriz de bytes a un objeto String
. Obtén más información sobre convertir una cadena a una matriz de bytes.
¿Puedes usar String
en un caso de switch en Java?
Java 7 extendió la capacidad del caso de switch a Strings
; las versiones anteriores de Java no admiten esto. Si estás implementando flujos condicionales para cadenas, puedes usar condiciones if-else y puedes usar switch case si estás utilizando Java 7 o versiones superiores. Obtén más información sobre switch case de Java con cadenas.
Escribe un programa Java para imprimir todas las permutaciones de una cadena.
Necesitarás utilizar recursión para encontrar todas las permutaciones de una cadena. Por ejemplo, las permutaciones de AAB
son AAB
, ABA
y BAA
. También debes usar Set
para asegurarte de que no haya valores duplicados. Obtén más información sobre cómo encontrar todas las permutaciones de una cadena.
Escribe una función en Java para encontrar el palíndromo más largo en una cadena dada.
A string can contain palindrome substrings within it. Learn more about how to find the longest palindrome substring in a string.
¿Cuáles son las diferencias entre String
, StringBuffer
y 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
y StringBuilder
son clases mutables. Las operaciones de StringBuffer
son seguras para subprocesos y sincronizadas, mientras que las operaciones de StringBuilder
no son seguras para subprocesos. Deberías usar StringBuffer
en un entorno multi-hilo y StringBuilder
en un entorno de un solo hilo. El rendimiento de StringBuilder
es más rápido que el de StringBuffer
debido a la falta de sobrecarga de sincronización.
Aprende más sobre las diferencias entre String
, StringBuffer
y StringBuilder
y la comparación de rendimiento de StringBuffer y StringBuilder.
¿Por qué es inmutable String
en Java?
String
es inmutable en Java porque ofrece varios beneficios:
- La agrupación de cadenas es posible porque
String
es inmutable en Java. - Aumenta la seguridad porque ningún hacker puede cambiar su valor y se utiliza para almacenar información sensible como un nombre de usuario o contraseña de la base de datos.
- Dado que
String
es inmutable, es seguro usarlo en multi-hilos y no requiere ninguna sincronización. - Las cadenas se utilizan en los cargadores de clases de Java y la inmutabilidad proporciona la garantía de que la clase correcta se está cargando mediante la clase
ClassLoader
.
Aprenda más sobre por qué String
es inmutable en Java.
¿Cómo se divide una cadena en Java?
Puede utilizar split(String regex)
para dividir la String
en un arreglo de String
basado en la expresión regular proporcionada.
¿Por qué se prefiere una matriz de caracteres sobre String
para almacenar contraseñas 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.
¿Cómo se verifica si dos cadenas son iguales en Java?
Hay dos formas de verificar si dos cadenas son iguales. Puedes usar el operador ==
o el método equals()
. Cuando usas el operador ==
, verifica el valor de la String
así como la referencia del objeto. A menudo, en la programación en Java, quieres verificar solo la igualdad del valor de la String
. En este caso, deberías usar el método equals()
para verificar si dos Strings
son iguales. Hay otra función llamada equalsIgnoreCase
que puedes usar para ignorar mayúsculas y minúsculas.
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é es el pool de cadenas en Java?
El pool de cadenas es un conjunto de objetos String
almacenados en la memoria heap de Java. String
es una clase especial en Java y puedes crear un objeto String
utilizando el operador new
así como proporcionando valores entre comillas dobles. Aprende más sobre el pool de cadenas en Java.
¿Qué hace el método intern()
de Java?
Cuando se invoca el método intern()
, si el conjunto ya contiene un String
igual a este objeto String
según lo determinado por el método equals(Object)
, entonces se devuelve el string del conjunto. De lo contrario, este objeto String
se agrega al conjunto y se devuelve una referencia a este objeto String
. Este método siempre devuelve un objeto String
que tiene el mismo contenido que este String
, pero se garantiza que proviene de un conjunto de strings únicos.
¿Es String
seguro para subprocesos 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.
¿Por qué es popular String
como clave de HashMap
en Java?
Dado que un objeto String
es inmutable, su hashcode se almacena en caché en el momento de la creación y no necesita calcularse nuevamente. Esto lo convierte en un excelente candidato para la clave en un Map, ya que su procesamiento es más rápido que otros objetos clave de HashMap
.
Adivina la Salida
Prueba tus conocimientos al adivinar la salida de los siguientes fragmentos de código 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
La salida es DIGITALOCEAN
porque el código asigna el valor de String s2
a String s1
. =
es un operador de asignación que asigna el valor de y
a x
en el formato (x = y)
. ==
es un operador de comparación que verifica si el objeto de referencia es el mismo para las dos cadenas.
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
Este código resulta en un error en tiempo de compilación porque ambos métodos foo
tienen el mismo nombre y la llamada al método foo
en main
está pasando null
. El compilador no sabe qué método llamar. También puedes consultar el error “method X is ambiguous for the type Y”.
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
Output
false
El resultado es false
porque el código utiliza el operador new
para crear el objeto String
, por lo que se crea en la memoria heap y s1
y s2
tendrán una referencia diferente. Si creas las cadenas usando solo comillas dobles, entonces estarán en el pool de cadenas y imprimirá true
.
String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));
Output
false
El resultado es false
porque s2
no es del tipo String
. La implementación del método equals()
en la clase String
tiene un operador instanceof
para verificar si el tipo del objeto pasado es String
y devuelve false si el objeto no es String
.
String s1 = "abc";
String s2 = new String("abc");
s2.intern();
System.out.println(s1 == s2);
Output
false
El resultado es false
. El método intern()
devuelve la referencia del objeto String
desde el pool de cadenas. Sin embargo, el código no lo asigna de vuelta a s2
y no hay cambios en s2
y por lo tanto s1
y s2
tienen una referencia de objeto diferente. Si cambias el código en la línea 3 a s2 = s2.intern();
, entonces el resultado será true
.
¿Cuántos objetos String
se crean con el siguiente código?
String s1 = new String("Hello");
String s2 = new String("Hello");
Answer
La respuesta es tres. El código en la línea 1 crea un objeto String
con el valor Hello
en el pool de cadenas (primer objeto) y luego crea un nuevo objeto String
con el valor Hello
en la memoria heap (segundo objeto). El código en la línea 2 crea un nuevo objeto String
con el valor Hello
en la memoria heap (tercer objeto) y reutiliza la cadena Hello
del pool de cadenas.
Conclusión
En este artículo repasaste algunas preguntas de entrevista de Java específicamente sobre String
.
Lecturas recomendadas:
Preguntas de programación en Java
Programas de cadenas en Java
Source:
https://www.digitalocean.com/community/tutorials/java-string-interview-questions-and-answers