Las variables, constantes y enumeraciones en Java

Las variables

Las variables nos van a permitir almacenar en memoria diferentes valores útiles para el funcionamiento de nuestra aplicación durante su ejecución. Se debe declarar obligatoriamente una variable antes de utilizarla en el código. Al declarar una variable debemos fijar sus características. Según la ubicación de su declaración una variable pertenecerá a una de las categorías siguientes:

  • Declarada en el interior de una clase, la variable es una variable de instancia. Sólo existirá si una instancia de la clase está disponible. Cada instancia de clase tendrá su propio ejemplar de la variable.
  • Declarada con la palabra clave static en el interior de una clase, la variable es una variable de clase. Se puede acceder a ella directamente por el nombre de la clase y existe en un único ejemplar.
  • Declarada en el interior de una función, la variable es una variable local. Sólo existe durante la ejecución de la función y sólo se puede acceder a ella desde el código de ésta.
  • Los parámetros de las funciones se pueden considerar como variables locales. La única diferencia reside en la inicialización de la variable efectuada durante la llamada de la función.

a. Nombre de las variables

Veamos las reglas que se deben respetar para nombrar a las variables.

  • El nombre de una variable empieza obligatoriamente por una letra.
  • Puede tener letras, cifras o el carácter de subrayado (_).
  • Puede disponer de un número cualquiera de caracteres (por razones prácticas, es mejor limitarse a un tamaño razonable).
  • Se hace una distinción entre minúsculas y mayúsculas (la variable EDADDELCAPITAN es diferente a la variable edaddelcapitan).
  • Las palabras clave del lenguaje no deben ser utilizadas como nombre de variable.
  • Por convenio, los nombres de variable se ortografían con letras minúsculas salvo la primera letra de cada palabra si el nombre de la variable comporta varias palabras (edadDelCapitan).

banner-java-basico-3

b. Tipo de variables

Al determinar un tipo para una variable, indicamos cuál es la información que vamos a poder almacenar en esta variable y las operaciones que podremos efectuar con ella.

Java dispone de dos categorías de tipos de variables:

  • Los tipos por valor: la variable contiene realmente la información.
  • Los tipos por referencia: la variable contiene la dirección de memoria donde se encuentra la información.

El lenguaje Java dispone de siete tipos primitivos que se pueden clasificar en tres categorías.

Los tipos numéricos enteros

Tipos numericos enteros

 

Cuando elija un tipo para sus variables enteras, tendrá que tener en cuenta los valores mínimo y máximo que piensa almacenar en ella con el fin de optimizar la memoria de la que hacen uso. De hecho, es inútil utilizar un tipo largo para una variable cuyo valor no superará 50: en este caso basta con un tipo byte. El ahorro de memoria parece insignificante para una variable única pero se vuelve notable durante en el momento de utilizar tablas de gran dimensión.

Los tipos decimales

Tipos decimales

Todos los tipos numéricos están firmados y por lo tanto pueden contener valores positivos o negativos.

El tipo carácter

El tipo char se utiliza para almacenar un carácter único. Una variable de tipo char utiliza dos bytes para almacenar el código Unicode del carácter. En el juego de caracteres Unicode los primeros 128 caracteres son idénticos al juego de carácter ASCII, los caracteres siguientes, hasta 255, corresponden a los caracteres especiales del alfabeto latino (por ejemplo los caracteres acentuados), el resto se utiliza para los símbolos o los caracteres de otros alfabetos. Los caracteres específicos o los que tienen un significado particular para el lenguaje Java se representan por una secuencia de escape. Se compone del carácter \ seguido por otro carácter que indica el significado de la secuencia de escape. La tabla siguiente presenta la lista de secuencias de escape y sus significados.

secuencias-de-escape

Los caracteres Unicode no accesibles por teclado se representan también mediante una secuencia de escape compuesta por los caracteres \u seguidos por el valor hexadecimal del código Unicode del carácter. El símbolo del euro es, por ejemplo, la secuencia \u20AC.

