Cadena
Java
String Concatenation
Una cadena es una secuencia de caracteres. Las cadenas son una parte fundamental de la mayoría de los programas, así pues Java tiene varias características incorporadas que facilitan la manipulación de cadenas. Java tiene una clase incorporada en el paquete java.lang
que encapsula las estructuras de datos de una cadena. Esta clase, llamada String
es la representación como objeto de una matriz de caracteres que no se puede cambiar. Hay una clase que la acompaña, llamada StringBuffer
, que se utiliza para crear cadenas que pueden ser manipuladas después de ser creadas.
El paquete java.lang
contiene dos clases de cadenas: String
y StringBuffer
. La clase String
se utiliza cuando se trabaja con cadenas que no pueden cambiar. Por otro lado, StringBuffer
, se utiliza cuando se quiere manipular el contenido de una cadena. El entorno de desarrollo Java proporciona dos clases para manipular y almacenar datos del tipo carácter: String
, para cadenas constantes, y StringBuffer
, para cadenas que pueden cambiar.
Como son constantes, los Strings
son más económicos (utilizan menos memoria) que los StringBuffers
y pueden ser compartidos. Por eso es importante utilizar String
siempre que sea apropiado.
Muchos Strings se crean a partir de cadenas literales. Cuando el compilador encuentra una serie de caracteres entre comillas ("
y "
), crea un objeto String
cuyo valor es el propio texto. El esquema general es el siguiente:
1String nombre = "Hola mundo";
También se pueden crear objetos String como se haría con cualquier otro objeto Java: utilizando new.
1String s = new String("Hola Mundo.");
El constructor anterior es equivalente pero es mucho más eficiente el primer método ya que, el segundo método crea dos objetos String en vez de sólo uno.
Se pueden utilizar cadenas literales en cualquier lugar donde se pueda utilizar un objeto String. Por ejemplo, System.out.println() acepta un argumenteo String, por eso se puede utilizar una cadena literal en su lugar:
1System.out.println("Hola Mundo!");
+
. El siguiente fragmento de código concatena tres cadenas para producir su salida:1"La entrada tiene " + contador + " caracteres."
Dos de las cadenas concatenadas son cadenas literales: "La entrada tiene " y " caracteres.". La tercera cadena - la del medio
- es realmente un entero que primero se convierte a cadena y luego se concatena con las otras.
1String s = "abc"; 2System.out.println(s.length());
El resultado de ejecutar el código anterior, sería la impresión de 3, que se corresponde con la longitud llamada s.
Un punto interesante en Java es que se crea una instancia de objeto para cada literal String, por lo que se puede llamar a los métodos directamente con una cadena entre comillas, como si fuera una referencia a objeto, con este ejemplo se volvería a imprimir un 3:
1String s = "abc"; 2System.out.println("abc".lenght());
1"abc".charAt(1)
Devolverá 'b'
Si se necesita extraer más de un carácter a la vez, puede utilizar el método getChars, que le permite especificar el índice del primer carácter y del último más uno que se desean copiar, además de la matriz char donde se desean colocar dichos caracteres.
1String s = "Esto no es una canción"; 2char buf[] = new char[2]; 3s.getChars(5, 7, buf, 0);
equals
de String. Devolverá true
si el único parámetro está compuesto de los mismos caracteres que el objeto con el que se llama a equals. Una forma alternativa de equals llamada equalsIgnoreCase
ignora si los caracteres de las cadenas que se comparan están en mayúsculas o minúsculas.Objeto_cadena1.equals(Objeto_cadena2); Objeto_cadena1.equalsIgnoreCase(Objeto_cadena2);
Veamos ahora un ejemplo:
1String cadena1="pepe"; 2String cadena2="juan"; 3if (cadena1.equals(cadena2)) 4{ 5 //codigo 6} 7if (cadena1.equalsIgnoreCase(cadena2)) 8{ 9 // codigo 10}
El método equals
y el operador ==
hacen dos pruebas completamente diferentes para la igualdad. Mientras que el método equals
compara los caracteres contenidos en una String, el operador ==
compara dos referencias de objeto para ver si se refieren a la misma instancia. Por tanto, no podemos usar el signo ==
por que esta sería una comparación binaria de punteros a memoria y no nos devolvería el valor correcto
Si lo que queremos es comparar cadenas para ordenarlas, una opción es usar el método compareTo()
de la clase String. Este método devuelve 0
si ambas cadenas tienen el mismo contenido, negativo
si el String es menor -va antes- que el parámetro que se le pasa y positivo
si es mayor. Es decir:
1if (cadena1.compareTo(cadena2) == 0) 2System.out.println("cadena1 y cadena2 son iguales"); 3else 4if (cadena1.compareTo(cadena2) < 0) 5System.out.println ("cadena1 va antes que cadena2"); 6else 7if (cadena1.compareTo(cadena2) > 0) 8System.out.println("cadena2 va después que cadena1");
1Objeto_cadena.toLowerCase(); // Lo convierte a minúsculas. 2Objeto_cadena.toUpperCase(); // Lo convierte a mayúsculas.
A veces es conveniente o necesario convertir un objeto a una cadena o String porque se necesitará pasarlo a un método que sólo acepta Strings. Por ejemplo, System.out.println() no acepta StringBuffers, por lo que necesita convertir el StringBuffer a String para poder imprimirlo. El método reverseIt() utiliza el método toString() de StringBuffer para convertirlo en un String antes de retornar.return dest.toString();
1class ReverseString { 2 public static String reverseIt(String source) { 3 int i, len = source.length(); 4 StringBuffer dest = new StringBuffer(len); 5 for (i = (len - 1); i >= 0; i--) { 6 dest.append(source.charAt(i)); 7 } 8 return dest.toString(); 9 } 10}
Todas las clases heredan toString() desde la clase Object y muchas clases del paquete java.lang sobreescriben este método para proporcionar una implementación más acorde con la propia clase. Por ejemplo, las clases Character, Integer, Boolean, etc.. sobreescriben toString() para proporcionar una representación en String de los objetos.
Como es conveniente, la clase String proporciona un método estático valueOf(). Se puede utilizar este método para convertir variables de diferentes tipos a un String. Por ejemplo, para imprimir el número pi:
1System.out.println(String.valueOf(Math.PI));
La clase String no porporciona ningún método para convertir una cadena en un número. Sin embargo, cuatro clases de los "tipos envolventes" (Integer, Double, Float, y Long) proporcionan unos métodos de clase llamados valueOf() que convierten una cadena en un objeto de ese tipo. Aquí tenemos un pequeño ejemplo del método valueOf() de la clase Float:
1String piStr = "3.14159"; 2Float pi = Float.valueOf(piStr);
En muchas ocasiones es necesario extraer una porción o substring de un string dado. Para este propósito hay una función miembro de la clase String denominada substring
.
Para estraer un substring desde una posición determinada hasta el final del string escribimos
1 String str="El lenguaje Java"; 2 String subStr=str.substring(12);
Se obtendrá el substring "Java".
Una segunda versión de la función miembro substring, nos permite extraer un substring especificando la posición de comienzo y la el final.
1 String str="El lenguaje Java"; 2 String subStr=str.substring(3, 11);
Se obtendrá el substring "lenguaje". Recuerda, que las posiciones se empiezan a contar desde cero.