Вы находитесь на странице: 1из 16

Caracteres

H. Tejeda

Marzo 2016

Indice

1. Aplicaciones con cadenas de caracteres 1

2. Manipulacion de caracteres 2

3. Clase String 4

4. Otros metodos de la clase String 8

5. Conversion de objetos String a numeros 11

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 aplicacion, dada en el codigo 1, el metodo main() declara un String llamada unNombre
y le asigna Fernando a este. Al usuario se le pide que meta un nombre. Luego la aplicacion
compara los dos nombres usando el operador de equivalencia (==) y muestra uno de los dos mensajes
indicando si las cadenas son equivalentes.

1
1 import j a v a . u t i l . Scanner ;
2 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 {
3 public s t a t i c void main ( S t r i n g [ ] a r g s ) {
4 S t r i n g unNombre = Fernando ;
5 S t r i n g otroNombre ;
6 Scanner t e c l a d o = new Scanner ( System . i n ) ;
7 System . out . p r i n t ( I n g r e s a un nombre > ) ;
8 otroNombre = t e c l a d o . n e x t L i n e ( ) ;
9 i f ( unNombre == otroNombre )
10 System . out . p r i n t l n ( unNombre + i g u a l a + otroNombre ) ;
11 else
12 System . out . p r i n t l n ( unNombre + d i f e r e n t e a + otroNombre ) ;
13 }
14 }

Codigo 1: La aplicacion IntentarCompararStrings.

Cuando se ejecuta la aplicacion y el usuario ingresa Fernando como el valor para otroNombre,
la aplicacion 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 simpleses una referencia, as la variable guarda una direccion 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 metodos para manipular caracteres y cadenas facilmente, estas clases son:

Character. Una clase cuyas instancias pueden guardar un solo valor caracter y con metodos
que manipulan e inspeccionan el caracter.
String. Una clase para trabajar con cadenas de caracteres fijos.
StringBuilder y StringBuffer. Estas clases guardan y manipulan datos variables compues-
tos de caracteres multiples.

2. Manipulacion de caracteres

El tipo de dato char es usado para guardar un solo caracter cualquiera, por ejemplo, una letra, un
dgito, un signo de puntuacion. Ademas de este tipo primitivo, Java tiene la clase Character, la
cual tiene metodos estandarizados para probar valores de caracteres. El cuadro 1 describe algunos
de los metodos de Character, aquellos metodos que inician con is son metodos que pueden ser
usados en sentencias de comparacion, ya que dan un valor booleano, y los metodos que inician con
to regresan un caracter que ha sido convertido al formato senalado.

Nota. La clase Character esta definida en java.lang, as que es importada por default para
cualquier programa. Esta clase se extiende desde java.lang.Object.

La aplicacion ProbarCaracter, codigo 2, usa varios de los metodos mostrados en el cuadro 1. La


aplicacion pide al usuario que ingrese un caracter. Un String es aceptado y el metodo charAt() se

2
Metodo Descripcion
isDigit() Devuelve true si el argumento es un dgito, 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 dgito, false de otro
modo.
isLowerCase() Devuelve true si el argumento es letra minuscula, false de otro
modo.
isUpperCase() Devuelve true si el argumento es letra mayuscula, false de otro
modo.
isWhitespace() Devuelve true si el argumento es un blanco (espacio, tabulador, nueva
lnea,
retorno y avance de hoja), false de otro modo.
toLowerCase() Regresa el argumento convertido a minusculas, si ya esta no hay cam-
bio.
toUpperCase() Regresa el argumento convertido a mayusculas, si ya esta no hay
cambio.

Cuadro 1: Metodos mas comunmente usados de la clase Character.

usa para obtener el primer caracter del String ingresado. La aplicacion determina las caractersticas
del caracter y las muestra.

