Matrices, Strings y StringBuffers

Matrices

Almacenamiento y proceso de valores múltiples.

La declaración de una matriz se hace declarando su tipo (basado en el tipo de sus elementos) y su nombre. No existen los matrices genéricos. Ejemplo:

int[] matrizDeEnteros;
Esta declaración no reserva memoria para los elementos de la matriz.

Al instanciar la matriz con el operador new se reserva memoria para los elementos de la matriz, que ya están listos para ser inicializados. Por ejemplo:

int[] matrizDeEnteros= new int[10];
En general:
tipoElem[] nombreMatriz = new tipoElem[tamaño]
El acceso a los elementos de una matriz se hace a través de un índice que va de cero a la longitud de la matriz menos uno.
for (int j = 0; j < matrizDeEnteros.length; j ++) {
    matrizDeEnteros[j] = j;
    System.out.println("[j] = " + matrizDeEnteros[j]);
}

length es una propiedad de todas las matrices en Java.

Las matrices pueden contener cualquier tipo Java legal incluyendo tipos de referecia como objetos u otras matrices.

Strings

Son secuencias de caracteres implementadas en la clase String (dentro del paquete java.lang). Por ejemplo:
String[] args
"La entrada tiene "
" caracteres."
El compilador cuando encuentra un string literal reserva memoria para un objeto de tipo String que contiene la cadena dada.

Los Strings se usan para almacenar y manipular Strings constantes. Cuando se necesita un String que va a cambiar (aumentar o disminuir) se usa StringBuffer.

Creación de Strings y StringBuffers

Constructores de Strings: a partir de una matriz de bytes, de una matriz de caracteres, de otro String o de un StringBuffer.
String vacío= new String();
String deBytes= new String(matrizDeBytes);
String deCaracteres= new String(matrizDeCaracteres);
String str= new String(deBytes+deCaracteres);
String pepito= new String(stringBuffer);

Constructores de StringBuffers: a partir de un String:

StringBuffer pepe= new StringBuffer("Don José");
de una longitud dada o no especificada:
StringBuffer alrededorDeDiez= new StringBuffer(10);
StringBuffer muyDinámico= new StringBuffer();

Concatenación de Strings

La concatenación de Strings se hace utilizando el operador sobrecargado +. Normalmente se hace invocando el método toString() en los objetos que no son de tipo String. Por ejemplo:
"La entrada tiene " + cuenta + " caracteres."

Añadir, insertar y reemplazar caracteres en un StringBuffer

append(String str)

insert(int before, String str)

setCharAt(int where, char ch)

Ejemplos

Inversión de Strings:
    public static String reverseIt(String source) {
      int i, len = source.length();
      StringBuffer dest = new StringBuffer(len);

      for (i = (len - 1); i >= 0; i--) {
        dest.append(source.charAt(i));
      }
      return dest.toString();
    }
Veamos un ejemplo de manejo de nombres de ficheros:
class NombreDeFicheros {
    String caminoCompleto;
    char separadorDeCamino;

    NombreDeFicheros(String str, char sep) {
        caminoCompleto = str;
        separadorDeCamino = sep;
    }

    String extensión() {
        int dot = caminoCompleto.lastIndexOf('.');
        return caminoCompleto.substring(dot + 1);
    }

    String nombreFichero() {
        int dot = caminoCompleto.lastIndexOf('.');
        int sep = caminoCompleto.lastIndexOf(separadorDeCamino);
        return caminoCompleto.substring(sep + 1, dot);
    }

    String camino() {
        int sep = caminoCompleto.lastIndexOf(separadorDeCamino);
        return caminoCompleto.substring(0, sep);
    }
}
Ejemplo de uso de NombreDeFicheros:
class NombreDeFicherosTest {
    public static void main(String[] args) {
        NombreDeFicheros miPágina = 
	    new NombreDeFicheros("/home/pepe/publico_html/indice.html", '/');
        System.out.println("Extensión = " + miPágina.extensión());
        System.out.println("NombreDeFicheros = " + miPágina.nombreFichero());
        System.out.println("Camino = " + miPágina.camino());
    }
}
La salida del programa sería:
Extensión = html
Nombre del fichero = indice
Camino = /home/pepe/publico_html