Para poder almacenar cadenas de caracteres hay que utilizar el tipo String que representa una serie de cero a n caracteres. Este tipo no es un tipo primitivo sino una clase. Sin embargo para facilitar su utilización, se puede utilizar como un tipo primitivo del lenguaje. Las cadenas de caracteres son invariables, porque durante la asignación de un valor a una variable de tipo cadena de caracteres se reserva algo de espacio en memoria para el almacenamiento de la cadena. Si más adelante esta variable recibe un nuevo valor, se le atribuye una nueva ubicación en memoria. Afortunadamente, este mecanismo es transparente para nosotros y la variable seguirá haciendo referencia automáticamente al valor que se le asignó. Con este mecanismo, las cadenas de caracteres pueden tener un tamaño variable. Se ajusta automáticamente el espacio ocupado en memoria según la longitud de la cadena de caracteres. Para atribuir una cadena de caracteres a una variable es necesario introducir el contenido de la cadena entre » y » como en el ejemplo siguiente.

Ejemplo

Capitan = "Garfio";

 

Hay numerosas funciones de la clase String que permiten la manipulación de las cadenas de caracteres y se detallarán más adelante en este capítulo.

El tipo booleano

El tipo booleano permite tener una variable que puede presentar dos estados verdad/falso, si/no, on/off.

La asignación se hace directamente con los valores true o false como en el ejemplo siguiente:

boolean disponible,modificable; 
disponible=true; 
modificable=false;

 

Es imposible asignar otro valor a una variable de tipo booleano.

c. Valores por defecto

La inicialización de las variables no siempre es obligatoria. Es el caso, por ejemplo, de las variables de instancia que se inicializan con los valores por defecto siguientes.
Valores por defecto

En cambio, las variables locales se deben inicializar antes de utilizarlas. El compilador efectúa de hecho una comprobación cuando encuentra una variable local y activa un error si la variable no ha sido inicializada.

d. Valores literales

Los valores numéricos enteros se pueden utilizar con su representación decimal, octal, hexadecimal o binario. Las cuatro líneas siguientes de código surten el mismo efecto.

i=243; 
i=0363; 
i=0xF3; 
i=0b11110011;

 

Los valores numéricos reales se pueden expresar con la notación decimal o la notación científica.

superficie=2356.8f; 
superficie=2.3568e3f;

 

Puede insertar caracteres _ en los valores numéricos literales para facilitar su lectura. Las dos sintaxis siguientes son equivalentes.

precio=1_234_876_567;
precio=1234876567;

 

Los valores literales están también caracterizados. Los valores numéricos enteros se consideran por defecto como tipos int. En cuanto a los valores numéricos reales se consideran como tiposdouble. Esta asimilación puede ser a veces fuente de errores de compilación al utilizar el tipo float. Las líneas siguientes generan un error de compilación porque el compilador considera que intentamos asignar a una variable de tipo float un valor de tipo double y piensa que hay riesgo de perder información.

float superficie; 
superficie=2356.8;

 

Para resolver este problema, tenemos que forzar el compilador a considerar el valor literal real como un tipo float añadiéndole seguir por el carácter f o F.

float superficie; 
superficie=2356.8f;

e. Conversiones de tipos

Las conversiones de tipos consisten en transformar una variable de un tipo en otro. Las conversiones se pueden hacer hacia un tipo superior o hacia un tipo inferior. Si se utiliza una conversión en un tipo inferior, existe riesgo de perder información. Por ejemplo la conversión de un tipo double en un tipo long, provocará la pérdida de la parte decimal del valor. Por eso el compilador exige en este caso que le indiquemos de manera explícita que deseamos realizar esta operación. Para esto, debe prefijar el elemento que desea convertir con el tipo que quiere obtener ubicándolo entre paréntesis.

float superficie; 
superficie=2356.8f; 
int aproximacion; 
aproximacion=(int)superficie;

