Computing">
02 - Declaracion Inicializacion de Arreglos
02 - Declaracion Inicializacion de Arreglos
02 - Declaracion Inicializacion de Arreglos
Arreglos.
SEMANA 2
Como parte del primer objetivo de evaluación del examen, el tema de declaración e
inicialización de arreglos es de gran importancia. Podría pensarse que todo está dicho
acerca de este tema, pero de nuevo es importante recalcar que el examen evalúa, en
profundidad, cada una de las características del lenguaje, esto se hace evidente en
preguntas que involucran detalles que normalmente pasarían desapercibidos en un
desarrollo de una aplicación común. Así es que no sobra dedicarle el tiempo suficiente
a estudiar la siguiente lectura, experimentando con la información aquí contenida, y de
esta forma tener las herramientas suficientes para analizar y resolver correctamente los
problemas planteados en las preguntas del examen. Ponga a prueba la información que
adquiere aquí en un programa real, pruebe todas las posibilidades y pregúntese, ¿será
que esto se puede hacer?, escriba un programa y compruébelo usted mismo.
Como se sabe, los arreglos son objetos en java que pueden usarse para administrar
múltiples variables de un mismo tipo. Los arreglos en sí mismos son representados en
Java como objetos, independientemente de si las variables que contienen son de un
tipo primitivo o referenciado. Por tanto, se ha de tener especial cuidado en aspectos
relativos al uso de estos objetos, tales como:
Para cada punto, hay un conjunto de reglas que permite definir la manera correcta de
hacer las cosas, pero no definen estas, una sola forma de llevarlas a cabo. Existen
diferentes formas de realizar cada uno de estos aspectos, conocerlas e inferirlas a partir
de las reglas enunciadas es fundamental para obtener la certificación.
Declarando arreglos
Para declarar un arreglo se necesita, primero, indicar el tipo de los elementos que lo
conformarán, este puede ser cualquiera de los tipos primitivos, o referencia a objetos de
una clase. Para indicar que se desea trabajar con un arreglo y no con una variable
sencilla, se usan un par de corchetes ([ ]), los cuales pueden ser ubicados antes o
después del identificador del arreglo.
2 [ POLITÉCNICO GANCOLOMBIANO]
double []arreglo;
double arreglo [];
Estas dos declaraciones de un arreglo de reales tienen el mismo efecto, ambas son
válidas aunque se recomienda siempre escribir los corchetes antes del identificador
para favorecer la legibilidad del código. Puede o no utilizar uno o más espacios para
separar el tipo, nombre y los corchetes, por ejemplo, las siguientes declaraciones son
legales y equivalentes:
String[]arreglo;
String[] arreglo;
String []arreglo;
String [] arreglo;
String arreglo[];
String arreglo [];
int [][] []multi;
int[]multi[];
3
long arr[15];
Construyendo arreglos
Una vez declarada la referencia a un arreglo, se debe instanciar esta referencia, es
decir, crear el objeto en el heap, (el lugar de la memoria en donde todos los objetos son
almacenados). Existen diferencias a la hora de construir estos objetos, lo que a veces
nos hace olvidar que en realidad estamos trabajando con un objeto y no con primitivos.
Está implicada en este proceso de creación la palabra reservada new, como en las
construcciones de los objetos normales, aunque tratándose de arreglos estas
sentencias lucen un tanto diferentes. La única información necesaria para construir un
arreglo, es su tamaño, con esto Java sabrá exactamente cuánto espacio debe reservar
en memoria, sin esta información, no se podrá construir el arreglo.
Construyendo un arreglo simple
4 [ POLITÉCNICO GANCOLOMBIANO]
int[] arr;
arr = new int[25];
int[] arr = new int[25];
Character[] chars = new Character[4];
Puede generar confusión el uso de la palabra reservada new, al parecer que se invoca
al constructor de la clase Character, pero en realidad se está construyendo únicamente
el arreglo que contendrá 4 referencias a objetos de la clase Character. Si se preguntara
5
por la cantidad de objetos que habría en el heap luego de ejecutar la anterior sentencia,
se espera que sea claro que solo hay uno, el objeto de arreglo, pues objetos de
Character aún no han sido construidos y, por tanto, no hay referencias que apunten a
objetos en el heap en este momento.
También es posible construir arreglos indicando directamente cuáles son los valores
que contendrá este, así se inicializa el arreglo con los valores suministrados, y el
tamaño se infiere de la cantidad de elementos que se provea. Trataremos en detalle
esta característica al profundizar en la inicialización de arreglos, más adelante.
Construyendo arreglos multidimensionales
int[][] matrix = new int[10][5];
Como se sabe, la sentencia crea un arreglo de diez elementos, pero cada uno de estos
elementos es otro arreglo en sí mismo de tamaño 5. Esto es natural en la programación
en Java, pero qué sucede si modificamos un poco la declaración:
int[][] matrix = new int[3][];
¿Es legal esta sentencia?, si es así, ¿Qué tipo de estructura se está declarando?
Como se mencionó anteriormente, el único dato necesario para construir un arreglo es
el tamaño que tendrá el arreglo. Sucede lo mismo en este ejemplo: se desea construir
un arreglo (independientemente que este contenga a su vez más arreglos), así que lo
único necesario para crearlo es proveer su tamaño. Una declaración y construcción de
este tipo es legal, pero aún falta construir cada uno de los arreglos contenidos, por esto
aún no se puede usar el objeto. Hasta ahora se le ha indicado al compilador que
necesitamos trabajar con un arreglo que contiene tres arreglos, pero no se ha
especificado qué tamaño tendrá cada uno de esos arreglos porque no se han
6 [ POLITÉCNICO GANCOLOMBIANO]
int[][] matrix = new int[3][];
matrix[0] = new int[3];
matrix[1] = new int[2];
matrix[2] = new int[1];
Perfectamente legal, se le está indicando al compilador que de los tres arreglos que
contendrá el arreglo matrix, el primero tendrá un tamaño de tres elementos, el segundo
de dos y el tercero solo tendrá uno. Si representamos la estructura gráficamente como
es costumbre asociando el primer índice a las filas y el segundo a las columnas,
tendríamos una matriz como esta:
0 1 2
0 0 0 0
0 0
Inicializando arreglos
7
Inicializar hace referencia a asignar valores a los elementos del arreglo, los valores
dependerán del tipo declarado para el arreglo, ya sea de tipo primitivo, o de objetos.
Cuando se trata de arreglos de tipos primitivos, al momento de construir el arreglo, este
se inicializa con valores por defecto, sin que el programador tenga que especificarlo
explícitamente.
String [] cadenas = new String [3];
String mayusculas = cadenas[0].toUpperCase();
String [] cadenas = new String [3];
cadenas[0] = new String (“Cadena 1”);
cadenas[1] = new String (“Cadena 2”);
cadenas[2] = new String (“Cadena 3”);
8 [ POLITÉCNICO GANCOLOMBIANO]
String [] cadenas = new String [3];
cadenas[0] = “Cadena 1”;
cadenas[1] = “Cadena 2”;
cadenas[2] = “Cadena 3”;
int []arr = {3,6,7,9};
Se puede, por tanto, indicarle al compilador en una sola línea, que se desea declarar un
arreglo de enteros, de tamaño cuatro pues se infiere por la cantidad de elementos
separados por comas entre las llaves, y que se inicialice con los valores 3, 6, 7 y 9
respectivamente en sus posiciones. La referencia al arreglo quedará almacenada en la
variable arr.
Esta sentencia es equivalente al siguiente grupo de instrucciones:
int []arr;
arr = new int[4];
arr[0] = 3;
arr[1] = 6;
arr[2] = 7;
arr[3] = 9;
9
int [][] matrix = {{3, 4}, {8, 3}, {6, 2}};
int [][] matrix = {
{3, 4},
{8, 3},
{6, 2}
};
int [][] matrix = {{3, 4, 1}, {8}, {6, 2, 5, 6}, {7, 4}};
10 [ POLITÉCNICO GANCOLOMBIANO]
En este caso, parece no haber mucha diferencia, y los arreglos anónimos no parecen
tener mucha utilidad, pero por ejemplo, en el caso de tener el siguiente método:
public static void imprimirArr (int arr[]){
System.out.println(java.util.Arrays.toString(arr));
}
Podríamos usar arreglos anónimos para crear rápidamente un arreglo que serviría
únicamente como parámetro del método. En este caso el llamado al método usando
arreglos anónimos sería:
public static void main(String [] args){
imprimirArr( new int[] {4,5,6,7,8,0});
}
11