3
1 import j a v a . u t i l . Scanner ;
2 public c l a s s P r o b a r C a r a c t e r {
3 public s t a t i c void main ( S t r i n g [ ] a r g s ) {
4 char unChar ;
5 String unString ;
6 Scanner t e c l a d o = new Scanner ( System . i n ) ;
7 System . out . p r i n t ( I n g r e s a r un c a r a c t e r : ) ;
8 unString = teclado . nextLine ( ) ;
9 unChar = u n S t r i n g . charAt ( 0 ) ;
10 System . out . p r i n t l n ( El c a r a c t e r e s + unChar ) ;
11 i f ( C h a r a c t e r . isUpperCase ( unChar ) )
12 System . out . p r i n t l n ( unChar + e s t a en mayu s c u l a s ) ;
13 else
14 System . out . p r i n t l n ( unChar + no e s t a en mayu s c u l a s ) ;
15 i f ( C h a r a c t e r . isLowerCase ( unChar ) )
16 System . out . p r i n t l n ( unChar + e s t a en minu s c u l a s ) ;
17 else
18 System . out . p r i n t l n ( unChar + no e s t a en minu s c u l a s ) ;
19 unChar = C h a r a c t e r . toLowerCase ( unChar ) ;
20 System . out . p r i n t l n ( Despue s de toLowerCase ( ) , unChar e s + unChar ) ;
21 unChar = C h a r a c t e r . toUpperCase ( unChar ) ;
22 System . out . p r i n t l n ( Despue s de toUpperCase ( ) , unChar e s + unChar ) ;
23 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 ) )
24 System . out . p r i n t l n ( unChar + e s una l e t r a o d g i t o ) ;
25 else
26 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 ) ;
27 i f ( C h a r a c t e r . i s W h i t e s p a c e ( unChar ) )
28 System . out . p r i n t l n ( unChar + e s un b l a n c o ) ;
29 else
30 System . out . p r i n t l n ( unChar + no e s un b l a n c o ) ;
31 }
32 }

Codigo 2: Aplicacion ProbarCaracter.

Actividad 1. Ejecutar la aplicacion ProbarCaracter con diferentes entradas para observar la


salida de la aplicacion.

Actividad 2. Escribir una aplicacion que use un showInputDialog() para preguntar al usuario si
desea ver un saludo. Cada vez que el usuario responda usando alguna variante de si (como S, Si,
SI, sI), mostrar la cantidad de saludos (saludo 1, saludo 2, etc.) y volver a preguntar si desea ver
un saludo nuevamente.

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 tambien se han usado dentro
de metodos, como con println() y showMessageDialog(). Una cadena literal es un objeto sin
nombre, o objeto anonimo, de la clase String, y una variable String es un objeto nombrado de
la misma clase. La clase String esta definida en java.lang.String, la cual es automaticamente

4
importada en cada programa que se escriba.

Nota. Se ha declarado un arreglo String llamado args en cada cabecera del metodo 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 direccion donde el objeto
String esta 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 explcitamente
al constructor de la clase, como se muestra a continuacion:

String unSaludo = "Hola";

Comparar valores String

String es una clase, y cada String creado es un objeto. Una variable nombrada String es una
referencia, es dedir, 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 basico, primitivo, como int x = 10;, la direccion de
memoria donde x esta localizada guarda el valor 10. Si despues se le asigna un nuevo valor a x, el
nuevo valor reemplaza el viejo en la direccion de memoria asignada. Por ejemplo, si se codifica x =
45;, entonces 45 reemplaza el 10 en la direccion 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 direccion de memoria donde los caracteres
estan guardados.

No se puede escoger la direccion de memoria donde el valor es guardado. Las direcciones son
manejadas por el sistema operativo.

Cuando se refiere a unSaludo, se esta accediendo la direccion de los caracteres que se quieren
usar. Si despues se asigna un nuevo valor a unSaludo, tal como unSaludo = Buenos das;, la
direccion de unSaludo es modificada, ya que ahora tendra una nueva direccion donde los caracteres
Buenos das estan guardados. En este caso Buenos das es un nuevo objeto creado con su propia
localidad. Posiblemente la cadena Hola este todava en memoria, pero unSaludo ya no guarda
mas su direccion. En algun momento el sistema Java llamara 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 inmutabless.

