Tutorial de Java

Clases Java

Anterior | Siguiente
La Clase Random

La clase Random es un generador de número pseudo-aleatorios. El algoritmo que se utiliza para la obtención de estos números, es el que Donald Knuth presenta en su libro The Art of Computer Programming. Son números no realmente aleatorios porque son secuencias distribuidas uniformemente, obtenidas a partir de una semilla inicial.

Cuando se inicializa un objeto Random con una semilla, se puede obtener a continuación lo que parece una secuencia aleatoria, pero si se vuelve a inicializar el objeto con la misma semilla se vuelve a obtener la misma secuencia. Normalmente se utiliza la hora actual del sistema como semilla para inicializar estos objetos, lo que disminuye la posibilidad de obtener secuencias de números repetidas.

De un objeto Random se pueden extraer varios tipos de números aleatorios a través de sus métodos.

Métodos de Random

nextInt() Extrae un int , distribuido uniformemente a lo largo del rango de los enteros
nextLong() Extrae un long , distribuido uniformemente a lo largo del rango de long
nextFloat() Extrae un float , distribuido uniformemente entre 0.0 y 1.0
nextDouble() Extrae un double , distribuido uniformemente entre 0.0 y 1.0
nextGaussian() Extrae un double de distribución gaussiana, o de tipo campana, centrada en 0.0 con una desviación típica de 1.0
nextBytes( bytes[] ) Extrae el número de bytes que se especifique

La Clase String

Java posee gran capacidad para el manejo de cadenas dentro de sus clases String y StringBuffer. Un objeto String representa una cadena alfanumérica de un valor constante que no puede ser cambiada después de haber sido creada. Un objeto StringBuffer representa una cadena cuyo tamaño puede variar, o puede ser modificada por programa.

Los Strings son objetos constantes y por lo tanto muy baratos para el sistema. La mayoría de las funciones relacionadas con cadenas esperan valores String como argumentos y devuelven valores String.

Hay que tener en cuenta que las funciones estáticas no consumen memoria del objeto, con lo cual es más conveniente usar Character que char . No obstante, char se usa, por ejemplo, para leer ficheros que están escritos desde otro lenguaje.

Existen varios constructores para crear nuevas cadenas:

String();
String( String value );
String( char value[] );
String( char value[],int offset,int count );
String( byte bytes[],int offset,int length );
String( byte bytes[],int offset,int length,String enc );
String( byte bytes[] );
String( byte bytes[],String enc );
String( StringBuffer buffer );

Tal como uno puede imaginarse, las cadenas pueden ser muy complejas, existiendo muchos métodos muy útiles para trabajar con ellas y, afortunadamente, la mayoría están codificados en la clase String, por lo que sería conveniente que el programador tuviese una copia de la declaración de la clase String encima de su mesa de trabajo, para determinar el significado de los parámetros en los constructores y métodos de la clase String. Es más, esta necesidad puede extenderse a todas las demás clases, pero claro, teniendo en cuenta el espacio disponible sobre la mesa de trabajo.

También merece comentario el parámetro enc que se utiliza en algunos constructores de la clase y que permite encriptar la cadena que se le pasa como parámetro en función de los caracteres que se indiquen en el parámetro. En caso de usar alguno de estos constructores, hay que tener en cuenta que la cadena que se devuelve puede que no tenga la misma longitud que la que se le pasa para codificar, por lo que deben utilizarse con cuidado estos constructores.

Hay que resaltar el hecho de que mientras que el contenido de un objeto String no puede modificarse, una referencia a un objeto String puede hacerse que apunte a otro objeto String, de tal forma que parece que el primer objeto ha sido modificado. Esta característica es la que ilustra el ejemplo java804.java.

Es importante resaltar que la siguiente sentencia no modifica el objeto original referenciado por la variable str1:

thisObj.str1 = thisObj.str1 + " " + thisObj.str2;

sino que, esta sentencia crea un nuevo objeto que es la concatenación de los objetos existentes y hace que la variable de referencia str1 apunte al nuevo objeto, en lugar de apuntar al objeto original. Ese objeto original queda marcado para que el reciclador de memoria en su siguiente pasada, devuelva la memoria que ocupaba al sistema.

Una reflexión especial merecen los arrays de Strings. La siguiente sentencia declara e instancia un array de referencias a cinco objetos de tipo String:

String miArray = new String[5];

Este array no contiene los datos de las cadenas. Solamente reserva una zona de memoria para almacenar las cinco referencias a cadenas. No se guarda memoria para almacenar los caracteres que van a componer esas cinco cadenas, por lo que hay que reservar expresamente esa memoria a la hora de almacenar los datos concretos de las cadenas, tal como se hace en la siguiente línea de código:

miArray[0] = new String( "Esta es la primera cadena" );
miArray[1] = new String( "Esta es la segunda cadena" );

Esto resultará conocido a los programadores C/C++, ya que sería el método habitual de reservar memoria para un array de punteros de tipo char y luego hacer que esos punteros apunten a cadenas localizadas en algún lugar de la memoria.

