Opakování
-
Pole je homogenní datová struktura - všechny prvky stejného typu.
-
V objektovém pojetí je možný polymorfismus - pole
Person[]
může obsahovat prvkyPerson
iManager
, když je to podtřídaPerson
:Manager extends Person
. -
Vytvoření, naplnění a získání hodnot vypadá následovně:
int[] array = new int[2];
array[0] = 1;
array[1] = 4;
System.out.println("First element is: " + array[0]);
-
typ může být primitivní i objektový:
Person[] p = new Person[3];
Velikost pole
-
velikost pole je daná při jejím vytvoření a nelze ji měnit
-
V budoucnu budeme probírat kolekce (seznam, slovník), což je mocnější složený datový typ než pole a
-
jejich počty prvků se mohou dynamicky měnit.
Kopírování odkazu
-
Přiřazení proměnné objektového typu (což je i pole) vede pouze k duplikaci odkazu, nikoli celého odkazovaného objektu.
-
Modifikace pole přes jednu proměnnou/odkaz se pak projeví i té druhé.
int[] array = new int[] {1, 4, 7};
int[] array2 = array;
array[1] = 100;
System.out.println(array[1]); // prints 100
System.out.println(array2[1]); // prints 100
Kopie pole
-
Pomocí
Arrays.copyOf
můžeme vytvořit kopii pole -
Kopie vznikne tak, že se vytvoří nové pole a do něj se nakopírují položky z původního pole.
-
Metoda
copyOf
bere dva parametry — původní pole a počet prvků, kolik se má nakopírovat.
int[] array = new int[] {1, 4, 7};
int[] array2 = Arrays.copyOf(array, array.length);
array[1] = 100;
System.out.println(array[1]); // prints 100
System.out.println(array2[1]); // prints 4
Kopie u objektů I
-
Obdobně to funguje i objektů.
Person[] people = new Person[] { new Person("Jan"), new Person("Adam")};
Person[] people2 = Arrays.copyOf(people, people.length);
people[1] = new Person("Pepa");
System.out.println(people[1].getName()); // prints Pepa
System.out.println(people2[1].getName()); // prints Adam
Kopie u objektů II
-
Do cílového pole se zduplikují jenom odkazy na objekty
Person
, nevytvoří se kopie objektůPerson
!
Person[] people = new Person[] { new Person("Jan"), new Person("Adam")};
Person[] people2 = Arrays.copyOf(people, people.length);
people[1].setName("Pepa"); // changes Adam to Pepa
System.out.println(people[1].getName()); // prints Pepa
System.out.println(people2[1].getName()); // prints Pepa
-
Jinými slovy, pole mají sice různý odkaz (šipku), ale na stejný objekt.
-
V předešlém příkladu jsme změnili odkaz na jiný objekt.
-
Teď jsme změnili obsah objektu, na který ukazují oba odkazy.
Pomocné metody pro kontrolu indexů do pole
-
Třída
java.util.Objects
nabízí pro práci s poli statické metody na kontrolu, zda se index nebo rozmezí indexů "vejde" do velikosti pole
public static int checkIndex(int index, int length)
public static int checkFromToIndex(int fromIndex, int toIndex, int length)
public static int checkFromIndexSize(int fromIndex, int size, int length)
Repl.it demo k polím
Třída Arrays
-
nabízí jen statické metody a proměnné, tzv. utility class
-
nelze od ní vytvářet instance
-
metody jsou implementovány pro všechny primitivní typy i objekty
-
pro jednoduchost použijeme pole typu
long
Metody třídy Arrays
I
String toString(long[] a)
-
vrátí textovou reprezentaci
long[] copyOf(long[] original, int newLength)
-
nakopíruje pole
original
, vezme prvníchnewLength
prvků long[] copyOfRange(long[] original, int from, int to)
-
nakopíruje prvky
from
-to
a nové pole vrátí void fill(long[] a, long val)
-
naplní pole
a
hodnotamival
Metody třídy Arrays
II
boolean equals(long[] a, long[] a2)
-
vrátí
true
právě když jsou pole stejná int hashCode(long[] a)
-
haš pole
void sort(long[] a)
-
setřídí pole
… asList(…)
-
z pole vytvoří kolekci (budou probírány později)
Příklad
long[] a1 = new long[] { 1L, 5L, 2L };
a1.toString(); // [J@4c75cab9
Arrays.toString(a1); // [1, 5, 2]
long[] a2 = Arrays.copyOf(a1, a1.length);
Arrays.equals(a1, a2); // true
Arrays.fill(a2, 3L); // [3, 3, 3]
Arrays.sort(a1); // [1, 2, 5]