En este caso, se pierde la parte decimal, pero a veces éste puede ser el objetivo de este tipo de conversión.

Las conversiones hacia un tipo superior no implican riesgo de perder información y por lo ello se realizan directamente mediante una simple asignación.

La siguiente tabla resume las conversiones posibles y si deben ser explícitas (Explicitas) o implícitas (Implicitas).

Conversiones

Las conversiones desde y hacia cadenas de caracteres son más específicas.

Conversión hacia una cadena de caracteres

Las funciones de conversión hacia el tipo cadena de caracteres son accesibles mediante la clase String. El método de clase valueOf asegura la conversión de un valor de un tipo primitivo hacia una cadena de caracteres.

 Conversion a Char

En determinadas situaciones, la utilización de estas funciones es opcional porque la conversión se efectúa de manera implícita. Es el caso, por ejemplo, de una variable de un tipo primitivo que está concatenada con una cadena de caracteres. Las dos versiones de código siguientes tienen el mismo efecto.Versión 1

double precioBruto; 
precioBruto=152; 
String recap; 
recap="el importe del pedido es: " + precioBruto*1.16;

Versión 2

double precioBruto; 
precioBruto=152; 
String recap; 
recap="el importe del pedido es: " +String.valueOf(precioBruto*1.16);

 

Conversión desde una cadena de caracteres

Ocurre a menudo que un valor numérico se presenta en una aplicación bajo la forma de una cadena de caracteres (introducción del usuario, lectura de un fichero…).

Para que la aplicación lo pueda manipular, se le debe convertir a un tipo numérico. Este tipo de conversión es accesible mediante clases equivalentes a los tipos primitivos. Permiten la manipulación de valores numéricos bajo el formato de objetos. Cada tipo básico tiene su clase asociada.

Tipo básico y su clase

Estas clases proporcionan un método parse… aceptando como parámetro una cadena de caracteres y permitiendo obtener de ella la conversión en el tipo primitivo asociado a la clase.

Tipo primitivo y su metodo

Para recordar como proceder a efectuar una conversión, se trata de aplicar un principio muy sencillo: el método que se debe utilizar se encuentra en la clase correspondiente al tipo de datos que se desea obtener.

banner-java-basico-4

f. Declaración de las variables

La declaración de una variable está constituida por el tipo de la variable seguido por el nombre de la variable. Por lo tanto la sintaxis básica es la siguiente:

int contador; 
double precio; 
String nombre;

 

También se pueden especificar modificadores de acceso y un valor inicial durante la declaración.

private int contador=0; 
protected double precio=123.56; 
public nombre=null;

 

La declaración de una variable puede aparecer en cualquier sitio del código. Sólo es necesario que la declaración preceda la utilización de la variable. Se aconseja agrupar las declaraciones de variables al principio de la definición de la clase o de la función con el fin de facilitar la relectura del código.

La declaración de varias variables del mismo tipo se puede agrupar en una sola línea, separando los nombres de las variables con una coma.

protected double precioBruto=123.56, precioNeto,GastosEnvio;

 

g. Alcance de las variables

El alcance de una variable es la región de código en la que se puede manipular dicha variable. Estará, pues, en función de la ubicación de la declaración.

Se puede hacer esta declaración en el bloque de código de una clase, en el bloque de código de una función o en un bloque de código en el interior de una función. Sólo el código del bloque donde se declara la variable puede utilizarlo. Si el mismo bloque de código se ejecuta varias veces durante la ejecución de la función, caso de un bucle while por ejemplo, la variable se creará a cada paso en el bucle. En este caso, la inicialización de la variable es obligatoria. No se pueden tener dos variables con mismo nombre con el mismo alcance. Sin embargo, tenemos la posibilidad de declarar una variable interna a una función, o un parámetro de una función con el mismo nombre que una variable declarada a nivel de la clase. En este caso, la variable declarada al nivel de la clase queda oculta por la variable interna de la función.

