Anda di halaman 1dari 13

ARRAYS

1. Definición.

Un array (arreglo) es una estructura de datos con una capacidad pre-definida en


la cual se pueden almacenar datos del mismo tipo.
Estos datos se almacenan de forma secuencial en la memoria y ocupan una
determinada cantidad de bytes en la memoria (dependiendo del tipo de datos).
La capacidad de un array se debe de declarar en el momento de su construcción
y no puede cambiar durante su ejecución.
Cada dato almacenado es un elemento al que se accede por un índice de
posición.
Los valores del índice empiezan en 0, por lo tanto el rango de un array es
→ {0; Tamaño total – 1}.

Los arrays se distinguen principalmente en dos tipos :


- Unidireccionales → se conocen como vectores.
- Multidireccionales → se conocen como matrices.

2. Declaración y construcción de un array.

2.1 Declaración.

- Para declarar un array es necesario especificar el tipo de dato y asignarle un


nombre de la siguiente manera :

tipo-de-dato[] nombre-array;

Por ejemplo :

int[] ejemploArray;
2.1.2 Tipos de datos permitidos.

El tipo de dato de un array puede ser primitivo o un objeto.

- Los tipos de datos primitivos que nos vamos a encontrar en la construcción


de un array son los siguientes → char, byte, int, short, long,float,double,boolean
y String.

- Además en Java es posible crear un array de un objeto. Por ejemplo :

miObjeto[] nombreObjeto;

2.2 Construcción.

Un array es un objeto, por lo tanto se debe de utilizar el operador new para


construirlo, como se hace para construir la instancia de una clase. Este operador
crea e inicializa el nuevo objeto.

- Para tener el acceso al array, necesitamos declararlo previamente para poder


construirlo.
La sintaxis para un uso inmediato del array es la siguiente →

tipo-de-dato[] nombre-array = new tipo-de-dato[tamaño-del-array];

Para declarar un array de manera local haríamos lo siguiente :

int[] ejemploArray = new int[10];

Con este ejemplo obtendríamos un array de tamaño 10. El tamaño sería fijo y
su indice iría de 0 a 9.

Para declarar un array como objeto de un método haríamos lo siguiente :

int[] ejemploArray;
void ejemploMetodo(){
ejemploArray = new int[10];
}

La asignación de memoria para los elementos de un array se realiza durante la


construcción no la declaración.
3. Asignación de valores.

Cuando construimos un array todos sus elementos serán iniciados con el valor
predeterminado. Los objetos siempre son null y los datos primitivos tiene el
valor 0 (el formato del 0 depende del tipo de dato). Hay que tener en cuenta que
String es un objeto de clase String.

Tipo de dato Valor predeterminado


byte 0
short 0
long 0
int 0
double 0.0
float 0.0
char /u0000
boolean false
Objeto null

Generalmente, el contenido de un array es asignado durante el tiempo de


ejecución.

- Una vez construido el array la sintaxis para asignar/modificar un valor es la


siguiente :

nombre-array[ÍNDICE] = valor;

Como ya se ha mencionado anteriormente, el índice comienza en 0.

Por ejemplo :

int[] ejemploArray = new int[10];


//Array previamente iniciado.
ejemploArray[0]=1;
//Le asignamos el valor 1 al primer elemento del
array.

Es posible iniciar un array con unos valores definidos, y posteriormente


modificar esos valores sin necesidad de instanciar el objeto (con el operador
new).
4. Acceder a los elementos.

Para acceder a los elementos de un array se debe de especificar el nombre del


array junto al indice del elemento. La sintaxis es :

nombre-array[ÍNDICE];

Por ejemplo :

El sistema imprimirá el número 2.

Hay que tener en cuenta que si al construir el array con valores y no


definiendo su tamaño, no se tiene que instanciar el objeto en el
operador new.

5. La variable length.

Devuelve la longitud del array, es decir, la cantidad de elementos que tiene (null
incluidos).
Devuelve un valor entero positivo.
Puede ser muy útil en estructuras de control como por ejemplo for.
El bucle for permite iterar sobre un rango conocido.
- Su sintaxis es la siguiente :

nombre-array.length;

Ejemplo en el que se usa la variable .length :


En el ejemplo anterior se usa el bucle for para imprimir cada elemento,
basándose en su índice.

6. Copiar el contenido de un array.