5
Nota. Algunas razones por los cuales los creadores de Java hicieron los String inmutables son: el
compilador se ejecuta mas eficientemente y en ambientes donde programas multiples (o partes de
programas, llamados hilos de ejecucion) se ejecutan concurrentemente, un camino logico 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 erroneos. Cuando se comparan String con el operador == o con !=, se
hace una comparacion de sus direcciones de memoria, no de sus valores. Si se intentan con los otros
cuatro operadores, como <, el programa no compilara.

Si se declaran objetos String y se inicializan ambos al mismo valo, el valor es guardado una sola
vez en memoria y las dos referencias objeto guardan la misma direccion de memoria, de esta forma
se ahorra memoria. La salida, Las cadenas son las mismas, del siguiente codigo es erronea, ya que
no son iguales por su contenido, sino porque primeraCadena y segundaCadena guardan la misma
direccion de memoria.

String primeraCadena = "abc";


String segundaCadena = "abc";
if (primeraCadena == segundaCadena)
System.out.println("Las cadenas son las mismas");

La clase String proporciona un conjunto de metodos que comparan String en la forma esperada.
El metodo equals() de clase la String evalua el contenido de dos objetos String para determinar
si son equivalentes. El metodo regresa true si los objetos tienen contenido identico, no importando
como los contenidos fueron asignados. La aplicacion CompararCadenas, codigo 3 usa el metodo
equals().

1 import j a v a . u t i l . Scanner ;
2 public c l a s s CompararCadenas {
3 public s t a t i c void main ( S t r i n g [ ] a r g s ) {
4 S t r i n g unNombre = Fernando ;
5 S t r i n g otroNombre ;
6 Scanner t e c l a d o = new Scanner ( System . i n ) ;
7 System . out . p r i n t ( I n g r e s a tu nombre > ) ;
8 otroNombre = t e c l a d o . n e x t L i n e ( ) ;
9 i f ( unNombre . e q u a l s ( otroNombre ) )
10 System . out . p r i n t l n ( unNombre + i g u a l a + otroNombre ) ;
11 else
12 System . out . p r i n t l n ( unNombre + d i f e r e n t e a + otroNombre ) ;
13 }
14 }

Codigo 3: Aplicacion CompararCadenas.

Nota. El metodo equals() no realiza una comparacion alfabetica de String; este realiza una
comparacion lexicografica, que es una comparacion caracter a caracter para la misma posicion en
ambas String y usando los valores enteros Unicode de los caracteres.

6
Cada String en el codigo 3, unNombre y otroNombre, es un objeto de tipo String, as cada String
tiene acceso al metodo equals de la clase String. Revisando como el metodo equals() es usado
en el codigo 3 se puede senalar lo siguiente:

Como el metodo equals() se usa con un objeto String y el metodo emplea el contenido
unico de ese objeto para hacer comparaciones, se puede decir que no es un metodo estatico.

Como la llamada al metodo equals() es usada en una sentencia if, se puede decir que este
regresa un valor booleana.

Como se se tiene un String entre los parentesis de la llamada al metodo, se puede decir que
este metodo toma un argumento String.

De esta forma la cabecera del metodo equals() dentro de la clase String debera ser similar a lo
siguiente:

public boolean equals(String s)

La unica cosa que no se sabe acerca de la cabecera del metodo es el nombre loca para el argumento
String. Al emplear un metodo previamente escrito, como equals(), no se necesita saber como
esta implementado. No se sabe si el metodo equals compara los caracteres en el String de izquierda
a derecha o al reves. Todo lo que se sabe es que el metodo regresa true si los dos String son
equivalentes completamente y false de otro modo.

Observar que tanto unNombre y otroNombre, en el codigo 3, son String, por lo que el metodo
equals() puede ser llamado usando cualquiera de estas referencias y pasando la otra referencia.
El metodo equals() puede tomar ya sea una variable objeto String o una cadena literal como su
argumento.

Actividad 3. Ejecutar la aplicacion CompararCadenas ingresando Fernando en una ocasion y en


otra Miguel. Comparar esta salida con la que se obtiene al ejecutar la aplicacion IntentarCompa-
rarCadenas.