h. Nivel de acceso de las variables

El nivel de acceso de una variable se combina con el alcance de la variable y determina qué porción de código tiene derecho de leer y escribir en la variable. Un conjunto de palabras clave permite controlar el nivel de acceso. Se utilizan en la declaración de la variable y deben ser ubicadas delante del tipo de la variable. Sólo pueden ser utilizadas para la declaración de una variable en el interior de una clase. Queda prohibido su utilización en el interior de una función.

private: la variable sólo se utiliza con el código de la clase donde está definida.

protected: la variable se utiliza en la clase donde está definida, en las subclases de esta clase y en las clases que forman parte del mismo paquete.

public: la variable es accesible desde cualquier clase sin importar el paquete.

ningún modificador: la variable es accesible desde todas las clases que forman parte del mismo paquete.

static: esta palabra clave se asocia a una de las palabras clave anteriores para transformar una declaración de variable de instancia en declaración de variable de clase (utilizable sin que exista una instancia de la clase).

i. Ciclo de vida de las variables

El ciclo de vida de una variable nos permite especificar durante cuánto tiempo el contenido de una variable estará disponible a lo largo de la ejecución de la aplicación.

Para una variable declarada en una función, la duración del ciclo de vida corresponde a la duración de la ejecución de la función. En cuanto termine la ejecución del procedimiento o función, la variable se elimina de la memoria. Volverá a ser creada con la próxima llamada a la función. Una variable declarada en el interior de una clase puede ser utilizada mientras esté disponible una instancia de la clase. Las variables declaradas con la palabra clave static están accesibles durante toda la duración del funcionamiento de la aplicación.

Las constantes

En una aplicación puede ocurrir a menudo que se utilice valores numéricos o cadenas de caracteres que no se modificarán durante la ejecución de la aplicación. Para facilitar la lectura del código, se aconseja crear esos valores bajo la forma de constantes.

La definición de una constante se hace añadiendo la palabra clave final delante de la declaración de una variable. Es obligatorio inicializar la constante en el momento de su declaración (es el único sitio donde se puede asignar valor a la constante).

final double TASAIVA=1.16;

Entonces se puede utilizar la constante en el código en lugar del valor literal que representa.

precioNeto=precioBruto*TASAIVA;

Las reglas relativas al ciclo de vida y al alcance de las constantes son idénticas a las relativas a las variables.

El valor de una constante también se puede calcular a partir de otra constante.

final double TOTAL=100; 
final double SEMI=TOTAL/2;

Hay muchas constantes que ya forman parte del lenguaje Java. Se definen como miembros static de las numerosas clases del lenguaje. Por convenio los nombres de las constantes se ortografían totalmente en mayúsculas.

Las enumeraciones

Una enumeración nos va a permitir agrupar un conjunto de constantes relacionadas entre ellas. La declaración se hace de la siguiente manera:

{ 
    DOMINGO, 
    LUNES, 
    MARTES, 
    MIÉRCOLES, 
    JUEVES, 
    VIERNES, 
    SÁBADO 
}

 

El primer valor de la enumeración se inicializa a cero. Luego las constantes siguientes se inicializan con un incremento de uno. Por lo tanto la declaración anterior se hubiera podido escribir:

{ 
    public static final int DOMINGO=0; 
    public static final int LUNES=1; 
    public static final int MARTES=2; 
    public static final int MIÉRCOLES=3; 
    public static final int JUEVES=4; 
    public static final int VIERNES=5; 
    public static final int SÁBADO=6; 
}

 

De manera aproximada, esto es lo que hará el compilador cuando analice el código de la enumeración.

Una vez definida, una enumeración se puede utilizar como un nuevo tipo de datos. Podemos declarar una variable con nuestra enumeración para el tipo.

Días referencia;

Por lo tanto se puede utilizar la variable asignándole uno de los valores definidos en la enumeración.

referencia=Días.LUNES;