Funciones Básicas

La primera devuelve la longitud de la cadena y la segunda devuelve el carácter que se encuentra en la posición que se indica en indice :

int length();
char charAt( int indice );

Funciones de Comparación de Strings

boolean equals( Object obj );
boolean equalsIgnoreCase( String str2 );

Lo mismo que equals() pero no tiene en cuenta mayúsculas o minúsculas.

int compareTo( String str2 );

Devuelve un entero menor que cero si la cadena es léxicamente menor que str2 . Devuelve cero si las dos cadenas son léxicamente iguales y un entero mayor que cero si la cadena es léxicamente mayor que str2.

Funciones de Comparación de Subcadenas

boolean regionMatches( int offset,String other,int ooffset,
    int len );
boolean regionMatches( boolean ignoreCase,int offset,String other,
    int ooffset,int len );

Comprueba si una región de esta cadena es igual a una región de otra cadena.

boolean startsWith( String prefix );
boolean startsWith( String prefix,int toffset );
boolean endsWith( String suffix );

Devuelve si esta cadena comienza o termina con un cierto prefijo o sufijo comenzando en un determinado desplazamiento.

int indexOf( int ch );
int indexOf( int ch,int fromIndex );
int lastIndexOf( int ch );
int lastIndexOf( int ch,int fromIndex );
int indexOf( String str );
int indexOf( String str,int fromIndex );
int lastIndexOf( String str );
int lastIndexOf( String str,int fromIndex );

Devuelve el primer/último índice de un carácter/cadena empezando la búsqueda a partir de un determinado desplazamiento.

String substring( int beginIndex );
String substring( int beginIndex,int endIndex );
String concat( String str );
String replace( char oldChar,char newChar );
String toLowerCase();
String toUpperCase();
String trim();

Ajusta los espacios en blanco al comienzo y al final de la cadena.

void getChars( int srcBegin,int srcEnd,char dst[],int dstBegin );
void getBytes( int srcBegin,int srcEnd,byte dst[],int dstBegin );
String toString();
char toCharArray();
int hashCode();

Con frecuencia se necesita convertir un objeto cualquiera a un objeto String, porque sea necesario pasarlo a un método que solamente acepte valores String, o por cualquier otra razón. Todas las clases heredan el método toString() de la clase Object y muchas de ellas lo sobreesciben para proporcionar una implementación que tenga sentido para esas clases. Además, puede haber ocasiones en que sea necesario sobreescribir el método toString() para clases propias y proporcionarles un método de conversión adecuado.

En el ejemplo java805.java, se sobreescribe el método toString() para la nueva clase que se crea en el código.

class java805 {
    // Se definen las variables de instancia para la clase
    String uno; 
    String dos;
    String tres;
  
    // Constructor de la clase
    java805( String a,String b,String c ) {
        uno = a;
        dos = b;
        tres = c;
        }
  
    public static void main( String args[] ) {
        // Se instancia un objeto de la clase
        java805 obj = new java805( "Tutorial","de","Java" );

        // Se presenta el objeto utilizando el metodo sobreescrito
        System.out.println( obj.toString() );
        }
  
    // Sobreescritura del metodo toString() de la clase Object
    public String toString() { 
        // Convierte un objeto a cadena y lo devuelve
        return( uno+" "+dos+" "+tres );
        }
    }

Funciones de Conversión

La clase String posee numerosas funciones para transformar valores de otros tipos de datos a su representación como cadena. Todas estas funciones tienen el nombre de valueOf, estando el método sobrecargado para todos los tipos de datos básicos.

A continuación se muestra un ejemplo de su utilización:

String Uno = new String( "Hola Mundo" );
float f = 3.141592;

String PI = Uno.valueOf( f );
String PI = String.valueOf( f );    // Mucho más correcto
String valueOf( boolean b );
String valueOf( char c );
String valueOf( int i );
String valueOf( long l );
String valueOf( float f );
String valueOf( double d );
String valueOf( Object obj );
String valueOf( char data[] );
String valueOf( char data[],int offset,int count );

Usa arrays de caracteres para la cadena.

String copyValueOf( char data[] );
String copyValueOf( char data[],int offset,int count );

Crea un nuevo array equivalente para la cadena.

Ahora bien, la conversión contraria de valor numérico a cadena no tiene métodos en Java, a semejanza del atoi() o atof() de C++. En el ejemplo java806.java, se muestra una forma de realizar esta conversión, aunque puede haber otras y seguramente mejores.

class java806 {
    public static void main( String args[] ) {
        int numero = new Integer( "1234" ).intValue();
  
        System.out.println( "El valor entero de la variable " +
            "numero es " + numero );
        }
    }

Se crea un objeto Integer temporal que contiene el valor especificado para el String. El método intValue() de la clase Integer es el que se utiliza para extraer el valor del entero de ese objeto y asignarlo a una variable de tipo int . Esto puede utilizarse como patrón para implementar métodos de conversión atoi() propios.

Navegador

Home | Anterior | Siguiente | Indice | Correo