El metodo equalsIgnoreCase() de la clase String es parecido al metodo equals(). Este metodo


no es sensible a la capitalizacion, ignora uso de mayusculas y minusculas, para determinar si dos
String son equivalentes. As "Carmen".equals("carmen") da false, pero "Carmen".equalsIgno-
reCase("carmen") da true. Este metodo es util cuando los usuarios teclean sus respuestas a
preguntas de los programas.

El metodo compareTo() de la clase String se usa para comparar dos String, proporcionando
informacion adicional en forma de un valor entero. El metodo compareTo() devuelve cero solo si
las dos String refieren al mismo valor. Si hay una diferencia entre las String, basandose en los
valores Unicode de los caracteres, un numero negativo es devuelto si el objeto que llama es menor
que el argumento, y un numero positivo si el el objeto que llama es mayor que el argumento.
Por ejemplo, "Rogelio".compareTo("Roberto"); devuelve un 5. Como este numero es positivo
entonces Rogelio es mayor que Roberto. La comparacion se realiza como sigue:

La R en Rogelio y la R en Roberto son comparadas, y son iguales.

7
La o en Rogelio y la o en Roberto son comparadas, y son iguales.

La g en Rogelio y la b en Roberto son comparadas, y son diferentes. El valor numerico


de g menos el valor numerico de b es 5, g esta cinco letras despues de b en el alfabeto, as el
metodo compareTo() devuelve el valor 5.

El valor devuelto por compareTo() no es usado directamente, basta con saber si es positivo o negati-
vo el valor. Por ejemplo, para determinar si unaPalabra es alfabeticamente menor que otraPalabra,
se puede emplear un codigo como if(unaPalabra.compareTo(otraPalabra) <0)

String vaco y null

String palabra1 = "";


String palabra2 = null ;
String palabra3;

En las sentencias previas se crea un String vaco llamado palabra1, y dos String llamadas
palabra2 y palabra3. El String palabra1 vaco se refiere a una direccion de memoria donde
no hay caracteres guardados. El String palabra2 null usa la palabra reservada null para indi-
car que no tiene una direccion de memoria. En el String palabra3 sin asignacion es tambien un
String null por defecto. Una diferencia significativa entre estas declaraciones es que palabra1
puede usar los metodos de instancia String, mientras palabra2 y palabra3 no pueden.

4. Otros metodos de la clase String

Hay una variedad de metodos adicionales disponibles en la clase String. Los metodos toUpperCase()
y toLowerCase() convierten cualquier String a su representacion en mayusculas y minusculas res-
pectivamente. Por ejemplo, la sentencia "algo".toUpperCase() devuelve el String ALGO.

El metodo length() es un metodo accesor que devuelve el tamano de un String. Por ejemplo,
las siguientes sentencias ponen en la variable tam el valor de cuatro.

String saludo = "Hola";


int tam = saludo.length();

Cuando se debe determinar si una String es vaca, es mas eficiente comparar su tamano a cero
que usar el metodo equals().

El metodo indexOf() indica si un caracter especfico ocurre dentro de un String. Si esta, el


metodo regresa la posicion del primer caracter, la primera posicion 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 metodo charAt() requiere un argumento entero que indique la posicion del caracter que el
metodo regresa de una cadena, iniciando con cero. Por ejemplo, el valor de "Java".charAt(0) es

8
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 tamano de la cadena usada. Para examinar cada caracter 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 podra escribir un ciclo como el siguiente:

for (int x = 0; x < miSentencia.length(); ++x)


if (miSentencia.charAt(x) == )
++contadorDeEspacios;

Los metodos 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 metodos son
sensibles a la capitalizacion de las letras. Por ejemplo, "Concurso".endsWith("urso") es true y
"Concurso".startsWith("conc") es false.

El metodo replace() permite reemplazar todas las ocurrencias de algun caracter 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 Ano se encuentra en Pla-
taforma. El metodo replace() es sensible a la capitalizacion.

Un metodo que no es parte de la clase String, es el metodo 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 codigo:

String cadena;
int unInt = 4;
cadena = Integer.toString(unInt);