Al hacer referencia a un elemento de su enumeración, tendrá que hacerle preceder por el nombre de la enumeración como en el ejemplo anterior. La asignación a la variable de distinto tipo al de los valores contenidos en la enumeración se prohíbe y provoca un error de compilación.

La declaración de una enumeración no se puede llevar a cabo dentro de un procedimiento o de una función. Por el contrario, se puede declarar en una clase pero habrá que prefijar el nombre de la enumeración con el nombre de la clase en la cual se determina su utilización. Para que la enumeración sea autónoma, sólo basta declararla en su propio fichero.

El alcance de una enumeración sigue las mismas reglas que las de las variables (utilización de las palabras clave public, private, protected).

Una variable de tipo enumeración se puede utilizar fácilmente en una estructura switch … case. En este caso, no es necesario que el nombre de la enumeración precede a los miembros de la enumeración.

{ 
          switch (d) 
          { 
          case LUNES: 
          case MARTES: 
          case MIÉRCOLES: 
          case JUEVES: 
               System.out.println("que duro es trabajar"); 
               break; 
          case VIERNES: 
               System.out.println("¡pronto el fin de semana!"); 
               break; 
          case SÁBADO: 
               System.out.println("¡por fin!"); 
               break; 
          case DOMINGO: 
               System.out.println("¡y vuelta a empezar!"); 
               break; 
          } 
     }

Los arrays

Los arrays nos van a permitir hacer referencia a un conjunto de variables del mismo tipo con el mismo nombre y utilizar un índice para diferenciarlas. Un array puede tener una o varias dimensiones. El primer elemento de un array siempre tiene como índice el cero. El número de celdas del array se especifica en el momento de su creación. Por lo tanto el índice más grande de un array es igual al número de celdas menos uno. Después de su creación, no está permitido modificar las características del array (número de celdas, tipo de elementos almacenados en la tabla). La manipulación de un array se debe componer en tres etapas:

  • Declaración de una variable que permite trabajar con el array.
  • Creación del array (asignación memoria).
  • Almacenamiento y manipulación de los elementos del array.


Declaración del array

La declaración del array se lleva a cabo de forma similar a la de una variable clásica. Únicamente se deben añadir los símbolos [ y ] (corchetes) después del tipo de datos o del nombre de la variable. Es preferible, para una mejor legibilidad del código, asociar los caracteres [ y ] al tipo de datos. La línea siguiente declara una variable de tipo array de enteros.

int[] cifraNegocio;

Creación de la array

Después de la declaración de la variable hay que crear el array obteniendo algo de memoria para almacenar esos elementos. En este momento, indicamos el tamaño del array. Al ser los arrays asimilados a objetos, se utilizará el operador new para crear una instancia del array. El valor proporcionado por el operador new se almacena en la variable declarada previamente.

cifraNegocio=new int[12];

Esta declaración creará un array con doce celdas numeradas de 0 a 11. El tamaño del array es definitivo, por lo tanto no es posible ampliar ni reducir un array ya creado.

Hay una alternativa a la creación de arrays. Consiste en definir de forma simultánea la declaración de la variable, la creación del array y la inicialización de su contenido. La sintaxis es la siguiente:

int[] cifraNegocio={1234,563,657,453,986,678,564,234,786,123,534,975};

En este caso, no hace falta precisar un tamaño para el array. El dimensionamiento se hará automáticamente según el número de valores puestos entre las llaves.

Utilización del array

Los elementos de los arrays son accesibles de la misma manera que una variable clásica. Sólo es necesario añadir el índice del elemento que se quiere manipular.

cifraNegocio[0]=12456;

El contenido de una celda de array puede ser utilizado exactamente de la misma manera que una variable del mismo tipo. Hay que tener cuidado al manipular un array y no intentar acceder a una celda que no exista so pena de obtener una excepción del tipo ArrayIndexOutOfBoundException.

Arrays de varias dimensiones

