int[] array = new int[2];
array[0] = 1;
array[1] = 4;
System.out.println("First element is: " + array[0]);
Arrays
Tomáš Pitner, Radek Ošlejšek, Marek Šabo, Jakub Čecháček
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]);
Deklarace: typ[] jméno = new
typ [velikost];
typ může být i objektový: Person[] p = new Person[3];
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
jejich počty prvků se mohou dynamicky měnit
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 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
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.
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
Metoda copyOf
bere dva parametry — původní pole a počet prvků, kolik se má nakopírovat.
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
Co kdybychom změnili jenom jméno (atribut objektu)?
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.
Třída java.util.Objects
nabízí pro práci s poli statické metody na kontrolu, zda index nebo rozmezí indexů se "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)
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
Arrays
IString toString(long[] a)
vrátí textovou reprezentaci
long[] copyOf(long[] original, int newLength)
nakopíruje pole original
, vezme prvních newLength
prvků
long[] copyOfRange(long[] original, int from, int to)
nakopíruje prvky from
-to
nové pole vrátí
void fill(long[] a, long val)
naplní pole a
hodnotami val
Arrays
IIboolean equals(long[] a, long[] a2)
true
jestli 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)
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]