En Java las cadenas se tratan de forma diferente a C/C++, donde las cadenas son matrices de caracteres en las que se indica el final de la cadena con un carácter de valor '\0'.
En Java las cadenas son objetos de las clases predefinida String o StringBuffer, que están incluidas en el paquete java.lang.*.
Siempre que aparecen conjuntos de caracteres entre comillas dobles, el compilador de Java crea automáticamente un objeto String.
Si sólo existieran cadenas de sólo lectura (String), durante una serie de manipulaciones sobre un objeto String habría que crear un nuevo objeto para cada uno de los resultados intermedios.
El compilador es más eficiente y usa un objeto StringBuffer para construir cadenas a partir de las expresiones, creando el String final sólo cuando es necesario. Los objetos StringBuffer se pueden modificar, de forma que no son necesarios nuevos objetos para albergar los resultados intermedios.
Los caracteres de las cadenas tienen un índice que indica su posición. El primer carácter de una cadena tiene el índice 0, el segundo el 1, el tercero el 2 y así sucesivamente. Esto puede sonar familiar a los programadores de C/C++, pero resultar chocante para aquellos programadores que provengan de otros lenguajes.
b.) Operaciones básicas, comunes a String y StringBufferExisten una serie de métodos que son comunes a ambas clases.
Los siguientes métodos de acceso a las cadenas:
Los siguientes métodos para crear cadenas derivadas:
Y el método para transformar la cadena en un vector de caracteres:
La clase String proporciona cadenas de sólo lectura y soporta operaciones con ellas. Se pueden crear cadenas implícitamente mediante una cadena entrecomillada o usando + ó += con dos objetos String.
También se pueden crear objetos String explícitamente con el mecanismo new.
La clase String soporta multitud de constructores.
Además presenta los siguientes métodos para buscar caracteres o subcadenas en la cadena, y devuelven el índice que han encontrado o el valor -1 si la búsqueda no ha sido satisfactoria:
Java no trabaja con el código ASCII habitual, sino con el código avanzado Unicode.
El código Unicode (código universal) se caracteriza, sobre todo, por el uso de dos bytes por carácter. Esto permite aumentar los caracteres hasta 65000, y así se pueden representar los caracteres que componen las lenguas, vivas o muertas, más importantes del mundo.
Hay que tener en cuenta que si nos salimos del rango 0-255 que coincide con el código ASCII puede que las comparaciones no sean las esperadas.
Las funciones de comparación son las siguientes:
En Java se devuelven nuevas cadenas cada vez que se invoca a un método que crea una cadena diferente porque las cadenas String son de sólo lectura:
Para convertir una variable de un tipo de datos simple (char, boolean, int, long, float, double) en una cadena (String), bastará con invocar al método valueOf() del objeto String correspondiente:
Sin embargo para convertir el valor de una cadena en un tipo de datos simple deberemos utilizar los siguientes métodos:
Tipo |
De String |
boolean |
new Boolean(String).booleanValue() |
int |
Integer.ParseInt(String, int base) |
long |
Long.ParseLong(String, int base) |
float |
new Float(String).floatValue() |
double |
new Double(String).doubleValue() |
Tabla 20: Conversiones de cadenas a tipos simples
No hay ningún método que convierta los caracteres escapados Java ( \b, \udddd ) en variables carácter (char), o a la inversa. Lo que se puede hacer es invocar valueOf() con un carácter (char) para obtener una cadena de la clase String que contenga ese carácter.
Así mismo no hay formas de crear o decodificar cadenas de números en formatos octal (0) o hexadecimal(0x).
f.) Conversiones entre cadenas String y vectoresTambién existen diversos constructores y métodos de la clase String para tratar con vectores, tanto de caracteres como de bytes.
En cuanto a los vectores de caracteres existen:
En cuanto a los métodos para convertir vectores de byte (de 8 bits) en objetos String con caracteres Unicode de 16 bits existen:
Los constructores contenidos por la clase StringBuffer son:
Existen tres tipos de modificaciones que se pueden aplicar a la cadena.
Hay métodos de inserción:
Hay métodos de substitución:
Y métodos de borrado:
El buffer de un objeto StringBuffer tiene una capacidad que es la longitud de la cadena que puede almacenar sin tener que asignar más espacio. El buffer crece automáticamente a medida que se añaden caracteres, pero resulta más eficiente especificar el tamaño del buffer de una sola vez:
Para obtener un objeto String a partir de un objeto StringBuffer, debe invocarse el método toString(), común a ambas clases.
Se debe tener en cuenta que no hay métodos StringBuffer para eliminar una parte de un buffer. Para resolver este problema, debe crearse un vector de caracteres a partir del buffer, y construir un nuevo buffer con el contenido restante. Para esto se usa el método getChars(), común con la clase String.
D. Ejemplos de uso de cadenas a.) Ejemplo de Cadena Fija (de la clase String)En el siguiente ejemplo se muestra la utilización de los principales métodos de la clase String:
public static void main( String s[] ){ String cad = new String("Cadena Fija"); System.out.println("Ejemplo de String: '"+cad+"'"); //Métodos comunes a StringBuffer System.out.println("Su longitud es: "+cad.length()); System.out.println("Su tercer caracter es: "+cad.charAt(3)); System.out.print("Su subcadena del 3 al 6 es:"); System.out.println( cad.substring(2,6) ); char[] vectorcad = cad.toCharArray(); System.out.println("Creado un vector, de elemento 3: "); System.out.print( vectorcad[2] ); // Búsqueda en cadenas String subcad=new String("ena"); System.out.print("La subcadena '"+subcad+"'"); System.out.print(" aparece en la posicion: "); System.out.println( cad.indexOf(subcad) ); // Comparaciones String cadcomp=new String("CADENA Fija"); System.out.print("La cadena '"+cadcomp+"'"); if ( cad.compareTo(cadcomp) == 0 ) System.out.println(" ES igual 'Sensitive'"); else System.out.println(" NO es igual 'Sensitive'"); System.out.print("La cadena '"+cadcomp+"'"); if ( cad.equalsIgnoreCase(cadcomp) ) System.out.println(" ES igual 'Insensitive'"); else System.out.println(" NO = 'Insensitive'"); // Derivación System.out.print("Cadena derivada en minusculas: "); System.out.println( cad.toLowerCase() ); }
Lo que muestra por pantalla:
Ejemplo de String: 'Cadena Fija' Su longitud es: 11 Su tercer caracter es: e Su subcadena del 3 al 6 es: dena Creado un vector, de elemento 3: d La subcadena 'ena' aparece en la posicion: 3 La cadena 'CADENA Fija' NO es igual 'Sensitive' La cadena 'CADENA Fija' ES igual 'Insensitive' Cadena derivada en minusculas: cadena fija b.) Ejemplo de Cadena Variable (de la clase StringBuffer)En el siguiente ejemplo se muestra la utilización de los principales métodos de la clase StringBuffer:
public static void main( String s[] ){ StringBuffer cad = new StringBuffer("Cadena Variable"); System.out.println("Ejemplo de StringBuffer: '"+cad+"'"); // Modificación de la cadena cad.delete( 0, 6 ); System.out.println("Borrados 6 primeros caracteres: "+cad); cad.replace( cad.length()-3, cad.length(), "da" ); System.out.println("Sutituidos ultimos caracteres: "+cad); cad.append(" Cadena"); System.out.println("Apendizada con 'Cadena': "+cad); // Gestión de su capacidad System.out.println("Tiene capacidad de: "+cad.capacity()); cad.ensureCapacity( 32 ); System.out.println("Capacidad sobre 32:"+cad.capacity()); System.out.println(""); }
Lo que muestra por pantalla:
Ejemplo de StringBuffer: 'Cadena Variable' Borrados 6 primeros caracteres: Variable Sutituidos ultimos caracteres: Variada Apendizada con 'Cadena': Variada Cadena Tiene capacidad de: 31 Capacidad sobre 32: 64