Para el caso de un tipo primitivo double se debera hacer como en el siguiente ejemplo:

String cadena;
double unDouble = 4.5;
cadena = Double.toString(unDouble);

Otra formar para convertir cualquier tipo primitivo a un String es usando Concatenacion, es
decir, uniendo una variable simple a un String con el operador +. Por ejemplo, en el siguiente
codigo 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 codigo asigna a otraCadena la cadena 12.34.

float unFloat = 12.34f;


String otraCadena = "" + unFloat;

9
Nota. El metodo String() esta incluido en Java, mediante la clase raz java.lang.Object, as este
puede ser usado con cualquier tipo de objeto. Cuando se emplean los metodos print() y println(),
sus argumentos son automaticamente convertidos a String si es necesario.

Para extraer una parte de un String se emplea el metodo substring() y se usa solo o se concatena
con otra cadena. El metodo substring() requiere dos argumentos enteros, una posicion inicial y
una final, considerando que la primera posicion es la cero. El tamano de la cadena extrada es la
diferencia entre el segundo argumento y el primero, si se llama al metodo sin el segundo argumento,
la subcadena se extiende hasta el final de la cadena original.

En la aplicacion del codigo 4 se pide al usuario por el primer nombre y los apellidos. La aplicacion
extrae estas partes para hacer una carta amistosa de negocios. Despues de que la aplicacion pide la
informacion, un variable de control de ciclo es inicializada a cero. Mientras la variable sea menor
que el tamano de lo ingresado, cada caracter 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
posicion cero hasta antes del primer espacio encontrado. apellidos es la subcadena de la entrada
desde la posicion despues del espacio hasta el final de esta. Una vez que estas cadenas han sido
creadas, la variable de control del ciclo es puesta al tamano de la cadena original para forzar la
salida del ciclo y proceder a mostrar la carta.

1 import j a v a x . swing . ;
2 public c l a s s C a r t a N e g o c i o s {
3 public s t a t i c void main ( S t r i n g [ ] a r g s ) {
4 S t r i n g nombre ;
5 S t r i n g primerNombre = ;
6 S t r i n g a p e l l i d o s = ;
7 int x ;
8 char c ;
9 nombre = JOptionPane . sh ow Inp ut Di al og ( null ,
10 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 ) ;
11 x = 0;
12 while ( x < nombre . l e n g t h ( ) ) {
13 i f ( nombre . charAt ( x ) == ) {
14 primerNombre = nombre . s u b s t r i n g ( 0 , x ) ;
15 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 ( ) ) ;
16 x = nombre . l e n g t h ( ) ;
17 }
18 ++x ;
19 }
20 JOptionPane . showMessageDialog ( null ,
21 Estimado + primerNombre +
22 , \ 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 +
23 \ 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 +
24 \ npor n u e s t r a empresa , en l a compra de un +
25 \ n s e g u r o u n i c o para l a p r o t e c c i on completa +
26 \ 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 +
27 \ nhoy para mayor i n f o r m a c i on d e l s e g u r o +
28 \ n f a m i l i a r a l 018001234567. ) ;
29 }
30 }

Codigo 4: Aplicacion CartaNegocios.

10
El metodo regionMatches() puede ser usado para probar si dos regiones String son lo mismo.
Una version de este metodo usa cuatro argumentos, la posicion en la cual inicia la cadena que llama,
la otra cadena a ser comparada, la posicion inicial en la otra cadena, y la cantidad de caracteres a
comparar. Por ejemplo, suponer el siguiente codigo:

String primeraCadena = "abcde";


String segundaCadena = "xxbcdef";

La expresion primeraCadena.regionMatches(1, segundaCadena, 2, 4) es true, mientras que


la expresion primeraCadena.regionMatches(0, segundaCadena, 3, 2) es false.

Una segunda version del metodo regionMatches() toma un argumento boolean adicional como
el primer argumento, para indicar con true que la capitalizacion se debe ignorar, y con false se
debe considerar.