Los arrays de varias dimensiones son de hecho arrays que contienen otros arrays. La sintaxis de declaración es similar a la de un array excepto que se deben especificar tantos pares de corchetes como dimensiones se desea tener.

int[][] matriz;

Su creación también es similar a la de un array de una dimensión excepto que deseamos indicar un tamaño para cada una de las dimensiones.

matriz=new int[2][3];

El acceso a un elemento de la matriz se realiza de manera idéntica: indicando los índices que permiten identificar la celda de la matriz en cuestión.

matriz[0][0]=99;

La sintaxis que permite la inicialización de una matriz en el momento de su declaración es un poco más compleja.

 

int[][] matriz={{11,12,13},{21,22,23},{31,32,33}};

Este ejemplo crea una matriz con dos dimensiones de tres celdas por tres.

La creación de matrices de gran tamaño con esta técnica puede ser peligrosa.

Manipulaciones corrientes con arrays

Cuando se trabaja con arrays, hay ciertas operaciones que se realizan regularmente. Este párrafo describe las operaciones más corrientes realizadas con arrays. La mayoría de ellas están disponibles gracias a la clase java.util.Arrays que proporciona numerosos métodos static de manipulación de arrays.

Obtener el tamaño de un array: es suficiente utilizar la propiedad length del array para conocer el número de elementos que puede contener. En el caso de un array multidimensional, hay que recordar que se trata de hecho de arrays de arrays. La propiedad length indica por lo tanto, el número de elementos de la primera dimensión. Para obtener la misma información de las demás dimensiones, hay que utilizar la propiedad length de cada celda del array de nivel inferior.

matriz=new int[8][3]; 
System.out.println("el array contiene " + matriz.length + " celdas de " + matriz[0].length +  " celdas");

Buscar un elemento en un array: la función binarySearch permite efectuar una búsqueda en un array. Acepta como parámetros el array en el cual se hace la búsqueda y el elemento buscado. El valor devuelto corresponde al índice donde se encontró el elemento o un valor negativo si el elemento no ha sido encontrado. Para que esta función realice la búsqueda de forma óptima se debe ordenar el array previamente.

int[] cifraNegocio={1234,563,657,453,986,678,564,234,786,123,534,975}; 
Arrays.sort(cifraNegocio); 
System.out.println(Arrays.binarySearch(cifraNegocio, 123));

Ordenar un array: la función sort asegura el ordenamiento del array que recibe como parámetro. La ordenación sigue un orden alfabético para los arrays de cadena de caracteres y un orden ascendente para los de valores numéricos.

int[] cifraNegocio={1234,563,657,453,986,678,564,234,786,123,534,975}; 
Arrays.sort(cifraNegocio); 
for (int i=0;i<cifraNegocio.length;i++) 
{ 
      System.out.print(cifraNegocio[i] + "\t"); 
}

Muestra el resultado siguiente:

123 234 453 534 563 564 657 678 786 975 986 1234

Mostrar un array: la función toString permite obtener una representación con la forma de cadena de caracteres del array pasado como parámetro.

System.out.println(Arrays.toString(cifraNegocio));

Muestra el resultado siguiente:

[123, 234, 453, 534, 563, 564, 657, 678, 786, 975, 986, 1234]

La función deepToString efectúa la misma operación pero para una matriz.

int[][] matriz={{11,12,13},{21,22,23},{31,32,33}}; 
System.out.println(Arrays.deepToString(matriz));

Muestra el resultado siguiente:

[[11, 12, 13], [21, 22, 23], [31, 32, 33]]

Copiar un array: están disponibles dos funciones para la copia de arrays.

La función copyOf copia un array entero con la posibilidad de modificar su tamaño. La función copyOfRange efectúa una copia de una parte del array.

int[] copiaCifraNegocio; 
copiaCifraNegocio=Arrays.copyOf(cifraNegocio, 24); 
System.out.println(Arrays.toString(copiaCifraNegocio));