Antes de explicar la manera de copiar los datos de un array a otro es importante


entender el siguiente ejemplo :

int[]array1 = {1,2,3,4};
int[]array2 = array1;

Al hacer la asignación de array2 a array1 lo que ocurre no es la copia de los


elementos sino la referencia a de array2 a array1.
Una vez sabiendo eso se explicará la manera de copiar los elementos (mediante
el bucle for).

Ejemplo :

- Dentro del bucle es importante que el array que vamos a copiar este en
primer lugar.

- Este método se debe de utilizar cuando tenemos un array con valores


definidos.
- Las matrices son estructuras sequentiales , es decir que los elementos se
almacenan uno después de otro en una matriz.

Se puede acceder a un elemento individual de una matriz mediante una notación


en corchetes.

Bucle for-each.
Es una extensión del bucle for, mejorada.
Su sintaxis es la siguiente :
for(tipo variable de interacción : nombre-array){
código para cada elemento de array;
}

Para cada interacción del bucle, el siguiente elemento de matriz se recupera y se


almacena en la variable de interacción.
El tipo de esa variable debe de ser el mismo que el de los elementos.
Ejemplo :

El sistema imprimirá cada valor del array.

7. ArrayIndexOutOfBoundsException.

Si el índice del array es negativo o mayor al tamaño de la matriz nos puede dar
ese tipo de error.
8. Clase ArrayList.

- Forma parte de la biblioteca de Java, al igual que las clases String o Math.
- Se puede utilizar para almacenar objetos (solo objetos).
- Se debe de importar → import java.util.ArrayList;
- En los objeto de esta clase no es necesario declarar el tamaño de la lista, lo
hace de forma dinámica, al igual que al borrar elementos, el tamaño se reduce
dinámicamente.
- Está clase tiene métodos que nos permiten añadir, eliminar y modificar sus
elementos

8.1 Declaración de ArrayList.

ArrayList<elemento/objeto> nombre-arrayList = new


ArrayList<elemento/objeto>();

- Para indicar el tipo de objeto se utiliza el operador diamante (<>).

8.2.Métodos de la clase ArrayList.

8.2.1 → add()
El método add() permite añadir valores a la ArrayList.
Su sintaxis es la siguiente :
nombreArrayList.add(“valor”);

8.2.2 → remove()
El método remove() permite borrar elementos.
Ejemplos del uso de remove() →

remove(0) → elimina el primer elemento (índice 0).


remove(lista.size() - 1) → elimina el último elemento.
Aquí se utiliza el método .size() , que extrae el tamaño de la cadena.
remove(“Leli”) → elimina un elemento que coincide con un valor específico.

8.3 Recorrido de una clase ArrayList.


Una ArrayList se puede recorrer mediante varias formas :
- Bucle for-each.
- Con un Iterator.
- Con un ListItenator.
A continuación se explicarán cada uno de los procesos.
8.3.1.Bucle for-each.
Su funcionamiento es similar a los arrays.
La sintaxis es la siguiente :

for(tipo-objeto variable : arrayList){


código;
}

8.3.2 Iterator.

- No puede ser instanciado porque carece de contructor, pero si puede ser


definido como un objeto.
- Es miembro del marco de recopilaciones. Permite recorrer todos los elementos
de la arrayList, al obtener o eliminar elementos.
- Solo se puede utilizar para desplazarse hacia delante.
- Se debe de utilizar para desplazarse hacia delante.
- Se debe de importar → import java.util.Iterator

Contiene métodos , entre los cuales estan :


hasNext() , remove() , next().

- Su sintaxis es la siguiente :

Iterator<objeto> nombre = nombre-arrayList.Iterator();

8.3.3 ListIterator.

- Permite recorrer la ArrayList en ambas direcciones.


- Se debe de importar → import java.util.ListIterator
- Al igual que el Iterator , no puede instanciarse.
- Su sintaxis es la siguiente :

ListIterator<objeto> nombre = nombre-ArrayList.listIterator();


8.4 Clases de envoltorio.

Como ya se ha dicho anteriormente , una ArrayList solo puede almacenar


objetos, no datos primitivos.
Pero es posible utilizarla con datos primitivos mediante clases especiales, que
se denominan clases de envoltorio.
Java, ofrece clases, que corresponden a los tipos primitivos. Estas envuelven los
tipos primitivos en un objeto.

Tipo primitivo Tipo de envoltorio