Actividad 4. Escribir una aplicacion que pida al usuario sus nombres y apellidos. La aplicacion
arreglara la cadena para que la primera letra de cada nueva palabra sea mayuscula y el resto
minusculas. Por ejemplo, si el usuario ingreso juan tORRes ruiZ debera mostrar Juan Torres
Ruiz.

5. Conversion de objetos String a numeros

Una cadena que contenga numeros se puede convertir a un numero para despues ser usado en
alguna expresion aritmetica, o en una comparacion. Por ejemplo, sucede cuando se pide al usuario
que ingrese un salario usando un cuadro de dialogo de entrada.

Nota. Al usar alguno de los metodos de esta seccion para convertir un String a un numero, si
el String no representa un numero valido, por ejemplo, si contiene letras, o el String representa
el tipo incorrecto de numero, por ejemplo, si contiene un punto decimal pero se esta 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 automaticamente 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 metodos utiles para
manipularlo. Ya se ha usado el metodo 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
numerico 678 en la variable unInt:

int unInt = Integer.parseInt("678");

De la sentencia anterior se puede decir que el metodo parseInt() es un metodo static, o de clase,
porque fue usado con el nombre de la clase y no con un objeto.

11
Tambien se puede usar el metodo valueOf() de la clase Integer para convertir un String a
un objeto de la clase Integer, y luego usar el metodo intValue() de la clase Integer para
extraer el entero simple. La aplicacion ConvertirCadenaAEntero, codigo 5, muestra como se hace
la conversion descrita.
1 import j a v a x . swing . JOptionPane ;
2 public c l a s s ConvertirCadenaAEntero {
3 public s t a t i c void main ( S t r i n g [ ] a r g s ) {
4 S t r i n g cadenaDias ;
5 int d i a s ;
6 Integer enteroDias ;
7 f i n a l double SAL MIN = 5 6 . 7 0 ;
8 cadenaDias = JOptionPane . s ho wI npu tD ia lo g ( null ,
9 Cua n t o s d a s t r a b a j o e s t a semana ? ) ;
10 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 ) ;
11 dias = enteroDias . intValue ( ) ;
12 JOptionPane . showMessageDialog ( null , Usted t r a b a j o +
13 d i a s + d a s a $ + SAL MIN + por da +
14 \ nEsto e s $ + ( d i a s SAL MIN ) ) ;
15 }
16 }

Codigo 5: Aplicacion ConvertirCadenaAEntero.

Tambien es facil convertir un objeto String a un valor double. Se debera usar la clase Double,
que al igual que la clase Integer, es una clase envoltura del paquete java.lang. El meto-
do parseDouble() de la clase Double toma un argumento String y devuelve su valor double.
Por ejemplo, la siguiente sentencia declara y asigna el valor numerico 1234.56 en la variable
valorDouble.

double valorDouble = Double.parseDouble("1234.56");

Otra forma de realizar la conversion anterior es con el siguiente codigo:

String valorString = new String("1234.56");


Double valorTemporal = Double.valueOf(valorString);
double valor = valorTemporal.doubleValue();

Nota. Los metodos parseInt() y parseDouble() son mas recientes que los metodos valueOf(),
y por lo tanto muchos programadores los prefieren.

Nota. Ademas de las clases Double e Integer, estan disponibles las clases envoltura Float y
Long que tambien proporcionan el metodo valueOf(), as como los metodos parseFloat() y
parseLong(), respectivamente.

Actividad 5. Escribir una aplicacion que pida al usuario un numero, lea los caracteres desde
el teclado, guarde los caracteres en un String, y entonces convertir la String a un entero para
multiplicarlo por diez y mostrar el resultado

12
6. Clases StringBuilder y StringBuffer

El valor de un String es fijo despues de haber sido creado; String son inmutables, o inalterable.
Cuando se pone unaCadena = "Hola"; seguida de unaCadena = "Adios";, no se ha cambiado
el contenido de la memoria de la computadora en la direccion 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 direccion 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 sera 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 automaticamente importados en
todos los programas. Las clases son identicas excepto por lo siguiente:

StringBuilder es mas eficiente.