Muestra el resultado siguiente:

[1234, 563, 657, 453, 986, 678, 564, 234, 786, 123, 534, 975, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

int[] primerTrimestre; 
primerTrimestre=Arrays.copyOfRange(cifraNegocio, 0, 3); 
System.out.println(Arrays.toString(primerTrimestre));

Muestra el resultado siguiente:

[1234, 563, 657]

Rellenar un array: la función fill se utiliza para rellenar todas las celdas de un array con el mismo valor.

Las cadenas de caracteres

Las variables de tipo String le permiten a la aplicación la manipulación de cadenas de caracteres.

Vamos a ver cómo realizar las operaciones más corrientes en las cadenas de caracteres.

Creación de una cadena de caracteres

El método más sencillo para crear una cadena de caracteres consiste en considerar el tipo String como un tipo primitivo del lenguaje y no como un objeto. En este caso, la asignación de un valor a la variable va a provocar la creación de una instancia de la clase String. La creación de una cadena de caracteres como un objeto es también posible utilizando el operador new y alguno de los diversos constructores disponibles en la clase String. El ejemplo de código siguiente presenta las dos soluciones.

String cadena1="eni"; String cadena2=new String("eni");

Después de su creación, no se puede modificar una cadena de caracteres. La asignación de otro valor a la variable provoca la creación de una nueva instancia de la clase String. La clase Stringcontiene numerosos métodos que permiten la modificación de cadenas de caracteres. Al utilizarlo, tenemos la sensación de que la función modifica el contenido de la cadena inicial, pero en realidad, es una nueva instancia que contiene el resultado la que ha sido devuelta por la función.

Asignación de un valor a una cadena

Hemos visto que para asignar un valor a una cadena es necesario especificarla entre los caracteres » y «: se plantea un problema si queremos que el carácter » forme parte de la cadena. Para que no se interprete como carácter de principio o de fin de cadena, hay que protegerlo por una secuencia de escape como en el ejemplo siguiente:

String Cadena; Cadena=" Dijo: " ¡Basta ya! ""; 
System.out.println(Cadena);

Podemos visualizar: Dijo: «¡Basta ya! »

Para los ejemplos siguientes, vamos a trabajar con dos cadenas:

cadena1 = "el invierno será lluvioso"; 
cadena2 = "el invierno será frío";

Extracción de un carácter particular

Para obtener el carácter presente en una posición dada de una cadena de caracteres, se debe utilizar la función charAt proporcionando como argumento el índice del carácter que deseamos obtener. El primer carácter tiene el índice cero, como para un array. Esta función devuelve un carácter (char).

System.out.println("el tercer carácter de la cadena1 es " + cadena1.charAt(2));

Obtener la longitud de una cadena

Para determinar la longitud de una cadena se dispone de la función length de la clase String.

System.out.println("la cadena1 contiene " + cadena1.length() + " caracteres");

Subcadenas

La función substring de la clase String devuelve una porción de cadena en función de las posiciones de principio y de fin que se le proporcionan como parámetros. La cadena obtenida empieza por el carácter ubicado en la posición de salida (principio) y termina en el carácter que precede a la posición de fin.

System.out.println("un trozo de la cadena1: " + cadena1.substring(3,11));

Podemos ver lo siguiente:

un trozo de la cadena1: invierno

Comparación de cadenas

Cuando hacemos una comparación entre dos cadenas, tendemos a utilizar el doble igual (==), como se realizaba antes. Este operador funciona correctamente con los tipos primitivos pero no podemos olvidar que las cadenas de caracteres son de tipo objeto. Hay que utilizar los métodos de la clase String para efectuar comparaciones de cadenas de caracteres. El método equals efectuará una comparación de la cadena con la que fue pasada como parámetro. Devuelve un boolean igual a true si las dos cadenas son idénticas y por supuesto un boolean igual a false en caso contrario. Esta función distingue entre minúsculas y mayúsculas durante la comparación. La función equalsIgnoreCase efectúa un trato idéntico pero sin tener en cuenta esta distinción.

if (cadena1.equals(cadena2)) 
{ 
     System.out.println("las dos cadenas son idénticas"); 
} 
else 
{ 
     System.out.println("las dos cadenas son diferentes"); 
}

Por el contrario, para realizar una clasificación tenemos que utilizar el método compareTo de la clase String o la función compareToIgnoreCase. Con estas dos soluciones, hay que pasar como parámetros la cadena que se debe comparar. Se devuelve el resultado de la comparación bajo la forma de un entero inferior a cero si la cadena es inferior a la recibida como parámetro, igual a cero si las dos cadenas son idénticas, y superior a cero si la cadena es superior a la recibida como parámetro.

if (cadena1.compareTo(cadena2)>0) 
{ 
     System.out.println("cadena1 es superior a cadena2"); 
} 
else 
if (cadena1.compareTo(cadena2)<0) 
{ 
     System.out.println("cadena1 es inferior a cadena2"); 
} 
else 
{ 
     System.out.println("las dos cadenas son idénticas"); 
}

Las funciones startsWith y endsWith permiten probar si la cadena empieza con la cadena recibida como parámetro o si la cadena termina con la cadena recibida como parámetro. Se puede utilizar la función endsWith, por ejemplo, para probar la extensión de un nombre de fichero.

String nombre="Código.java"; 
 
if (nombre.endsWith(".java")) 
{ 
     System.out.println("c\’es un fichero fuente java"); 
}

Supresión de espacios

La función trim permite suprimir los espacios en blanco situados delante del primer carácter significativo y después del último carácter significativo de una cadena.

String cadena="          eni         "; 
System.out.println("longitud de la cadena: " + cadena.length()); 
System.out.println("longitud de la cadena limpiada: " + cadena.trim().length());

Cambiar las letras a mayúsculas o minúsculas

Todo a mayúsculas:

System.out.println(cadena1.toUpperCase());

Todo a minúsculas:

System.out.println(cadena1.toLowerCase());

Búsqueda en una cadena

El método indexOf de la clase String permite la búsqueda de una cadena en el interior de otra. El parámetro corresponde a la cadena buscada. La función devuelve un entero que indica la posición donde se encontró la cadena ó -1 si no se encontró. Por defecto la búsqueda empieza al principio de la cadena, salvo si utilizamos otra versión de la función indexOf que espera dos parámetros, el primer parámetro es, para esta versión, la cadena buscada, y el segundo, la posición inicial de la búsqueda.

String búsqueda; 
     int posición; 
     búsqueda = "e"; 
     posición = cadena1.indexOf(búsqueda); 
     while (posición > 0) 
     { 
         System.out.println("cadena encontrada en la posición " + posición); 
       posición = cadena1.indexOf(búsqueda, posición+1); 
     } 
     System.out.println("fin de la búsqueda");

Obtenemos la visualización siguiente:

cadena encontrada en la posición 0
cadena encontrada en la posición 7
cadena encontrada en la posición 13
fin de la búsqueda

Sustitución en una cadena

A veces puede ser preferible buscar la presencia de una cadena en el interior de otra, como en el ejemplo anterior, pero también sustituir las porciones de cadenas encontradas. La función replacepermite especificar una cadena de substitución para la cadena buscada. Espera dos parámetros:

  • la cadena buscada
  • la cadena sustituta.

String cadena3; 
cadena3= cadena1.replace("invierno", "verano"); 
System.out.println(cadena3);

Obtenemos lo siguiente:

el verano será lluvioso

 

Taller de Desarrollo con Javascript

Regístrate en nuestra plataforma en linea para tener acceso completo y gratuito del taller

Registrarme

Taller de desarrollo de Pokedex con Android Studio

Regístrate en nuestra plataforma en linea para tener acceso completo y gratuito del taller

Registrarme