Caracteres H. Tejeda Marzo 2016
´Indice 1. Aplicaciones con cadenas de caracteres
1
2. Manipulaci´ on de caracteres
2
3. Clase String
4
4. Otros m´ etodos de la clase String
8
5. Conversi´ on de objetos String a n´ umeros
12
6. Clases StringBuilder y StringBuffer
13
1.
Aplicaciones con cadenas de caracteres
Cuando se manipulan caracteres y cadenas de caracteres se le presentan al programador algunas tareas. En la aplicaci´on IntentarCompararStrings, c´odigo 1, el m´etodo main() declara un String llamada unNombre y le asigna la literal “Fernando” a este. Luego al usuario se le pide que ingrese un nombre. Despu´es la aplicaci´on compara los dos nombres usando el operador de equivalencia (==) y muestra uno de dos mensajes para indicar si las cadenas son equivalentes.
1
1 2 3 4 5 6 7 8 9 10 11 12 13 14
import j a v a . u t i l . Scanner ; public c l a s s I n t e n t a r C o m p a r a r S t r i n g s { public s t a t i c void main ( S t r i n g [ ] a r g s ) { S t r i n g unNombre = ” Fernando ” ; S t r i n g otroNombre ; Scanner t e c l a d o = new Scanner ( System . i n ) ; System . out . p r i n t ( ” I n g r e s a un nombre > ” ) ; otroNombre = t e c l a d o . n e x t L i n e ( ) ; i f ( unNombre == otroNombre ) System . out . p r i n t l n ( unNombre + ” i g u a l a ” + otroNombre ) ; else System . out . p r i n t l n ( unNombre + ” d i f e r e n t e a ” + otroNombre ) ; } }
C´odigo 1: La aplicaci´on IntentarCompararStrings. Cuando se ejecuta la aplicaci´on y el usuario ingresa “Fernando” como el valor para otroNombre, la aplicaci´on indica que los dos nombres no son iguales, por lo que da un resultado incorrecto. El problema se debe a que en Java, String es una clase, y cada String creado es un objeto, por lo que no es tipo de dato simple—es una referencia, as´ı la variable guarda una direcci´on de memoria. Por lo tanto, cuando se comparan dos objetos String usando el operador ==, lo que se comparan son sus localidades de memoria y no sus valores. Java proporciona tres clases que se pueden usar cuando se trabaja con datos de texto; ya que tienen varios m´etodos para manipular caracteres y cadenas f´acilmente, estas clases son: Character. Una clase cuyas instancias pueden guardar un s´olo valor car´acter y con m´etodos para manipular e inspeccionar el car´acter. String. Una clase para trabajar con cadenas de caracteres fijos. StringBuilder y StringBuffer. Estas clases guardan y manipulan datos variables compuestos de caracteres m´ ultiples.
2.
Manipulaci´ on de caracteres
El tipo de dato char es usado para guardar un s´olo car´acter cualquiera, por ejemplo, una letra, un d´ıgito, un signo de puntuaci´on. Adem´as de este tipo primitivo, Java tiene la clase Character, la cual tiene m´etodos est´andarizados para probar valores de car´acteres. El cuadro 1 describe algunos de los m´etodos de Character, aquellos m´etodos que inician con “is” son m´etodos que pueden ser usados en sentencias de comparaci´on, ya que devuelven un valor booleano, y los m´etodos que inician con “to” regresan un car´acter que ha sido convertido al formato se˜ nalado.
2
M´ etodo isDigit()
Descripci´ on Devuelve true si el argumento es un d´ıgito, false de otro modo. isLetter() Devuelve true si el argumento es una letra, false de otro modo. isLetterOrDigit() Devuelve true si el argumento es una letra o un d´ıgito, false de otro modo. isLowerCase() Devuelve true si el argumento es letra min´ uscula, false de otro modo. isUpperCase() Devuelve true si el argumento es letra may´ uscula, false de otro modo. isWhitespace() Devuelve true si el argumento es un blanco (espacio, tabulador, nueva l´ınea, retorno y avance de hoja), false de otro modo. toLowerCase() Regresa el argumento convertido a min´ usculas, si ya est´a no hay cambio. toUpperCase() Regresa el argumento convertido a may´ usculas, si ya est´a no hay cambio. Cuadro 1: M´etodos m´as com´ unmente usados de la clase Character. Nota. La clase Character est´a definida en java.lang, as´ı que es importada por default para cualquier programa. Esta clase se extiende desde java.lang.Object.
La aplicaci´on ProbarCaracter, c´odigo 2, usa varios de los m´etodos mostrados en el cuadro 1. La aplicaci´on pide al usuario que ingrese un caracter. Un String es aceptado y el m´etodo charAt() se usa para obtener el primer car´acter del String ingresado. La aplicaci´on determina las caracter´ısticas del car´acter y las muestra.
3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
import j a v a . u t i l . Scanner ; public c l a s s P r o b a r C a r a c t e r { public s t a t i c void main ( S t r i n g [ ] a r g s ) { char unChar ; String unString ; Scanner t e c l a d o = new Scanner ( System . i n ) ; System . out . p r i n t ( ” I n g r e s a r un c a r ´a c t e r : ” ) ; unString = teclado . nextLine ( ) ; unChar = u n S t r i n g . charAt ( 0 ) ; System . out . p r i n t l n ( ” El c a r ´a c t e r e s ” + unChar ) ; i f ( C h a r a c t e r . isUpperCase ( unChar ) ) System . out . p r i n t l n ( unChar + ” e s t a en may´ usculas ” ); else System . out . p r i n t l n ( unChar + ” no e s t a en may´ usculas ” ); i f ( C h a r a c t e r . isLowerCase ( unChar ) ) System . out . p r i n t l n ( unChar + ” e s t a en min´ usculas ” ); else System . out . p r i n t l n ( unChar + ” no e s t a en min´ usculas ” ); unChar = C h a r a c t e r . toLowerCase ( unChar ) ; System . out . p r i n t l n ( ”Despu´e s de toLowerCase ( ) , unChar e s ” + unChar ) ; unChar = C h a r a c t e r . toUpperCase ( unChar ) ; System . out . p r i n t l n ( ”Despu´e s de toUpperCase ( ) , unChar e s ” + unChar ) ; i f ( C h a r a c t e r . i s L e t t e r O r D i g i t ( unChar ) ) System . out . p r i n t l n ( unChar + ” e s una l e t r a o d´ı g i t o ” ) ; else System . out . p r i n t l n ( unChar + ” n i e s una l e t r a n i un d´ı g i t o ” ) ; i f ( C h a r a c t e r . i s W h i t e s p a c e ( unChar ) ) System . out . p r i n t l n ( unChar + ” e s un b l a n c o ” ) ; else System . out . p r i n t l n ( unChar + ” no e s un b l a n c o ” ) ; } }
C´odigo 2: Aplicaci´on ProbarCaracter.
3.
Clase String
Una secuencia de caracteres encerrada entre comillas dobles es una cadena literal. Se han visto ejemplos donde se han asignado cadenas literales a objetos String y tambi´en se han usado dentro de m´etodos, como con println() y showMessageDialog(). Una cadena literal es un objeto sin nombre, u objeto an´ onimo, de la clase String, y una variable String es un objeto nombrado de la misma clase. La clase String est´a definida en java.lang.String, la cual es autom´aticamente importada en cada programa que se escriba. Nota. Se ha declarado un arreglo String llamado args en cada cabecera del m´etodo
4
main().
Cuando se declara un objeto String, el String por s´ı mismo, la secuencia de caracteres contenidos en el String, es diferente del identificador usado para referirse a este. Se puede crear un objeto String al igual como se crea cualquier otro tipo de objeto, usando new y el constructor String, el siguiente ejemplo lo muestra: String unSaludo = new String("Hola"); La variable unSaludo guarda una referencia a un objeto String, tiene la direcci´on donde el objeto String est´a guardado en memoria. Como los objetos String son declarados rutinariamente en programas, Java proporciona una forma abreviada, donde se omite new y no se llama expl´ıcitamente al constructor de la clase, como se muestra a continuaci´on: String unSaludo = "Hola";
3.1.
Comparar valores String
String es una clase, y cada String creado es un objeto. Una variable nombrada String es una referencia, es decir, una variable nombrada String se refiere a una localidad en memoria, en vez de un valor particular. Cuando se declara una variable de un tipo b´asico, primitivo, como int x = 10;, la direcci´on de memoria donde x est´a localizada guarda el valor 10. Si despu´es se le asigna un nuevo valor a x, el nuevo valor reemplaza el viejo en la direcci´on de memoria asignada. Por ejemplo, si se codifica x = 45;, entonces 45 reemplaza el 10 en la direcci´on de x. Por otra parte, cuando se declara un String, tal como String unSaludo = "Hola";, unSaludo no tiene los caracteres “Hola”, en vez de esto tiene la direcci´on de memoria donde los caracteres est´an guardados. No se puede escoger la direcci´on de memoria donde el valor es guardado. Las direcciones son manejadas por el sistema operativo. Cuando se refiere a unSaludo, se est´a accediendo la direcci´on de los caracteres que se quieren usar. Si despu´es se asigna un nuevo valor a unSaludo, tal como unSaludo = Buenos d´ ıas;, la direcci´on de unSaludo es modificada, ya que ahora tendr´a una nueva direcci´on donde los car´acteres “Buenos d´ıas” est´an guardados. En este caso “Buenos d´ıas” es un nuevo objeto creado con su propia localidad. Posiblemente la cadena “Hola” est´e todav´ıa en memoria, pero unSaludo ya no guarda m´as su direcci´on. En alg´ un momento el sistema Java llamar´a al recolector de basura para desechar el objeto String con los caracteres “Hola”. Por lo tanto, los String nunca son actualizados; en vez de esto, nuevas String son creadas y las referencia String guardan las nuevas direcciones. Los String y otros objetos que no pueden ser modificados son inmutables. 5
Nota. Algunas razones por los cuales los creadores de Java hicieron los String inmutables son: el compilador se ejecuta m´as eficientemente y en ambientes donde programas m´ ultiples (o partes de programas, llamados hilos de ejecuci´on) se ejecutan concurrentemente, un camino l´ ogico no puede cambiar un String siendo usado por otro camino.
Como las referencias String guardan direcciones de memoria, hacer comparaciones simple entre estas produce resultados err´oneos. Cuando se comparan String con el operador == o con !=, se hace una comparaci´on de sus direcciones de memoria, no de sus valores. Si se intentan con los otros cuatro operadores, como ” ) ; otroNombre = t e c l a d o . n e x t L i n e ( ) ; i f ( unNombre . e q u a l s ( otroNombre ) ) System . out . p r i n t l n ( unNombre + ” i g u a l a ” + otroNombre ) ; else System . out . p r i n t l n ( unNombre + ” d i f e r e n t e a ” + otroNombre ) ; } }
C´odigo 3: Aplicaci´on CompararCadenas.
Nota. El m´etodo equals() no realiza una comparaci´on alfab´etica de String; este realiza
6
una comparaci´ on lexicogr´ afica, que es una comparaci´on car´acter a car´acter para la misma posici´on en ambas String y usando los valores enteros Unicode de los caracteres.
Cada String en el c´odigo 3, unNombre y otroNombre, es un objeto de tipo String, as´ı cada String tiene acceso al m´etodo equals de la clase String. Revisando como el m´etodo equals() es usado en el c´odigo 3 se puede se˜ nalar lo siguiente: Como el m´etodo equals() se usa con un objeto String y el m´etodo emplea el contenido u ´nico de ese objeto para hacer comparaciones, se puede decir que no es un m´etodo est´atico. Como la llamada al m´etodo equals() es usada en una sentencia if, se puede decir que este regresa un valor booleana. Como se tiene un String entre los par´entesis de la llamada al m´etodo, se puede decir que este m´etodo toma un argumento String. De esta forma la cabecera del m´etodo equals() dentro de la clase String deber´a ser similar a lo siguiente: public boolean equals(String s) La u ´nica cosa que no se sabe acerca de la cabecera del m´etodo es el nombre local para el argumento String. Al emplear un m´etodo previamente escrito, como equals(), no se necesita saber como est´a implementado. No s´e sabe si el m´etodo equals compara los caracteres en el String de izquierda a derecha o al rev´es. Todo lo que se sabe es que el m´etodo regresa true si los dos String son equivalentes completamente y false de otro modo. Observar que tanto unNombre y otroNombre, en el c´odigo 3, son String, por lo que el m´etodo equals() puede ser llamado usando cualquiera de estas referencias y pasando la otra referencia. El m´etodo equals() puede tomar ya sea una variable objeto String o una cadena literal como su argumento. El m´ etodo equalsIgnoreCase() de la clase String es parecido al m´etodo equals(). Este m´etodo no es sensible a la capitalizaci´on, ignora uso de may´ usculas y min´ usculas, para determinar si dos String son equivalentes. As´ı "Carmen".equals("carmen") da false, pero "Carmen".equalsIgnoreCase("carmen") da true. Este m´etodo es u ´til cuando los usuarios teclean sus respuestas a preguntas de los programas. El m´ etodo compareTo() de la clase String se usa para comparar dos String, proporcionando informaci´on adicional en forma de un valor entero. El m´etodo compareTo() devuelve cero s´olo si las dos String refieren al mismo valor. Si hay una diferencia entre las String, bas´andose en los valores Unicode de los car´acteres, un n´ umero negativo es devuelto si el objeto que llama es “menor que” el argumento, y un n´ umero positivo si el objeto que llama 7
es “mayor que” el argumento. Por ejemplo, "Rogelio".compareTo("Roberto"); devuelve un 5. Como este n´ umero es positivo entonces “Rogelio” es mayor que “Roberto”. La comparaci´on se realiza como sigue: La R en “Rogelio” y la R en “Roberto” se comparan, y son iguales. La o en “Rogelio” y la o en “Roberto” se comparan, y son iguales. La g en “Rogelio” y la b en “Roberto” son comparadas, y son diferentes. El valor num´erico de g menos el valor num´erico de b es 5, g est´a cinco letras despu´es de b en el alfabeto, as´ı el m´etodo compareTo() devuelve el valor 5. El valor devuelto por compareTo() no es usado directamente, basta con saber si es positivo o negativo el valor. Por ejemplo, para determinar si unaPalabra es alfab´eticamente menor que otraPalabra, se puede emplear un c´odigo como: if (unaPalabra.compareTo(otraPalabra) < 0)
3.2.
String vac´ıo y null
String palabra1 = ""; String palabra2 = null ; String palabra3; En las sentencias previas se crea un String vac´ıo llamado palabra1, y dos String llamadas palabra2 y palabra3. El String palabra1 vac´ıo se refiere a una direcci´on de memoria donde no hay caracteres guardados. El String palabra2 null usa la palabra reservada null para indicar que no tiene una direcci´on de memoria. En el String palabra3 sin asignaci´on es tambi´en un String null por defecto. Una diferencia significativa entre estas declaraciones es que palabra1 puede usar los m´etodos de instancia String, mientras palabra2 y palabra3 no pueden.
4.
Otros m´ etodos de la clase String
Hay una variedad de m´etodos adicionales disponibles en la clase String. Los m´etodos toUpperCase() y toLowerCase() convierten cualquier String a su representaci´on en may´ usculas y min´ usculas respectivamente. Por ejemplo, la sentencia "algo".toUpperCase() devuelve el String “ALGO”. El m´ etodo length() es un m´etodo accesor que devuelve el tama˜ no de un String. Por ejemplo, las siguientes sentencias ponen en la variable tam el valor de cuatro. 8
String saludo = "Hola"; int tam = saludo.length(); Cuando se debe determinar si una String es vac´ıa, es m´as eficiente comparar su tama˜ no a cero que usar el m´etodo equals(). El m´ etodo indexOf() indica si un car´acter espec´ıfico ocurre dentro de un String. Si est´a, el m´etodo regresa la posici´on del primer car´acter, la primera posici´on en un String es cero, de otro modo devuelve -1. Por ejemplo, el valor devuelto por "Java".indexOf(’J’) es cero, por "Java".indexOf(’a’) es uno, y por "Java".indexOf(’e’) es -1. El m´ etodo charAt() requiere un argumento entero que indique la posici´on del car´acter que el m´etodo regresa de una cadena, iniciando con cero. Por ejemplo, el valor de "Java".charAt(0) es “J” y el valor de "Java".charAt(3) es “a”. Un error ocurre si se usa un argumento negativo, o mayor que o igual al tama˜ no de la cadena usada. Para examinar cada car´acter en un ciclo se usa un argumento variable, en vez de una constante, en un ciclo. Por ejemplo, para contar la cantidad de espacios en la String miSentencia, se podr´ıa escribir un ciclo como el siguiente: for (int x = 0; x < miSentencia.length(); ++x) if (miSentencia.charAt(x) == ’ ’) ++contadorDeEspacios; Los m´ etodos endsWith() y startsWith() toman un argumento String y devuelven true o false si un objeto String termina o inicia con el argumento dado respectivamente. Estos m´etodos son sensibles a la capitalizaci´on de las letras. Por ejemplo, "Concurso".endsWith("urso") es true y "Concurso".startsWith("conc") es false. El m´ etodo replace() permite reemplazar todas las ocurrencias de alg´ un car´acter dentro de un String. Por ejemplo, "Plataforma".replace(’a’,’A’) devuelve la cadena “PlAtAformA” y "Plataforma".replace(’A’,’a’) devuelve la misma cadena ya que ‘A’ no se encuentra en “Plataforma”. El m´etodo replace() es sensible a la capitalizaci´on. Un m´etodo que no es parte de la clase String, es el m´etodo toString() cuando se desea obtener un String de un objeto. Por ejemplo, se puede emplear para cuando se quiere convertir un tipo de dato primitivo a un String. Como se hace en el siguiente c´odigo: String cadena; int unInt = 4; cadena = Integer.toString(unInt); Para el caso de un tipo primitivo double se deber´a hacer como en el siguiente ejemplo: String cadena; 9
double unDouble = 4.5; cadena = Double.toString(unDouble); Otra formar para convertir cualquier tipo primitivo a un String es usando concatenaci´ on, es decir, uniendo una variable simple a un String con el operador +. Por ejemplo, en el siguiente c´odigo a la variable String unaCadena se le asigna “Mi edad es 25”: int miEdad = 25; String unaCadena =
"Mi edad es " + miEdad;
De igual forma el siguiente c´odigo asigna a otraCadena la cadena “12.34”. float unFloat = 12.34f; String otraCadena = "" + unFloat; Nota. El m´etodo toString() est´a incluido en Java, mediante la clase ra´ız java.lang.Object, as´ı este puede ser usado con cualquier tipo de objeto. Cuando se emplean los m´etodos print() y println(), sus argumentos son autom´aticamente convertidos a String si es necesario.
Para extraer una parte de un String se emplea el m´ etodo substring() y se usa s´olo o se concatena con otra cadena. El m´etodo substring() requiere dos argumentos enteros, una posici´on inicial y una final, considerando que la primera posici´on es la cero. El tama˜ no de la cadena extra´ıda es la diferencia entre el segundo argumento y el primero, si se llama al m´etodo sin el segundo argumento, la subcadena se extiende hasta el final de la cadena original. La aplicaci´on CartaNegocios, c´odigo 4, pide al usuario por el primer nombre y los apellidos. La aplicaci´on extrae estas partes para hacer una carta amistosa de negocios. Despu´es de que la aplicaci´on pide la informaci´on, un variable de control de ciclo es inicializada a cero. Mientras la variable sea menor que el tama˜ no de lo ingresado, cada car´acter es comparado con el espacio. Cuando un espacio es encontrado, dos nuevas cadenas son creadas. nombre es la subcadena de la entrada dada desde la posici´on cero hasta antes del primer espacio encontrado. apellidos es la subcadena de la entrada desde la posici´on despu´es del espacio hasta el final de esta. Una vez que estas cadenas han sido creadas, la variable de control del ciclo es puesta al tama˜ no de la cadena original para forzar la salida del ciclo y proceder a mostrar la carta.
10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
import j a v a x . swing . ∗ ; public c l a s s C a r t a N e g o c i o s { public s t a t i c void main ( S t r i n g [ ] a r g s ) { S t r i n g nombre ; S t r i n g primerNombre = ” ” ; S t r i n g a p e l l i d o s = ”” ; int x ; nombre = JOptionPane . sh ow Inp ut Di al og ( null , ” I n g r e s a r su p r i m e r nombre y s u s a p e l l i d o s ” ) ; x = 0; while ( x < nombre . l e n g t h ( ) ) { i f ( nombre . charAt ( x ) == ’ ’ ) { primerNombre = nombre . s u b s t r i n g ( 0 , x ) ; a p e l l i d o s = nombre . s u b s t r i n g ( x + 1 , nombre . l e n g t h ( ) ) ; x = nombre . l e n g t h ( ) ; } ++x ; } JOptionPane . showMessageDialog ( null , ” Estimado ” + primerNombre + ” , \ n e s t o y o r g u l l o s o de que Ud . s e a uno de l o s ” + ” \ n p r i m e r o s a f o r t u n a d o s para s e r b e n e f i c i a d o ” + ” \ npor n u e s t r a empresa , en l a compra de un” + ”\ nseguro u ´ n i c o para l a p r o t e c c i ´on completa ” + ” \ nde l a f a m i l i a ” + a p e l l i d o s +” . Por f a v o r l l a m e ” + ” \ nhoy para mayor i n f o r m a c i ´on d e l s e g u r o ” + ” \ n f a m i l i a r a l 01−800−123−4567.” ) ; } }
C´odigo 4: Aplicaci´on CartaNegocios. El m´ etodo regionMatches() puede ser usado para probar si dos regiones String son lo mismo. Una versi´on de este m´etodo usa cuatro argumentos, la posici´on en la cual inicia la cadena que llama, la otra cadena a ser comparada, la posici´on inicial en la otra cadena, y la cantidad de caracteres a comparar. Por ejemplo, suponer el siguiente c´odigo: String primeraCadena = "abcde"; String segundaCadena = "xxbcdef"; La expresi´on primeraCadena.regionMatches(1, segundaCadena, 2, 4) es true, mientras que la expresi´on primeraCadena.regionMatches(0, segundaCadena, 3, 2) es false. Una segunda versi´on del m´etodo regionMatches() toma un argumento boolean adicional como el primer argumento, para indicar con true que la capitalizaci´on se debe ignorar, y con false se debe considerar. 11
5.
Conversi´ on de objetos String a n´ umeros
Una cadena que contenga n´ umeros se puede convertir a un n´ umero para despu´es ser usado en alguna expresi´on aritm´etica, o en una comparaci´on. Por ejemplo, sucede cuando se pide al usuario que ingrese un salario usando un cuadro de di´alogo de entrada. Nota. Al usar alguno de los m´etodos de esta secci´on para convertir un String a un n´ umero, si el String no representa un n´ umero v´alido, por ejemplo, si contiene letras, o el String representa el tipo incorrecto de n´ umero, por ejemplo, si contiene un punto decimal pero se est´a intentando convertir a un error, entonces un error llamado NumberFormatException ocurre.
Para convertir un String a un entero, se usa la clase Integer, la cual es parte de java.lang y por lo tanto es importada autom´aticamente en todos los programas que se escriban. La clase Integer es un ejemplo de una envoltura. Una envoltura es una clase u objeto que es una “envoltura alrededor” de un elemento simple; la clase envoltura Integer contiene un entero simple y m´etodos u ´tiles para manipularlo. Ya se ha usado el m´ etodo parseInt(), que es parte de la clase Integer; este toma un argumento String y regresa su valor entero. Por ejemplo, la siguiente sentencia asigna el valor num´erico 678 en la variable unInt: int unInt = Integer.parseInt("678"); De la sentencia anterior se puede decir que el m´etodo parseInt() es un m´etodo static, o de clase, porque fue usado con el nombre de la clase y no con un objeto. Tambi´en se puede usar el m´etodo valueOf() de la clase Integer para convertir un String a un objeto de la clase Integer, y luego usar el m´etodo intValue() de la clase Integer para extraer el entero simple. La aplicaci´on ConvertirCadenaAEntero, c´odigo 5, muestra como se hace la conversi´on descrita.
12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
import j a v a x . swing . JOptionPane ; public c l a s s ConvertirCadenaAEntero { public s t a t i c void main ( S t r i n g [ ] a r g s ) { S t r i n g cadenaDias ; int d i a s ; Integer enteroDias ; f i n a l double SAL MIN = 5 6 . 7 0 ; cadenaDias = JOptionPane . s how In pu tD ia lo g ( null , ”¿Cu´ a n t o s d´ıa s t r a b a j ´o e s t a semana ? ” ) ; e n t e r o D i a s = I n t e g e r . v a l u e O f ( cadenaDias ) ; dias = enteroDias . intValue ( ) ; JOptionPane . showMessageDialog ( null , ” Usted t r a b a j ´o ” + d i a s + ” d´ıa s a $ ” + SAL MIN + ” por d´ıa ” + ” \ nEsto e s $ ” + ( d i a s ∗ SAL MIN ) ) ; } }
C´odigo 5: Aplicaci´on ConvertirCadenaAEntero. Tambi´en es f´acil convertir un objeto String a un valor double. Se deber´a usar la clase Double, que al igual que la clase Integer, es una clase envoltura del paquete java.lang. El m´ etodo parseDouble() de la clase Double toma un argumento String y devuelve su valor double. Por ejemplo, la siguiente sentencia declara y asigna el valor num´erico 1234.56 en la variable valorDouble. double valorDouble = Double.parseDouble("1234.56"); Otra forma de realizar la conversi´on anterior es con el siguiente c´odigo: String valorString = new String("1234.56"); Double valorTemporal = Double.valueOf(valorString); double valor = valorTemporal.doubleValue(); Nota. Los m´etodos parseInt() y parseDouble() son m´as recientes que los m´etodos valueOf(), y por lo tanto muchos programadores los prefieren. Nota. Adem´as de las clases Double e Integer, est´an disponibles las clases envoltura Float y Long que tambi´en proporcionan el m´etodo valueOf(), as´ı como los m´etodos parseFloat() y parseLong(), respectivamente.
6.
Clases StringBuilder y StringBuffer
El valor de un String es fijo despu´es de haber sido creado; String son inmutables, o inalterable. Cuando se pone unaCadena = "Hola"; seguida de unaCadena = "Adi´ os";, no se 13
ha cambiado el contenido de la memoria de la computadora en la direcci´on representada por unaCadena ni eliminado los caracteres “Hola”. En vez de lo anterior, se ha guardado “Hola” en una localidad de memoria nueva y se ha guardado la nueva direcci´on en la variable unaCadena. Si se hacen muchas operaciones con String se termina creando muchos objetos String diferentes en memoria, lo cual consume tiempo y recursos. Para evitar estas limitaciones, se puede usar la clase StringBuilder o StringBuffer. Se usa alguna de estas clase cuando se sabe que un String ser´a modificado; los objetos StringBuilder o StringBuffer se usan en cualquier lugar donde se use un String. Estas dos clases, al igual que la clase String, son parte del paquete java.lang y por lo tanto son autom´aticamente importados en todos los programas. Las clases son id´enticas excepto por lo siguiente: StringBuilder es m´as eficiente. StringBuffer es hilo seguro. Se deber´a usar en aplicaciones que ejecuten m´ ultiples hilos de ejecuci´ on, los cuales son unidades de procesamiento que est´an calendarizadas por un sistema operativo y que pueden ser usado para crear caminos m´ ultipes de control durante la ejecuci´on del programa. La mayor´ıa de los programas usados contiene un s´olo hilo, as´ı que se deber´ıa usar StringBuilder. Se comenta en esta secci´on la clase StringBuilder, pero cada sentencia es tambi´en v´alida para StringBuffer. Para crear un objeto StringBuilder que contenga un String se puede hacer de la siguiente forma: StringBuilder mensaje = new StringBuilder("Saludos cordiales"); Se puede emplear una cadena literal para crear un objeto StringBuilder como en el c´odigo anterior, o usar alg´ un m´etodo que devuelva una cadena o una expresi´on que la forme. En el siguiente ejemplo se obtiene la entrada del usuario usando un objeto Scanner llamado teclado que usa el m´etodo nextLine() y lo guarda en la variable llamada nombre tipo StringBuilder: StringBuilder nombre = new StringBuilder(teclado.nextLine()); Para crear un objeto del tipo StringBuilder se debe usar la palabra reservada new, el nombre del constructor, y un valor de inicializaci´on entre los par´entesis del constructor. Para crear una variable StringBuilder vac´ıa se hace de la siguiente forma: StringBuilder nombre = null ; 14
La variable nombre no se refiere a nada hasta que se inicializada con un objeto StringBuilder. Cuando se crea un objeto String se reserva la memoria suficiente para la cantidad de caracteres Unicode de esta. En un objeto StringBuilder este usa un bloque de memoria llamado b´ ufer, el cual podr´ıa o no contener una cadena. Si puede contener a la cadena, la cadena podr´ıa no ocupar completamente el b´ ufer. Es decir, el tama˜ no de una cadena puede ser diferente del tama˜ no del b´ ufer. El tama˜ no actual del b´ ufer es la capacidad de un objeto StringBuilder. Se puede cambiar el tama˜ no de una cadena en un objeto StringBuilder con el m´ etodo setLength(). El tama˜ no de un objeto StringBuilder es igual a la cantidad de caracteres en la cadena contenida en el StringBuilder. Cuando se incrementa el tama˜ no de un objeto StringBuilder para ser mayor que la cadena que contiene, los caracteres extra contiene ’\u0000’. Si se emplea el m´etodo setLength() para dar una longitud m´as corta que su cadena, la cadena es truncada. Se usa el m´ etodo capacity() para saber la capacidad de un objeto StringBuilder. En la aplicaci´on DemoStringBuilder, c´odigo 6, se usa el m´etodo capacity(). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
public c l a s s DemoStringBuilder { public s t a t i c void main ( S t r i n g [ ] a r g s ) { S t r i n g B u i l d e r nombre = new S t r i n g B u i l d e r ( ” F r a n c i s c o ” ) ; int c a p a c i d a d = nombre . c a p a c i t y ( ) ; System . out . p r i n t l n ( ”La c a p a c i d a d de nombre e s ” + c a p a c i d a d ) ; S t r i n g B u i l d e r d o m i c i l i o = null ; d o m i c i l i o = new S t r i n g B u i l d e r ( ”AV. JOSE FRANCISCO MUGICA s /n” ) ; int d o m i c i l i o C a p a c i d a d = d o m i c i l i o . c a p a c i t y ( ) ; System . out . p r i n t l n ( ” Capacidad de d o m i c i l i o e s ” + d o m i c i l i o C a p a c i d a d ) ; nombre . s e t L e n g t h ( 2 0 ) ; System . out . p r i n t l n ( ” El nombre e s ” + nombre + ”