StringBuffer es hilo seguro. Se debera usar en aplicaciones que ejecuten multiples hilos de
ejecucion, los cuales son unidades de procesamiento que estan calendarizadas por un sistema
operativo y que pueden ser usado para crear caminos multipes de control durante la ejecucion
del programa. La mayora de los programas usados contiene un solo hilo, as que se debera
usar StringBuilder.

Se comenta en esta seccion la clase StringBuilder, pero cada sentencia es tambien valida 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 codigo anterior,
o usar algun metodo que devuelva una cadena o una expresion que la forme. En el siguiente ejemplo
se obtiene la entrada del usuario usando un objeto Scanner llamado teclado que usa el metodo
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 inicializacion entre los parentesis del constructor. Para crear una variable
StringBuilder vaca se hace de la siguiente forma:

StringBuilder nombre = null ;

13
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 bufer, el
cual podra o no contener una cadena. Si puede contener a la cadena, la cadena podra no ocupar
completamente el bufer. Es decir, el tamano de una cadena puede ser diferente del tamano del
bufer. El tamano actual del bufer es la capacidad de un objeto StringBuilder.

Se puede cambiar el tamano de una cadena en un objeto StringBuilder con el metodo setLength().
El tamano de un objeto StringBuilder es igual a la cantidad de caracteres en la cadena conteni-
da en el StringBuilder. Cuando se incrementa el tamano de un objeto StringBuilder para ser
mayor que la cadena que contiene, los caracteres extra contiene 0000. Si se emplea el metodo
setLength() para dar una longitud mas corta que su cadena, la cadena es truncada.

Se usa el metodo capacity() para saber la capacidad de un objeto StringBuilder. En la apli-


cacion DemoStringBuilder, codigo 6, se usa el metodo capacity().

1 public c l a s s DemoStringBuilder {
2 public s t a t i c void main ( S t r i n g [ ] a r g s ) {
3 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 ) ;
4 int c a p a c i d a d = nombre . c a p a c i t y ( ) ;
5 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 ) ;
6 S t r i n g B u i l d e r d o m i c i l i o = null ;
7 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 ) ;
8 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 ( ) ;
9 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 ) ;
10 nombre . s e t L e n g t h ( 2 0 ) ;
11 System . out . p r i n t l n ( El nombre e s + nombre + <<< ) ;
12 d o m i c i l i o . setLength ( 2 0 ) ;
13 System . out . p r i n t l n ( El d o m i c i l i o e s + d o m i c i l i o ) ;
14 }
15 }

Codigo 6: Aplicacion DemoStringBuilder.

Al ejecutar la aplicacion dira que la capacidad de nombre es 25, que son 16 caracteres mas que
el tamano de la cadena Francisco. Las 16 posiciones extra reservadas permiten modificaciones
razonables del objeto StringBuilder despues de la creacion sin reservar ninguna localidad de
memoria nueva.

Nota. Los creadores de Java escogieron 16 caracteres adicionales para un objeto StringBuilder ya
que ocupan 4 bytes de memoria.

Observar que la aplicacion tambien muestra domicilio de forma truncada por haber reducido su
capacidad a 20 mediante el metodo setLength() en la lnea 10, del codigo 6.

Para comparar los contenidos de dos objetos StringBuilder, suponiendo que estos se llaman obj1
y obj2, estos deberan convertirse primeramente a String y luego comparar los String como se
muestra enseguida:

obj1.toString().equals(obj2.toString())

14
La clase StringBuilder tiene cuatro constructores que se describen enseguida:

public StringBuilder() construye un objeto sin caracteres y tamano por defecto 16.

public StringBuilder(int capacidad) contruye un objeto sin caracteres y una capacidad


indicada por el parametro.

public StringBuilder(String s) el objeto creado tiene los mismos caracteres que el objeto
String s. La capacidad es el tamano del argumento del String dado, mas 16 caracteres
adicionales.

El cuarto constructor StringBuilder usa un argumento de tipo CharSequence. CharSequence


es una interfaz, tipo particular de clase, que guarda una secuencia de valores char.

El metodo append() permite agregar caracteres al final de un objeto StringBuilder. En las


