Preguntas y respuestas de entrevista sobre Java String

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.

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