• Jak vytvořit dvourozměrné pole v Javě. Java Array. Pole v Javě. Java pro začátečníky


    Studium na "Game Developer" + zaměstnání

    Pole Java

    Pole je datová struktura, která ukládá hodnoty stejného typu. K jednotlivému prvku pole se přistupuje pomocí celočíselného indexu. Pokud je například a pole celých čísel, pak hodnota výrazu a [ i ] je rovna i-tému celému číslu v poli.

    Pole je deklarováno následovně: nejprve je specifikován typ pole, tedy typ prvků obsažených v poli, následuje dvojice prázdných hranatých závorek a poté název proměnné. Například takto deklarujete pole celých čísel:
    int a;

    Tento příkaz však pouze deklaruje proměnnou a, neinicializuje ji skutečným polem. Chcete-li vytvořit pole, musíte použít operátor new.

    Tento příkaz vytvoří pole 100 celých čísel. Prvky tohoto pole jsou číslovány od 0 do 99 (nikoli od 1 do 100). Po vytvoření lze pole naplnit např. pomocí smyčky.

    int a = nový int;
    for (int i = 0; i< 100; i++)
    a[i] = i; // Vyplní pole čísly od 0 do 99.

    Pokud se pokusíte získat přístup k prvku a (nebo k jakémukoli prvku, jehož index je mimo rozsah 0 až 99) vytvořením pole 100 prvků, program se přeruší, protože bude vyvolána výjimka indexu pole mimo rozsah.
    Chcete-li spočítat počet prvků v poli, použijte metodu ArrayName.
    va.délka.

    Například,

    for (int i = 0; i< a. length; i++ System.out.println (a[i]);

    Jakmile je pole vytvořeno, není možné změnit jeho velikost (ačkoli můžete samozřejmě měnit jeho jednotlivé prvky). Pokud potřebujete během provádění programu často měnit velikost pole, je lepší použít jinou datovou strukturu zvanou seznam polí.

    Pole lze deklarovat dvěma způsoby:

    int a;
    nebo
    int a;

    Většina programátorů Java preferuje první styl, protože jasněji odděluje typ pole int (pole celých čísel) od názvu proměnné.

    Inicializátory polí a nepojmenovaná pole

    Jazyk Java má schopnost vytvářet pole a současně je inicializovat. Zde je příklad takové syntaxe:

    int smallPrimes = (2, 3, 5, 7, 11, 13);

    Pamatujte, že v tomto případě nemusíte používat nový operátor. Kromě toho můžete dokonce inicializovat nepojmenované pole:

    new int ( 16, 19, 23 , 29 , 31, 37)

    Tento výraz alokuje paměť pro nové pole a vyplní je čísly ve složených závorkách. Zároveň se spočítá jejich počet a podle toho se určí velikost pole. Tato syntaxe je užitečná pro reinicializaci pole bez vytváření nové proměnné. Například výraz

    smallPrimes = new int( 17, 19, 23, 29, 31, 37);
    je zkratka pro výraz
    int anonym = (17, 19, 23, 29, 31, 37);
    smailPrimes = anonymní;

    Můžete vytvořit pole nulové velikosti. Takové pole může být užitečné při psaní metody, která se vyhodnotí jako pole, které se ukáže jako prázdné. Pole nulové délky je deklarováno takto:

    nový typ položky

    Všimněte si, že takové pole není ekvivalentní objektu null.

    Kopírování polí

    Jedno pole lze zkopírovat do druhého, ale obě proměnné budou odkazovat na stejné pole.

    int luckyNumbers = smailPrimes;
    luckyNumbers = 12; // Prvek smailPrimes je nyní také 12.

    Výsledek je znázorněn na Obr. 3.14. Pokud chcete zkopírovat všechny prvky jednoho pole do druhého, měli byste použít metodu arraycopy ze System. Jeho volání vypadá takto:

    System.arraycopy(from, fromlndex, to, tolndex, count);

    Pole to musí být dostatečně velké, aby obsahovalo všechny prvky, které se mají zkopírovat.

    Rýže. 3.14. Kopírování pole

    Například níže uvedené operátory, jejichž výsledky jsou na Obr. 3.15 vytvořte dvě pole a poté zkopírujte poslední čtyři prvky prvního pole do druhého. Kopírování začíná od druhé pozice ve zdrojovém poli a prvky, které se mají zkopírovat, jsou umístěny do cílového pole, počínaje třetí pozicí.

    int smailPrimes = (2, 3, 5, 7, 11, 13);
    int luckyNumbers = (1001, 1002, 1003, 1004, 1005, 1006, 1007);
    System.aggauser(smailPrimes, 2, luckyNumbers, 3, 4);
    for (int i = 0; i< luckyNumbers.length; i++)
    System.println(i +.": " + luckyNumbersfi]);

    Provedení těchto příkazů vede k následujícímu výsledku.

    0: 1001
    1: 1002
    2: 1003
    3: 5
    4: 7
    5: 11
    6: 13

    Rýže. 3.15. Kopírování prvků pole

    Pole v Javě je velmi odlišné od pole v C++. Je to však prakticky stejné jako ukazatel na dynamické pole. To znamená, že operátor

    int a = nový int; //Jáva
    je ekvivalentní operátorovi
    i n t * = nové i n t [ 1 0 0 ] ; // C++,
    ale ne
    int a; // C++

    V jazyce Java výchozí žádný operátor nekontroluje rozsah indexů. Java také nemá aritmetiku ukazatele - nemůžete zvýšit ukazatel a, abyste se dostali na další prvek v poli.

  • Jáva,
  • Algoritmy
    • tutorial

    Myslím, že málokdo, kdo se připravuje na svůj první pohovor, při ucházení se o první práci (pre)junior programátor, odpoví na tuto otázku negativně. Nebo alespoň pochybovat o odpovědi. Samozřejmě taková jednoduchá datová struktura s přímým přístupem k indexu – žádné triky! Ne, v některých jazycích, jako je JavaScript nebo PHP, jsou pole samozřejmě implementována velmi zajímavým způsobem a ve skutečnosti jsou mnohem víc než jen pole. Tady ale nejde o tohle, ale o „tradiční“ implementaci polí v podobě „pevného kusu paměti“. V tomto případě se na základě indexů a velikosti jednoho prvku jednoduše vypočítá adresa a přistoupí se k odpovídající hodnotě. co je tak těžké?
    Pojďme na to přijít. Například v Javě. Požádání nic netušícího žadatele, aby vytvořil pole celých čísel n X n. Člověk sebevědomě napíše něco ve smyslu:
    int g = nový int[n][n];
    Skvělý. Nyní vás požádáme, abyste prvky pole něčím inicializovali. Ačkoli jednotky, i když součet indexů. Dostaneme:
    for(int i = 0; i< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } }
    Ještě častěji píšou
    for(int i = 0; i< g.length; i++) { for(int j = 0; j < g[i].length; j++) { g[i][j] = i + j; } }
    což je také příležitost k rozhovoru, ale teď mluvíme o něčem jiném. Snažíme se zjistit, co člověk ví, a uvidíme, jak přemýšlí. Proto ho upozorňujeme na skutečnost, že hodnoty jsou uspořádány symetricky a žádáme ho, aby ušetřil na iteracích smyček. Samozřejmě, proč procházet všechny hodnoty indexu, když můžete procházet pouze spodním trojúhelníkem? Subjekt obvykle snadno souhlasí a moudře zvýrazní hlavní úhlopříčku a pilně napíše něco ve smyslu:
    for(int i = 0; i< n; i++) { g[i][i] = 2* i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } }
    Místo g[i][i] = 2* i; často pište g[i][i] = i + i; nebo g[i][i] = i<< 1; и это тоже повод поговорить. Но мы идем дальше и задаем ключевой вопрос: Jak rychleji program poběží?. Obvyklá úvaha je následující: téměř 2krát méně výpočtů indexu; téměř 2krát méně než výpočet hodnot (součet); stejný počet úkolů. To znamená, že je to o 30 procent rychlejší.Pokud má člověk za sebou dobrou matematickou školu, tak vidíte i přesný počet uložených operací a rozumnější posouzení efektivity optimalizace.
    Nyní je čas na hlavní útok. Obě verze kódu spouštíme na nějaké dostatečně velké hodnotě n(řádově několik tisíc), například takto.

    Kód s řízením času

    třída A ( public static void main(String args) ( int n = 8000; int g = new int[n][n]; long st, en; // one st = System.nanoTime(); for(int i = 0 i< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nOne time " + (en - st)/1000000.d + " msc"); // two st = System.nanoTime(); for(int i = 0; i < n; i++) { g[i][i] = i + i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nTwo time " + (en - st)/1000000.d + " msc"); } }


    co vidíme? Optimalizovaná verze funguje 10-100krát pomaleji! Nyní je čas sledovat reakci uchazeče o pozici. Jaká bude reakce na neobvyklou (nebo spíše běžnou v praxi developera) stresovou situaci. Pokud se na tváři klienta objevilo vzrušení a začal mačkat tlačítka, dočasně zapomněl na vaši existenci, pak je to dobré znamení. Do určité míry. Nechcete najmout výzkumníka, kterému nezáleží na výsledku projektu, že? Pak se ho neptejte na otázku „Proč?“. Požádejte o přepracování druhé možnosti tak, aby skutečně fungovala rychleji než první.
    Nyní můžete chvíli bezpečně podnikat. Za půl hodiny budete mít dostatek materiálu na zhodnocení hlavních osobních a profesních kvalit uchazeče.
    Mimochodem, když jsem stručně popisoval tento problém na svém pracovním webu, nejoblíbenějším komentářem bylo "Toto je vaše křivka Java." Speciálně pro ně posílám kód do Great and Free. A šťastní majitelé Free Pascalu pro Windows se mohou dívat

    pod spoilerem

    čas programu; používá Windows; var start, finish, res: int64; n, i, j: celé číslo; g: Pole pole Integer; začátek:= 10000; SetLength(g, n, n); QueryPerformanceFrequency(res); QueryPerformanceCounter(start); pro i:=1 až n-1 do pro j:=1 až n-1 do g := i + j; QueryPerformanceCounter(dokončit); writeln("Čas po řádcích:", (dokončení - začátek) / res, "sec"); QueryPerformanceCounter(start); pro i:=1 až n-1 do pro j:=1 až n-1 do g := i + j; QueryPerformanceCounter(dokončit); writeln("Čas podle cols:", (dokončení - začátek) / res, "sec"); konec.


    Ve výše uvedeném kódu v Pascalu jsem odstranil „matoucí“ momenty a nechal jsem pouze podstatu problému. Dá-li se to nazvat problémem.
    Jaké otázky nakonec položíme obžalovanému?
    1. Proč se to zpomalilo? A podrobněji...
    2. Jak zrychlit inicializaci?

    Pokud je potřeba ponořit se hlouběji do implementace Java, požádáme žadatele, aby dodržel dobu provádění pro malé hodnoty n. Například na ideone.com pro n=117 je „optimalizovaná“ verze dvakrát pomalejší. Ale pro další hodnotu n=118 se ukazuje, že je již 100 (sto)krát rychlejší než neoptimalizovaná! Navrhněte experimentování na místním počítači. Nechte ho hrát si s nastavením.
    Mimochodem, chápete, co se děje?

    Pár slov na odůvodnění

    Rád bych řekl pár slov na zdůvodnění tohoto způsobu pohovoru při najímání. Ano, netestuji znalost syntaxe jazyka a znalost datových struktur. Na civilizovaném trhu práce to možná všechno funguje. Ale v našich podmínkách totálního nedostatku kvalifikovaného personálu je nutné posoudit perspektivní přiměřenost uchazeče o práci, které bude čelit. Tito. schopnost učit se, prorazit, přijít na to, dělat.
    V duchu se to podobá „pohovoru“ při náboru legionářů ve starém Římě. Budoucí válečník byl velmi vyděšený a sledoval, zda zrudne nebo zbledne. Pokud zbledne, tak žadateli ve stresové situaci odteče krev z hlavy a je náchylný k pasivní reakci. Například mdloby. Pokud žadatel zčervená, krev se mu hrne do hlavy. Tito. je náchylný k aktivním akcím, spěchat do boje. To bylo považováno za vhodné.
    No, poslední. Proč jsem o tomto problému všem řekl, místo abych ho nadále používal v rozhovorech? Prostě potenciální zájemci se tento úkol již „naučili“ a ostatní ho musí využít.
    Vlastně jsem tomuto efektu věnoval pozornost právě v souvislosti s reálným úkolem zpracování obrazu. Situace byla poněkud nepřehledná a hned jsem nepochopil, proč mi po refaktoringu tolik kleslo fps. Obecně má asi každý takových nádherných chvil spoustu.

    Zatím je hlavní verzí, že „na vině je mezipaměť procesoru“. Tito. sekvenční přístup v první variantě funguje v rámci hashe, který se aktualizuje při překročení určité hranice. Při přístupu po sloupcích se hash musí neustále aktualizovat a to trvá dlouho. Pojďme otestovat tuto verzi v její nejčistší podobě. Začneme pole a porovnáme, co je rychlejší - zpracovat všechny prvky v řadě nebo zpracovat prvky pole s náhodným číslem stejně kolikrát? Zde je program - ideone.com/tMaR2S. Pro 100 000 prvků pole je náhodný přístup obvykle znatelně rychlejší. Co to znamená?
    Zde jsem byl zcela správně upozorněn (Big_Lebowski), že přeuspořádání cyklů mění výsledky ve prospěch sekvenční možnosti. Pro čistotu experimentu jsem musel dát cyklus na zahřívání. Zároveň jsem provedl několik opakování, abych zobrazil průměrnou provozní dobu, jak radí leventov. Dopadlo to takto ideone.com/yN1H4g. Tito. náhodný přístup k prvkům velkého pole je o ~10 % pomalejší než sekvenční přístup. Možná, že cache může skutečně hrát nějakou roli. V počáteční situaci však výkon občas klesal. Je tu tedy něco jiného.

    Postupně se vedoucí stává verze o dalších akcích při přesunu z jednoho řádku pole do druhého. A je to správné. Zbývá zjistit, co se tam přesně děje.

    Štítky:

    • Programování
    • pole
    • Paměť
    Přidat štítky

    Naučili jsme se vytvářet jednorozměrná pole. Podobně v Javě můžete vytvářet dvourozměrné, trojrozměrné, čtyřrozměrné ... jinými slovy, vícerozměrná pole. Vícerozměrné pole v Javě je v podstatě pole polí.

    Oblíbeným příkladem použití tohoto druhu polí jsou matice, které jsou reprezentovány dvourozměrnými poli. Co je tedy matice a jak ji reprezentovat pomocí dvourozměrného pole v Javě.

    Matice a dvourozměrná pole v Javě

    Matice je obdélníková tabulka skládající se z řádků a sloupců, na jejichž průsečíku jsou její prvky. Počet řádků a sloupců matice určuje její velikost.

    Celkový pohled na velikost matice m X n(m - počet řádků, n- počet sloupců) , jak následuje:

    Každý prvek matice má svůj vlastní index, kde první číslice označuje číslo řádku, na kterém se prvek nachází, a druhá je číslo sloupce.

    Podívejme se na příklady konkrétních matic a vytvořte je pomocí Javy.

    Matice A má rozměr 2 x 3 (2 řádky, 3 sloupce). Vytvořme dvourozměrné pole této dimenze:

    int maticeA; maticeA = new int ;

    Deklarovali jsme dvourozměrné pole celých čísel (protože matice v tomto případě obsahuje celá čísla) a vyhradili jsme mu paměť. K tomu jsme použili 2 indexy: první index definuje řádek a jeho velikost, druhý index definuje sloupec a jeho velikost.

    Pro přístup k prvkům dvourozměrného pole musíte použít 2 indexy: první pro řádek, druhý pro sloupec. Stejně jako u jednorozměrných polí začínají indexy také od nuly. Proto číslování řádků a sloupců v tabulce začíná od 0.

    MaticeA=1; matice A = -2; matice A = 3; matice A = 4; maticeA = 1; matice A = 7;

    Chcete-li zobrazit matici na konzole, musíte projít všechny prvky pomocí dvou smyček. Počet cyklů při průchodu prvky pole se rovná jeho rozměru. V našem případě se první cyklus provádí v řádcích, druhý - ve sloupcích.

    Pro (int i = 0; i< 2; i++) { for (int j = 0; j < 3; j++) { System.out.print(matrixA[i][j] + "\t"); } System.out.println(); }

    To znamená, že nejprve zobrazíme všechny prvky prvního řádku, oddělíme je tabulátorem "\t", přeneseme řádek a zobrazíme všechny prvky druhého řádku.

    Úplný kód pro matici A jak následuje:

    Public class Matrix ( public static void main(String args) ( int maticeA; maticeA = new int; maticeA = 1; maticeA = -2; maticeA = 3; maticeA = 4; maticeA = 1; maticeA = 7; for (int i = 0;i< 2; i++) { for (int j = 0; j < 3; j++) { System.out.print(matrixA[i][j] + "\t"); } System.out.println(); } } }

    Pro matrix B pojďme použít zjednodušený způsob inicializace- v době vyhlášení. Analogicky s jednorozměrnými poli.

    Int maticeB = ( (-9,1,0), (4,1,1), (-2,2,-1));

    Každý řádek pole musí být uzavřen ve složených závorkách a oddělen od sebe čárkou.

    Úplný kód pro matici B:

    Public class Matrix ( public static void main(String args) ( int matrixB = ( (-9,1,0), (4,1,1), (-2,2,-1) ); for (int i = 0 i< 3; i++) { for (int j = 0; j < 3; j++) { System.out.print(matrixB[i][j] + "\t"); } System.out.println(); } } }

    Zvážit inicializace smyčky pro dvourozměrné pole s použitím násobící tabulky jako příkladu.

    Veřejná třída Mult ( public static void main(String args) ( // vytvořit dvourozměrné pole 10 x 10 int multiplyTab = new int; // procházet první dimenzi pro (int i = 0; i< 10; i++) { // цикл по второй размерности for (int j = 0; j < 10; j++) { //инициализация элементов массива multiplyTab[i][j] = (i+1)*(j+1); //вывод элементов массива System.out.print(multiplyTab[i][j] + "\t"); } System.out.println(); } } }

    Zde je inicializace prvků s hodnotami násobící tabulky kombinována s jejich výstupem do konzole v jednom cyklu.

    Vícerozměrná a asymetrická pole.

    Podobným způsobem se v Javě vytvářejí vícerozměrná pole. Počet hranatých závorek označuje rozměr.
    Příklady vytváření polí s pevnou délkou:

    Int a = new int;// dvourozměrné pole int b = new int;// trojrozměrné pole int c = nové int;// čtyřrozměrné pole // atd.

    Není však nutné zpočátku zadávat velikost na všech úrovních, velikost můžete zadat pouze na první úrovni.

    int a1 = new int;// dvourozměrné pole s 5 řádky

    V tomto případě, i když není známo, kolik prvků bude v každém řádku, to lze určit později, navíc pole může obsahovat různý počet prvků v každém řádku, tj. asymetrické. Pojďme určit počet prvků v každém řádku pro pole a1

    A1 = new int ; a1 = new int ; a1 = new int ; a1 = new int ; a1 = new int ;

    V důsledku toho, když se zobrazí na obrazovce,

    For(int i = 0; i

    pole bude vypadat takto:

    0
    0 0
    0 0 0
    0 0 0 0
    0 0 0 0 0

    Když je pole vytvořeno, jeho prvky jsou automaticky inicializovány na nulu, takže v tomto příkladu jsou zobrazeny nuly.

    Cvičení na vícerozměrných polích v Javě:

    1. Vytvořte pole 5 x 6 a vyplňte ho náhodnými čísly (v rozsahu od 0 do 99). Vytiskněte třetí řádek do konzoly
    2. Dané matice C a D o rozměrech 3 x 3 a vyplněné náhodnými čísly v rozsahu od 0 do 99. Proveďte samostatně nejprve sčítání, poté násobení matic na sobě. Odešlete původní matice a výsledek výpočtů do konzole.
    3. Sečtěte všechny prvky dvourozměrného pole.
    4. Je dáno dvourozměrné pole obsahující záporná a kladná čísla. Zobrazte čísla těch buněk pole, které obsahují záporná čísla.
    5. Seřaďte prvky v řádcích dvourozměrného pole ve vzestupném pořadí

    Co je pole?

    Pole v Javě je kolekce prvků stejného typu, ke kterým lze přistupovat pomocí indexu.

    Prvky polí v Javě jsou umístěny jeden po druhém v paměti počítače. Níže je uveden příklad pole v Javě.

    Deklarace pole v Javě

    Pojďme deklarovat pole pro uložení prvků typu int:

    Zde je deklarována proměnná arr, což je pole. Chcete-li tuto proměnnou použít, musíte ji definovat.

    Definice pole v Javě

    Chcete-li definovat pole v Javě, musíte zadat jeho délku, tzn. počet prvků, které do něj lze uložit:

    Naše pole bude obsahovat 5 prvků.

    Pole je sbírka prvků. Ke každému prvku v poli lze přistupovat pomocí jeho čísla. Číslo se nazývá index. Prvky pole jsou v Javě číslovány od nuly.

    Jak načíst prvky do pole?

    Přiřaďme hodnotu prvnímu prvku pole a první prvek má index nula:

    Přiřaďme hodnotu druhému prvku pole a druhý prvek má index jedna:

    for(int hostinec = 0; hostinec< 5; inn++)
    {
    arr = hostinec;
    }

    Při deklaraci pole do něj můžete okamžitě načíst hodnoty:

    int arr = (0, 1, 2, 3, 4);

    počet prvků je zde 5, tzn. není třeba uvádět počet prvků, bude určen automaticky.

    Jak získat prvky z pole?

    Ke každému prvku v poli lze přistupovat pomocí jeho čísla. Chcete-li získat prvek pole, musíte zadat název pole a index prvku:

    toto je první prvek pole, protože první prvek má index nula.

    Přiřaďme hodnotu třetího prvku pole proměnné int a:

    Projdeme všechny prvky pole (projdeme polem):

    For(int hostinec = 0; hostinec< 5; inn++) { System.out.println("arr[" + inn + "] = " + arr); }

    Zjednodušená verze smyčky pro výstup pole je následující:

    For(int inn: arr) ( System.out.println("arr[" + inn + "] = " + arr); )

    Jak odstranit pole v Javě?

    Pole v Javě můžete odstranit takto:

    Jak získat délku pole v Javě?

    Dostaneme délku pole v Javě takto:

    int arrLength = délka arr;

    Jak získat první prvek pole v Javě?

    int firstelem = arr;

    Jak získat polovinu posledního prvku pole v Javě?

    int lastElem = arr;

    Jak nastavit pole proměnné délky v Javě?

    Jak nastavit pole proměnné délky v Javě? V žádném případě. Když definujete pole, pak nastavíte jeho délku, nemůžete ji později změnit. V takových případech se používají kolekce, například: Vector, ArrayList atd.

    Délka pole tedy nemůže být proměnná. Ale můžete použít proměnnou při definování pole. Pokud ano:

    int cd;
    int ab = new int;//Chyba.

    pak dostaneme chybu, délka pole nemůže být proměnná.

    Musíte nastavit hodnotu cd:

    int cd = 10;
    int ab = nový int;

    Už je to v pořádku. Pokud se po definování pole změní proměnná cd, pak to nebude mít vliv na pole, tzn. jeho délka se nezmění. Příklad:

    int cd = 10; int ab = nový int; cd = 12;// To je možné arrLength = ab.length; System.out.println("délka pole ab = " + arrLength); //Výstupy: délka pole ab = 10 ab=4;// A zde je chyba

    Dostaneme chybu:

    Výjimka ve vláknu "main" java.lang.ArrayIndexOutOfBoundsException: 11

    Maximální index našeho pole je 9. Změna hodnoty proměnné cd nemá vliv na pole, protože je již definováno a jeho délka je konstantní.

    Proměnné lze použít pro přístup k prvkům pole:

    int var = 1;
    int elem = arr;
    var = 2;
    elem = arr;

    Pole znaků v Javě

    Příklad pole znaků v Javě a jeho výstup:

    Char charArr = ("S", "B", "P"); for(int hostinec = 0; hostinec< charArr.length; inn++) { System.out.println("charArr[" + inn + "] = " + charArr); }

    Jak naplnit pole v Javě?

    Pole lze vyplnit pomocí metody statické výplně.

    Pole je kolekce proměnných stejného typu, na které se odkazuje společným názvem. Pole lze vytvářet z prvků libovolného typu a mohou mít jeden nebo více rozměrů. Ke konkrétnímu prvku v poli se přistupuje pomocí jeho indexu (čísla). V této poznámce se podíváme na zpracování jednorozměrných a dvourozměrných polí.

    Jednorozměrná pole v Javě

    Jednorozměrné pole je v podstatě seznam proměnných stejného typu. Chcete-li vytvořit pole, musíte nejprve vytvořit proměnnou pole požadovaného typu. Obecný formát pro deklaraci jednorozměrného pole je:
    zadejte var-name ;
    Zde type deklaruje základní typ pole; var-name je název proměnné pole. Základní typ definuje datový typ každého prvku pole. Například deklarace jednorozměrného pole komponent int s názvem month_days je:
    int měsíc_dny;
    Ačkoli tato deklarace uvádí, že měsíc_dny je proměnná pole, žádné pole ve skutečnosti neexistuje. Ve skutečnosti je month_days nastaven na hodnotu null (nulový ukazatel), což představuje pole bez hodnoty. Chcete-li přiřadit měsíc_dny ke skutečnému fyzickému poli celých čísel, přidělte mu paměť pomocí operátoru new a přiřaďte jej poli měsíc_dny; nová je speciální operace, která přiděluje paměť.

    Obecný formát pro nové při použití na jednorozměrná pole je:
    pole-var = nový typ ;
    kde typ je typ dat, která mají být distribuována, velikost je počet prvků v poli, pole-var je proměnná přidružená k poli. Chcete-li použít new k alokaci paměti pro pole, musíte zadat typ a počet prvků v poli. Prvky v poli přiřazené nové operaci budou automaticky inicializovány na nulu. Následující příklad alokuje paměť pro 12prvkové pole celých čísel a přidruží ji k proměnné month_days.
    měsíc_dny = new int;
    Po provedení této instrukce bude měsíc_dny odkazovat na pole dvanácti celých čísel. Poté budou všechny prvky v poli inicializovány na nulu.
    Proces získávání pole zahrnuje dva kroky. Nejprve musíte deklarovat proměnnou pole požadovaného typu. Za druhé, musíte alokovat paměť, která bude obsahovat pole, pomocí nové operace a přiřadit ji proměnné pole. Tedy v Jáva všechna pole jsou dynamicky alokována.

    Jakmile alokujete paměť pro pole, můžete přistupovat ke konkrétnímu prvku v něm zadáním indexu v hranatých závorkách. Číslování prvků pole začíná od nuly. Názvy polí jsou reference.

    Přímo v deklaraci je možné kombinovat deklaraci proměnné typu pole s alokací paměti do pole:
    int měsíc_dny = nový int;

    Zvažte kód programu, který nahrazuje záporné prvky pole maximálním prvkem:

    Veřejná třída FindReplace ( public static void main(String args) ( int myArray; // deklarace bez inicializace int mySecond = new int; /* alokace paměti inicializována s výchozími hodnotami */ int a = (5, 10, 0, - 5 , 16, -2); // deklarace s inicializací int max = a; for (int i = 0; i< a.length; i++) { if (a[i]<0) a[i] = max; mySecond[i] = a[i]; System.out.println("a[" + i + "]=" + a[i]); } myArray = a; // установка ссылки на массив a } }

    V důsledku provedení se zobrazí:

    >java FindReplace a=5 a=10 a=0 a=5 a=16 a=5

    Přiřazení mySecond[i] = a[i] způsobí, že některým prvkům pole mySecond, konkrétně šesti, budou přiřazeny hodnoty prvků pole a . Zbývající prvky mySecond si zachovají hodnoty získané během inicializace, tedy nuly. Pokud je přiřazení uspořádáno ve tvaru mySecond = a nebo myArray = a , pak obě pole účastnící se přiřazení obdrží odkaz na pole a , to znamená, že každé bude obsahovat šest prvků a bude odkazovat na stejnou oblast paměti.
    Pole mohou být inicializována v době, kdy jsou deklarována. Postup je v podstatě stejný jako při inicializaci jednoduchých typů. Inicializátor pole je čárkami oddělený seznam výrazů ohraničených složenými závorkami. Pole bude automaticky vytvořeno dostatečně velké, aby obsahovalo tolik prvků, kolik definujete v inicializátoru pole. Není potřeba používat nového operátora. Chcete-li například uložit počet dní v každém měsíci, následující kód vytvoří inicializované pole celých čísel:

    Public class MonthDays ( public static void main(String args) ( int month_days = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); System.out.println("April obsahuje " + měsíc_dny + " dny."); ) )

    V důsledku spuštění programu se na obrazovce zobrazí následující:

    Duben obsahuje 30 dní.

    Komentář: Jáva provádí přísné kontroly, aby se ujistil, že se neúmyslně nepokusíte uložit nebo přečíst hodnoty mimo úložnou oblast pole. Výkonný systém Jáva také pečlivě kontroluje, zda jsou všechny indexy pole ve správném rozsahu. (V tomto ohledu Jáva výrazně odlišné od jazyků C/C++, které neposkytují kontrolu limitů za běhu).

    Vícerozměrná pole v Javě

    V Java multidimenzionální pole jsou ve skutečnosti pole polí. Vypadají a chovají se jako běžná vícerozměrná pole. Existuje však několik jemných rozdílů. Chcete-li deklarovat proměnnou vícerozměrného pole, definujte každý další index pomocí jiné sady hranatých závorek. Například následující příkaz deklaruje proměnnou dvourozměrného pole s názvem twoD:
    int twoD = new int;
    Alokuje paměť pro pole 4x5 a přiřadí ji proměnné twoD. Interně je tato matice implementována jako pole polí celých čísel typu int.
    Vícerozměrná pole lze inicializovat. Chcete-li to provést, jednoduše zahrňte inicializátor každé dimenze do vlastní sady složených závorek.
    Následující program vytvoří a inicializuje pole polí stejné délky (matice) a vynásobí jednu matici druhou:

    Veřejná třída Matrix ( private int a; Matrix(int ​​​​n, int m) ( // vytvoření a naplnění náhodným a = new int[n][m]; for (int i = 0; i< n; ++i) for (int j = 0; j < m; ++j) a[i][j] = (int) (Math.random()*5); show(); } public Matrix(int n, int m, int k) { // создание и заполнение с random a = new int[n][m]; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) a[i][j] = k; if (k != 0) show(); } public void show() { System.out.println("Матрица:" + a.length + " на " + a.length); for (int i = 0; i < a.length; ++i) { for (int j = 0; j < a.length; ++j) System.out.print(a[i][j] + " "); System.out.println(); } } public static void main(String args) { int n = 2, m = 3, z = 4; Matrix p = new Matrix(n, m); Matrix q = new Matrix(m, z); Matrix r = new Matrix(n, z, 0); for (int i = 0; i < p.a.length; ++i) for (int j = 0; j < q.a.length; ++j) for (int k = 0; k < p.a[i].length; ++k) r.a[i][j] += p.a[i][k]*q.a[k][j]; System.out.println("Произведение матриц: "); r.show(); } }

    Protože se hodnoty přiřazují prvkům pole pomocí metody random(), jedna z možností spuštění kódu může být následující:

    > javac Matrix.java > java Matrix Matrix:2 podle 3 3 2 0 3 3 1 Matrix:3 podle 4 1 2 2 3 3 2 3 2 1 2 3 2 Matrix Product: Matrix:2 podle 4 9 10 12 13 13 14 18 17

    Následující příklad ukazuje kopírování pole:

    Public class ArrayCopyDemo ( public static void main(String args) ( int mas1 = (1,2,3), mas2 = (4,5,6,7,8,9); System.out.print("mas1: " ); show(mas1); System.out.print("mas2: "); show(mas2); // zkopírování pole mas1 do mas2 System.arraycopy(mas1, 0, mas2, 2, 3); /* 0 - mas1 se zkopíruje počínaje prvkem nula * 2 - prvek, od kterého začíná nahrazování * 3 - počet prvků, které se mají zkopírovat */ System.out.println("\n after arraycopy(): "); System.out. print("mas1: " ); show(mas1); System.out.print("\nmas2: "); show(mas2); ) soukromý statický void show(int mas) ( for (int i = 0; i< mas.length; ++i) System.out.print(" " + mas[i]); } }

    Výsledek spuštění programu:

    > javac ArrayCopyDemo.java > java ArrayCopyDemo mas1: 1 2 3mas2: 4 5 6 7 8 9 after arraycopy(): mas1: 1 2 3 mas2: 4 5 1 2 3 9

    Alternativní syntaxe deklarace pole

    Existuje další formulář, který lze použít k deklaraci pole:
    zadejte var-name;
    Zde hranaté závorky následují za specifikátorem typu, nikoli za názvem proměnné pole. Například následující dvě prohlášení jsou ekvivalentní:

    Int al = nový int; int a2 = nový int;
    Zde uvedená prohlášení jsou také ekvivalentní:
    char twodi = nový char; char twod2 = nový znak;
    Tento alternativní formulář prohlášení je zahrnut především pro usnadnění.