siguientes dos sentencias, la primera declara frase para tener Feliz y luego se modifica para
tener Feliz aniversario:

StringBuilder frase = new StringBuilder("Feliz");


frase.append(" aniversario");

Con el metodo insert se agregan caracteres en la posicion indicada dentro de un objeto String-
Builder. Si frase tiene Feliz aniversario, con la sentencia frase.insert(6, "50 "); se modifica
el objeto para que contenga Feliz 50 aniversario. Al igual que en un String, la primera posicion
de un objeto StringBuilder es cero.

Para reemplazar un caracter en un objeto StringBuilder se usa el metodo setCharAt(). Este


metodo ocupa dos argumentos: una posicion entera y un caracter. Si frase tiene Feliz 50 aniver-
sario, entonces frase.setCharAt(6, 4); sustituye el 5 por un 4.

Para obtener un caracter de un objeto StringBuilder se usa el metodo charAt(). Este metodo
acepta un argumento que es la posicion del caracter desde el inicio de la cadena y devuelve el
caracter en esa posicion. Las siguientes sentencias asignan el caracter J a la variable letra:

StringBuilder texto = new StringBuilder("Programacion Java");


char letra = text.charAt(13);

En el caso de que se use un ndice o posicion que sea mayor que cero o mayor que el ndice de la
ultima posicion, se genera una excepcion y el programa termina.

Cuando se puede aproximar el tamano requerido por un objeto StringBuilder, si se asigna capaci-
dad suficiente se puede mejorar el rendimiento del programa. En la aplicacion CompararTiemposCon-
catenacion, codigo 7, se compara el tiempo requerido para agregar Java 20,000 veces a dos
objetos StringBuilder, uno tiene el tamano por defecto inicial de 16 caracteres y el otro tiene un
tamano inicial de 80,000 caracteres. El tiempo extra que consume uno de los StringBuilder es
por asignar repetidamente nueva memoria conforme el objeto crece en tamano.

15
1 public c l a s s CompararTiemposConcatenacion {
2 public s t a t i c void main ( S t r i n g [ ] a r g s ) {
3 long i n i c i o T i e m p o , finTiempo ;
4 f i n a l int VECES = 2 0 0 0 0 ;
5 int x ;
6 S t r i n g B u i l d e r cadena1 = new S t r i n g B u i l d e r ( ) ;
7 S t r i n g B u i l d e r cadena2 = new S t r i n g B u i l d e r (VECES 4 ) ;
8 i n i c i o T i e m p o = System . c u r r e n t T i m e M i l l i s ( ) ;
9 f o r ( x=0; x<VECES; ++x )
10 cadena1 . append ( Java ) ;
11 finTiempo = System . c u r r e n t T i m e M i l l i s ( ) ;
12 System . out . p r i n t l n ( Tiempo de S t r i n g B u i l d e r con c a p a c i d a d 1 6 : +
13 ( finTiempo i n i c i o T i e m p o ) + m i l i s e g u n d o s ) ;
14 i n i c i o T i e m p o = System . c u r r e n t T i m e M i l l i s ( ) ;
15 f o r ( x=0; x<VECES; ++x )
16 cadena2 . append ( Java ) ;
17 finTiempo = System . c u r r e n t T i m e M i l l i s ( ) ;
18 System . out . p r i n t l n ( Tiempo de S t r i n g B u i l d e r con c a p a c i d a d adecuada : +
19 ( finTiempo i n i c i o T i e m p o ) + m i l i s e g u n d o s ) ;
20 }
21 }

Codigo 7: Aplicacion CompararTiemposConcatenacion.

Actividad 6. Escribir una aplicacion que haga un objeto StringBuilder a partir de un String que
contenga tu nombre. Despues hacer la siguiente secuencia para modificar el objeto StringBuilder:
a) agregar al final el lugar donde naciste; b) agregar al inicio la cadena Es un y; c) antes del
nombre insertar la cadena estudiante responsable. Cada vez que se haga una modificacion al
objeto StringBuilder, llamar a un metodo de clase con el objeto StringBuilder para que muestre
en la salida el objeto StringBuilder.

16

Вам также может понравиться