byte Byte
Short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

Java tiene dos funciones que permiten realizar una conversión automática de
tipos de datos primitivos en sus clases de envoltorio y viceversa.
Son : conversión automática(tipos → clases) y anulación de la
conversión(clases → tipos).

Ejemplo de uso de clases de envoltorio :


9. Manejo de excepciones.

Una excepción es un error que se produce durante la ejecución de un programa


que interrumpe el flujo normal del programa.
Cuando se produce una excepción la ejecución del programa finaliza. Los
detalles de esta se imprimen en la consola.
El método principal para tratar las excepciones es evitarlas.

Por ejemplo para evitar una ArithmeticException se puede usar lógica


condicional, comprobando si la condición se va a producir antes de poner en
marcha la operación.

En este caso evitamos el error que se produciría al dividir un número entre 0.

9.2 Categorías de excepciones.


En Java las categorías se dividen en dos tipos :

- Excepciones comprobadas :
El compilador comprueba y se hace cargo de las excepciones, y si no las puede
manejar da un error de compilación.

- Excepciones no comprobadas :
El compilador directamente no comprueba los errores. Por ejemplo :
ArithmeticException , ArrayIndexOutOfBoundsException , etc.
9.3 Manejo de excepciones con try/catch.

No siempre podemos evitar las excepciones , ya que no siempre se sabe si una


operación fallará antes de que se llame.
El próximo método en explicar sera la utilización del bloque try/catch para el
manejo de excepciones.

- Para el código que es probable que se produzca una excepción es posible


escribirlo dentro de un bloque try.
- Los manejadores de excepciones se sitúan dentro de ese bloque, y si hay más ,
se sitúan dentro de uno o más bloques catch. En la zona catch obtenemos
información sobre el error producido. Incluimos varios catch para contemplar
todos los posibles errores que se pueden producir en try.
- El tipo de argumento ExceptionType declara el tipo de excepción.

El control de flujo tiene la siguiente sintaxis :


En primer lugar se ejecuta el bloque try.
try{
Si se ejecuta el bloque try a
código que puede producir una posible excepción continuación se ejecuta el código
} después de catch.

catch(ExceptionType tipo){ Si el bloque try falla, se ejecuta el


bloque catch y a continuación el código
código de manejo de la excepción restante.
}

código

Ejemplo de uso de estos bloques :


- Es posible también anidar el bloque que se ejecuta al final con la palabra clave
finally. Se suele utilizar para asegurar de que no se hayan producido errores.

Ejemplos de excepciones comunes :

→ java.lang.ArrayIndexOutOfBoundException : intenta acceder a un índice de


matriz no existente.

→ java.lang.NullPointerException : intenta utilizar una referencia de objeto


que no se instanciaba.
(Por ejemplo : llamar a un método para un objeto nulo)

→ java.io.IOException : operaciones de E/S fallidas.

Todos los errores generados son generados por la clase java.lang.Exception.


Por lo tanto, es posible generar propios errores.
Esto se explicará más adelante.

10. Técnicas y conceptos de depuración de código.

10.1 Conceptos de prueba y depuración.


- Prueba : determinar si un código contiene errores.
- Depuración : identificar el error y corregirlo.
10.2 Tipos de errores.
Existen tres tipos de errores : de lógica, de compilación y de tiempo de
ejecución.

10.2.1 Errores de compilación.


Son más fáciles de corregir. Por ejemplo , falta del punto y coma, falta del
paréntesis de cierre, falta de argumento en una operación matemática, etc.

10.2.2 Errores de lógica.


El programa se ejecuta pero genera un resultado erróneo.
Un ejemplo de esto sería una variable no inicializada.
10.2.3 Errores de tiempo de ejecución.
Este tipo de errores no las puede detectar Java hasta que se ejecute el programa.
Son las excepciones vistas anteriormente como por ejemplo,
ArrayIndexOutOfBoundsException, NullPointerException,
ArithmeticException, etc.

11. Técnicas de depuración.

11.1 Sentencia print.

Son fáciles de agregar y proporcionan información útil, como :


- Métodos a los que se ha llamado.
- Valor de los parámetros.
- Orden en el que se ha llamado a los métodos.
- Valores de las variables.
Las desventaja de uso de estas sentencias es que no resulta práctico agregar
sentencias print a cada método.

Anda mungkin juga menyukai