Nápady.  Zajímavý.  Veřejné stravování.  Výroba.  Řízení.  Zemědělství

Otázky k Java rozhovoru. Průvodce pro budoucí vývojáře Java. Rozhovor a kariéra. Rozdíly mezi rozhraními a abstraktními třídami

  • Co je OOP?
  • Co je to předmět?
  • Jaké jsou základní principy OOP?
  • Co je to dědictví?
  • Co je to polymorfismus? Jaké znáte projevy polymorfismu na Javě?
  • Co je to zapouzdření?
  • Co je to abstrakce?
  • Jaké jsou výhody objektově orientovaných programovacích jazyků?
  • Jak použití objektově orientovaného přístupu zlepšuje vývoj softwaru?
  • Existuje výraz „je“ a „má“. Co znamenají z hlediska principů OOP? Jaký je rozdíl mezi složením a agregací?
  • Co myslíte polymorfismem, zapouzdřením a dynamickou vazbou?

  • Jaký je rozdíl mezi JRE, JVM a JDK?
  • Popište modifikátory přístupu v Javě.
  • Co je přístup na úrovni balíčku.
  • Jak se abstraktní třída liší od rozhraní? V jakých případech byste použili abstraktní třídu a v jakých případech byste použili rozhraní?
  • Může objekt přistupovat k proměnné soukromé třídy? Pokud ano, tak jak?
  • Proč jsou v Javě statické bloky?
  • Je možné přetížit statickou metodu?
  • Řekněte nám o interních třídách. Kdy je použijete?
  • Jaký je rozdíl mezi proměnnou instance a statickou proměnnou? Uveďte příklad.
  • Uveďte příklad, kdy můžete použít statickou metodu?
  • Řekněte nám o třídách zavaděče a dynamickém načítání tříd.
  • Jaký je výraz „asset“ používaný v Javě?
  • Proč některá rozhraní vůbec nedefinují metody?
  • Jaký je hlavní rozdíl mezi String, StringBuffer, StringBuilder?
  • Vysvětlete o Java I/O streamech.
  • Co je paměť haldy a zásobníku v Javě?
  • Jaký je rozdíl mezi pamětí Stack a Heap v Javě?
  • Řekněte nám o paměťovém modelu v Javě?
  • Jak funguje sběrač odpadu?
  • Řekněte nám o typovém odlévání. Co je snížení a propagace typu? Kdy získáte výjimku ClassCastException?
  • Co je statická třída, jaké jsou vlastnosti jejího použití?
  • Jak získat přístup k poli vnější třídy z vnořené třídy.
  • Jaké typy vnořených tříd existují? K čemu slouží?
  • Je možné změnit při přepisování metody:
  • Modifikátor přístupu
  • Návratový typ
  • Typ nebo množství argumentu
  • Název argumentu
  • Mám změnit objednávku, množství nebo úplně odstranit sekci hodů?
  • Co je to autobox?
  • Co jsou to generika?
  • Jaký je skutečný účel použití generických typů v Javě?
  • Jak jsou proměnné předávány metodám, podle hodnoty nebo odkazu?
  • Jaké metody má třída Object?
  • Pravidla pro přepsání metody Object.equals().
  • Pokud chcete přepsat equals(), jaké podmínky musí být splněny pro přepsanou metodu?
  • Jaký je vztah mezi hashCode a equals?
  • Jak jsou ve třídě Object implementovány metody hashCode a equals?
  • Co se stane, když přepíšete rovná se, aniž byste přepsali hashCode? Jaké problémy mohou nastat?
  • Existují nějaká doporučení, jaká pole by se měla použít při výpočtu hashCode?
  • K čemu je metoda hashCode()?
  • Pravidla pro přepsání metody Object.hashCode().
  • Řekněte nám o klonování objektů. Jaký je rozdíl mezi mělkým a hlubokým klonováním?
  • Pravidla pro přepsání metody Object.clone().
  • Kde a jak můžete použít soukromý konstruktor?
  • Jaký je výchozí konstruktor?
  • Popište metodu Object.finalize().
  • Jaký je rozdíl mezi final, final a finalizovat?
  • Popište hierarchii výjimek.
  • Jaké typy výjimek v Javě znáte, jak se liší?
  • Co je zaškrtnutá a nezaškrtnutá výjimka?
  • Jak vytvořit vlastní nezaškrtnutou výjimku?
  • Jaké jsou výjimky Unchecke?
  • Co je chyba?
  • Popište činnost bloku try-catch-finally.
  • Je možné použít blok try-finally (bez záchytu)?
  • Je vždy proveden konečný blok?
  • Jaké jsou vlastnosti třídy String? co dělá metoda inter()?
  • Je možné zdědit typ řetězce, proč?
  • Proč je String populární klíč v HashMap v Javě?
  • Definujte pojem zřetězení řetězců.
  • Jak obrátit řetězec?
  • Jak porovnat hodnotu dvou řetězců?
  • Jak oříznout mezery na začátku a na konci řádku?
  • Definujte pojem „pool řetězců“.
  • Je možné synchronizovat přístup k řádkům?
  • Jak správně porovnat hodnoty řetězců dvou různých objektů typu String a StringBuffer?
  • Proč je řetězec neměnný a dokončený v Javě?
  • Napište metodu pro odstranění daného znaku z řetězce.
  • Co je odraz?
  • Co se stane s garbage collectorem (GC), pokud během metody finalize() nějakého objektu dojde k výjimce?
  • Co je internacionalizace, lokalizace?
  • Co jsou anotace v Javě?
  • Jaké funkce plní anotace?
  • Jaké vestavěné anotace v Javě znáte?
  • Co dělají anotace @Retention, @Documented, @Target a @Inherited?
  • Co dělají anotace @Override, @Deprecated, @SafeVarargs a @SuppressWarnings?
  • Jaký životní cyklus anotace lze určit pomocí @Retention?
  • Na jaké prvky lze anotaci použít a jak to mohu označit?
  • Jak vytvořit vlastní anotaci?
  • Jaké typy atributů jsou v anotacích povoleny?
  • Co je JMX?
  • Jaké výhody nabízí JMX?
  • Co jiného umí JMX kromě dálkového ovládání?
  • Co je MBean?
  • Jaké typy MBeanů existují?
  • Co je MBean Server?
  • Jaké mechanismy zajišťují zabezpečení technologie Java?
  • Jmenujte několik typů kontrol, které ověřovač bajtového kódu Java provádí?
  • Co víte o „správci zabezpečení“ v Javě?
  • Co je JAAS?
  • Co je Refaktoring?

  • Co je sbírka?
  • Vyjmenujte hlavní rozhraní kolekcí a jejich implementace.
  • Jak se ArrayList liší od LinkedList? V jakých případech je lepší použít první a v jakých případech druhý?
  • Jak se HashMap liší od Hashtable?
  • Jaký je rozdíl mezi ArrayList a Vector?
  • Jak se porovnávají sbírkové prvky?
  • Uspořádejte následující rozhraní do hierarchie: List, Set, Map, SortedSet, SortedMap, Collection, Iterable, Iterator, NavigableSet, NavigableMap.
  • Proč není mapa kolekce, zatímco seznam a sada jsou kolekce?
  • Definujte pojem „iterátor“.
  • Co víte o rozhraní Iterable?
  • Jak převést HashSet na ArrayList v jednom řádku?
  • Jak převést ArrayList na HashSet v jednom řádku?
  • Jak iterovat přes všechny klíče mapy, když mapa není iterovatelná?
  • Jak iterovat přes všechny hodnoty mapy vzhledem k tomu, že mapa není iterovatelná?
  • Jak iterovat přes všechny páry klíč–hodnota v mapě za předpokladu, že mapa není iterovatelná?
  • Jak je SortedMap „tříděna“ kromě skutečnosti, že toString() zobrazuje vše v pořádku?
  • Jak zkopírovat prvky z libovolné kolekce do pole jedním voláním?
  • Implementujte symetrický rozdíl dvou kolekcí pomocí metod kolekce (addAll(), removeAll(), keepAll()).
  • Porovnejte Enumeration a Iterator.
  • Jak spolu souvisí Iterable a Iterator?
  • Jak spolu souvisí Iterable, Iterator a „for-each“ představené v Javě 5?
  • Porovnejte Iterator a ListIterator.
  • Co se stane, když zavolám Iterator.next(), aniž bych se „zeptal“ Iterator.hasNext()?
  • Co se stane, když zavolám Iterator.next() předtím, než zavolám Iterator.hasNext() 10krát? Chybí mi 9 prvků?
  • Pokud mám kolekci a podřízený iterátor, změní se kolekce, když zavolám iterator.remove()?
  • Pokud mám kolekci a podřízený iterátor, změní se iterátor, když zavolám collection.remove(..)?
  • Proč přidali ArrayList, když už existuje Vector?
  • Implementace třídy ArrayList má následující pole: Object elementData, int size. Vysvětlete, proč ukládat velikost odděleně, když můžete vždy vzít elementData.length?
  • Je LinkedList jednoduše propojený seznam, dvojitě propojený seznam nebo čtyř propojený seznam?
  • Jaká je nejhorší doba běhu metody include() pro prvek, který je v LinkedList (O(1), O(log(N)), O(N), O(N*log(N)), O( N*N))?
  • Jaká je nejhorší doba běhu metody include() pro prvek, který je v ArrayList (O(1), O(log(N)), O(N), O(N*log(N)), O (N*N))?
  • Jaká je nejhorší doba běhu metody add() na LinkedList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N)) ?
  • Jaká je nejhorší doba běhu metody add() pro ArrayList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N)) ?
  • Kolik prvků je alokováno v paměti při volání ArrayList.add()?
  • Kolik prvků je alokováno v paměti při volání LinkedList.add()?
  • Odhadnout množství paměti pro uložení jednoho bajtového primitiva v LinkedList?
  • Odhadnout množství paměti pro uložení jednoho bajtového primitiva v ArrayList?
  • Doprostřed seznamu přidám prvek: list.add(list.size()/2, newElem). Pro koho je tato operace pomalejší - pro ArrayList nebo pro LinkedList?
  • Jak iterovat prvky LinkedList v opačném pořadí bez použití pomalého get (index)?
  • Jak získat Seznam se všemi prvky kromě prvních a posledních 3 jedním voláním ze Seznamu?
  • Mohou mít různé objekty v paměti (ref0 != ref1) ref0.hashCode() == ref1.hashCode()?
  • Mohou mít různé objekty v paměti (ref0 != ref1) ref0.equals(ref1) == true?
  • Mohou mít různé odkazy na stejný objekt v paměti (ref0 == ref1) ref0.equals(ref1) == false?
  • Existuje třída Point(int x, y;). Proč je hash kód 31 * x + y vhodnější než x + y?
  • Pokud má třída Point(int x, y;) "správnou" implementaci metody rovná se (return ref0.x == ref1.x && ref0.y == ref1.y), ale udělejte hash kód ve tvaru int hashCode() ( return x;), pak budou takové body správně umístěny a načteny z HashSet?
  • equals() generuje vztah ekvivalence. Jaké vlastnosti má tento vztah: komutativnost, symetrie, reflexivita, distributivita, asociativita, tranzitivita?
  • Je možné takto implementovat equals(Object that) (vrátit this.hashCode() == that.hashCode())?
  • equals vyžaduje kontrolu, že argument (equals(Object that)) je stejného typu jako samotný objekt. Jaký je rozdíl mezi this.getClass() == that.getClass() a tím instanceof MyClass?
  • Je možné implementovat metodu equals třídy MyClass takto: class MyClass (public boolean equals(MyClass that) (return this == that;))?
  • Bude HashMap fungovat, pokud všechny klíče vrátí int hashCode() (návrat 42;)?
  • Proč přidali HashMap, když už tam byl Hashtable?
  • Podle Knutha a Cormena existují dvě hlavní implementace hashovacích tabulek: založené na otevřeném adresování a založené na řetězení. Jak je HashMap implementován? Proč to udělali (podle vás)? Jaké jsou výhody a nevýhody jednotlivých přístupů?
  • Kolik kliknutí na odkaz nastane, když provedete HashMap.get(key) na klíči, který je v tabulce?
  • Kolik nových objektů se vytvoří, když přidáte nový prvek do HashMap?
  • Jak funguje HashMap, když se do ní pokusíte uložit dva prvky pomocí klíčů se stejným hashCode, ale pro který se rovná == false?
  • HashMap se může zvrhnout na seznam i pro klíče s různými hashCodes. Jak je tohle možné?
  • Jaká je nejhorší doba běhu metody get(key) pro klíč, který není v tabulce (O(1), O(log(N)), O(N), O(N*log(N)) , O(N*N))?
  • Jaká je nejhorší doba běhu metody get(key) pro klíč, který je v tabulce (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
  • Vysvětlete význam parametrů v konstruktoru HashMap(int initialCapacity, float loadFactor).
  • Jaký je rozdíl mezi HashMap a IdentityHashMap? K čemu je IdentityHashMap? Jak může být užitečný pro implementaci serializace nebo klonování?
  • Jaký je rozdíl mezi HashMap a WeakHashMap? K čemu je WeakHashMap?
  • WeakHashMap používá WeakReferences. Proč nevytvořit SoftHashMap na SoftReferences?
  • WeakHashMap používá WeakReferences. Proč nevytvořit PhantomHashMap na PhantomReferences?
  • Vytvořte HashSet z HashMap (použijte pouze sadu klíčů, nikoli sadu hodnot).
  • Vytvořte HashMap z HashSet (HashSet >).
  • Porovnejte rozhraní java.util.Queue a java.util.Deque.
  • Kdo koho rozšiřuje: Queue rozšiřuje Deque nebo Deque rozšiřuje frontu?
  • Proč LinkedList implementuje List i Deque?
  • Jaký je rozdíl mezi třídami java.util.Arrays a java.lang.reflect.Array?
  • Jaký je rozdíl mezi třídami java.util.Collection a java.util.Collections?
  • Napište MULTIvláknový program, který způsobí, že kolekce vyvolá výjimku ConcurrentModificationException.
  • Co je to "fail-fail behavior"?
  • Existuje speciální třída java.util.EnumSet pro sady výčtů? Proč? Proč se autoři nespokojili s HashSet nebo TreeSet?
  • java.util.Stack – považován za „zastaralý“. Čím se doporučuje nahradit? Proč?
  • Která kolekce implementuje servisní disciplínu FIFO?
  • Která kolekce implementuje servisní disciplínu FILO?
  • Uveďte příklad, když jakákoli kolekce vyvolá výjimku UnsupportedOperationException.
  • Proč nemohu napsat "ArrayList" čísla = nový ArrayList ();“, ale můžete „Seznam čísla = nový ArrayList ();"?
  • LinkedHashMap – co je to za „zvíře“? Co je LinkedList a co je HashMap?
  • LinkedHashSet – co je to za „zvíře“? Co je LinkedList a co je HashSet?
  • Říkají, že na LinkedHashMap je snadné vytvořit jednoduchou mezipaměť s „zásadou zneplatnění“, víte jak?
  • Co vám PriorityQueue umožňuje?
  • Jaké jsou rozdíly mezi java.util.Comparator a java.lang.Comparable?

  • Co je to symbolický odkaz?
  • Jaký je rozdíl mezi I/O a NIO?
  • Jaké vlastnosti NIO znáte?
  • Jaké typy I/O toků existují?
  • Pojmenujte hlavní třídy I/O toků.
  • Jaký je rozdíl a co mají společného OutputStream, InputStream, Writer, Reader?
  • Jaké podtřídy základní třídy InputStream znáte a co dělají?
  • Co víte o RandomAccessFile?
  • Jaké režimy přístupu k souborům má RandomAccessFile?
  • Jaké podtřídy základní třídy OutputStream znáte a co dělají?
  • K čemu se používá PushbackInputStream?
  • K čemu se SequenceInputStream používá?
  • Jaké podtřídy základní třídy Reader znáte a k čemu slouží?
  • Jaké podtřídy základní třídy Writer znáte a co dělají?
  • Co je absolutní cesta a relativní cesta?
  • Jaké balíčky obsahují třídy vláken?
  • Co víte o supertřídách?
  • Která přídavná třída vám umožňuje číst data ze vstupního byte streamu ve formátu primitivních datových typů?
  • Jaká třída doplňků vám umožňuje urychlit čtení/zápis pomocí vyrovnávací paměti?
  • Jaké třídy vám umožňují převádět bajtové proudy na znakové proudy a naopak?
  • Jaký je rozdíl mezi třídou PrintWriter a PrintStream?
  • Která třída je navržena pro práci s prvky systému souborů?
  • Jaký znak je oddělovač při zadávání cesty v systému souborů?
  • Jaké metody třídy File znáte?
  • Co víte o rozhraní FileFilter?
  • Jaké třídy umožňují archivovat objekty?

  • Na jakém objektu dojde k synchronizaci při volání statické synchronizované metody?
  • K čemu se používá klíčové slovo těkavý, synchronizovaný, přechodný, nativní?
  • Co znamená priorita vlákna?
  • Co jsou vlákna démonů v Javě?
  • Co to znamená uspat flow?
  • V jakých stavech může vlákno v Javě existovat? Jak vlastně funguje flow?
  • Jaký je rozdíl mezi těmito dvěma rozhraními pro implementaci úloh Runnable a Callable?
  • Rozdíly mezi CyclicBarrier a CountDownLatch?
  • Co je to závodní podmínka?
  • Jak zastavit vlákno?
  • Co se stane, když vlákno vyvolá výjimku?
  • Co je proměnná ThreadLocal?
  • Co je FutureTask?
  • Rozdíl mezi interrupted a isInterrupted?
  • Proč jsou metody čekání a upozornění volány v synchronizovaném bloku?
  • Co je fond vláken?
  • Rozdíly mezi livelockem a deadlockem?
  • Jak zkontrolovat, zda vlákno drží zámek?
  • Jak získat výpis vlákna?
  • Jaký parametr JVM se používá k řízení velikosti zásobníku vlákna?
  • Rozdíly mezi synchronizovaným a ReentrantLockem?
  • Co je Semafor?
  • Co se stane, když je fronta fondu vláken již plná a odešlete úlohu?
  • Rozdíly mezi metodami submit() a execute() ve fondu vláken?
  • Co je metoda blokování?
  • Co je ReadWriteLock?
  • Co je Singletonovo dvojité zamykání?
  • Co je to rámec Fork/Join?
  • Přestěhoval jsem se do jiného města, získávám práci, chodím na pohovory. Zdálo se mi, že tam položené otázky, i když dobře známé, přesto spojené dohromady, vám mohou pomoci připravit se a cítit se jistější.

    Otázky, které vám pomohou pochopit principy budování DBMS.
    1. Co je první normální forma a proces normalizace? Jaké jsou normální formy?
    2. Co znamená index DBMS, jak jsou strukturovány, jak jsou uloženy? Jak byste implementovali stejnou funkcionalitu? Poslední otázka je položena, pokud není jasné pochopení indexů.
    3. Nakreslete vztah Many-to-Many. Například: Tabulky Autoři a Knihy. Jeden autor může mít několik knih a knihu může napsat několik autorů. Napište SQL dotaz pro výběr knih od konkrétního autora.

    Základní otázky o Javě.
    4. Základní třída v Javě, jak víte, je Object. Jaké metody můžete vyjmenovat?
    5. Řekněte nám, co je to rovno a hashCode? Jaká pravidla a konvence existují pro implementaci těchto metod? Kdy se používají?
    6. Vysvětlete metody wait, notify, notifyAll. Jak se používají, kdy, proč jsou potřeba? Co je synchronizováno?
    7. Co je finalizovat? Proč je to potřeba? Co nám můžete říci o garbage collectoru a jeho algoritmech?
    8. Proč je metoda klonování prohlášena za chráněnou? Co je potřeba k implementaci klonování?
    9. Jaké modifikátory existují (přístup a další)? Co jsou těkavé a přechodné? K čemu a v jakých případech lze default použít?

    Java Collection Framework
    10. Jaká jsou sběrná rozhraní v Javě? Vysvětlete, jak se liší.
    11. Jaké znáte implementace těchto rozhraní?
    12. Jak se od sebe liší ArrayList a LinkedList? Jak se staví? V jakých případech by měly být použity?
    13. Jaký je rozdíl mezi HashMap a TreeMap? Jak jsou strukturované a fungují? Jak je to s dobou přístupu k objektům, jaké jsou závislosti?
    14. Co je Hashtable, jak se liší od HashMapu? Dnes je zastaralá, jak můžete stále používat požadovanou funkcionalitu?

    Výjimky
    15. Co je to výjimka? Jaké typy výjimek znáte a jak se liší?
    16. Možná problém s bloky try-catch-finally a otázka, co bude vráceno nebo jaká výjimka bude nakonec vynechána?

    Algoritmy
    17. Jaké znáte třídicí algoritmy? Jaké druhy algoritmů znáte?
    Navíc jsou zde možné různé doplňující otázky týkající se posouzení složitosti algoritmů a jejich vzájemného srovnání.

    Designové vzory.
    18. Znáte nějaké designové vzory?
    19. Napište Singleton... A s líným načítáním. Co když to musí být bezpečné pro vlákna? A v jakých případech je líné načítání horší?
    20. Co můžete říci o MVC? Nakreslete diagram a vysvětlete, jak MVC funguje.

    Řada otázek, které vám pomohou porozumět technologickému zásobníku J2EE.
    21. Jaký je servlet, jsp, jejich rozdíl?
    22. Co je Ajax? Jak tato technologie v zásadě funguje?
    23. Co je ORM, jak jej přeložit a jak by měl fungovat?

    Jednoduché úlohy pro zápis algoritmů.
    24. Napište funkci pro výpočet faktoriálu.
    25. Je dána funkce pro výpočet Fibonacciho čísel, ví se, že funguje. Najděte logický omyl. Odhadněte složitost výsledného algoritmu.
    26. Obraťte čáru.
    27. Vypočítejte průměr pole.

    Je užitečné si uvědomit, že pokud se necítíte příliš sebevědomě, není třeba říkat zbytečná slova. Řeknete další slovo a oni se ho přidrží a rozmotají řetěz. Propagují něco, čím si nejsou moc jisti. Tuto schopnost lidí - lpět - je třeba využít, ale s užitkem pro sebe ;-)

    Znalosti a porozumění... věci jsou docela jiné, takže
    - různé algoritmy, například třídění, stojí za to si napsat sami, i z učebnice. Podívejte se, jak se od sebe liší, porovnejte jejich složitost.
    - je užitečné podívat se na různé utility a knihovny, principy seskupování tříd do balíčků a styl psaní kódu a komentování. To může být velmi užitečné pro pochopení modifikátorů přístupu a organizace projektu.
    - pochopením něčeho konkrétního můžete pomoci těm, kteří vědí méně. Přejděte na jakékoli fórum a pokuste se odpovědět na otázky k tématu, které vás zajímá. Z diskuze si můžete odnést něco pro sebe. Můžete napsat krátký článek. Samozřejmě je potřeba danému tématu dobře rozumět.
    Jakákoli práce zaměřená na zlepšení vlastní kvalifikace bude viditelná pro kompetentního tazatele a nezůstane bez povšimnutí. Jediná věc je, že je třeba o tom mluvit upřímně, neměli byste podceňovat své možnosti a schopnosti.
    Chcete-li mít nějaké vodítko pro přípravu nebo rozvoj sebe jako specialisty, můžete se podívat na něco podobného.

    Ve skutečnosti jsou výše uvedené otázky úrovní Junior Developer, jak si ji představuji. Někde možná hlouběji, někde míň, ale jako fakt - Junior.

    Každé řešení vytváří nové problémy

    Shromáždili jsme 10 záludných příkladů programů, které zobrazují jakékoli informace. Měli byste se podívat na kód a říct, co program vypíše. Je možné, že se program ani nezkompiluje. V tomto případě musíte určit, co bude kompilátor vypisovat.

    Lidé se při pohovorech rádi ptají na podobné otázky, takže je dobré si oprášit své znalosti programovacího jazyka Java. Odpovědi budou skryty ve spoilerech – co program nebo kompilátor vypíše. Zkuste se sami zamyslet, než se podíváte na správnou odpověď.

    Balíček com.instanceofjava; public class B ( B b = new B(); public int show())( return (true ? null: 0); ) public static void main(String args) ( B b = new B(); b.show( ) ;))

    • Pokaždé, když vytvoříme objekt jakékoli třídy, je nejprve zavolán konstruktor a paměť je přidělena všem nestatickým proměnným.
    • Zde B b = new B(); objektu třídy B je přiřazen nový objekt stejné třídy.
    • Napište B b = new B(); vede k rekurzivnímu provádění konstruktoru, který vytváří nekonečné objekty. To je důvod, proč bude v "hlavním" vláknu při spuštění tohoto kódu vyvolána výjimka java.lang.StackOverFlowError.
    • Běžnou příčinou těchto druhů výjimek je špatná rekurze. K tomu obvykle dochází v důsledku neplatné podmínky ukončení.

    Co bude výstupem následujícího programu?

    balíček com.instanceofjava; public class A( public static void show())( System.out.println("Statická metoda volána"); ) public static void main(String args) ( A obj = null; obj.show(); ) )
    • Můžeme volat statické metody pomocí proměnné odkazující na null . Jde o to, že statické metody jsou na úrovni třídy. To je důvod, proč můžeme volat statické funkce jak pomocí samotné třídy, tak pomocí proměnné rovné null.

    Co bude výstupem následujícího programu?

    balíček com.instanceofjava; public class A( static int a = 1111; static ( a = a-- - --a; ) ( a = a++ + ++a; ) public static void main(String args) ( System.out.println(a) ;))

    Co bude výstupem následujícího programu?

    balíček com.instanceofjava; public class A( int GetValue() ( return (true ? null: 0); ) public static void main(String args) ( A obj = new A(); obj.GetValue(); ) )

    Co bude výstupem následujícího programu?

    balíček com.instanceofjava; public class A( public static void main(String args) ( Integer i1 = 128; Integer i2 = 128; System.out.println(i1 == i2); Integer i3 = 127; Integer i4 = 127; System.out.println (i3 == i4); ))

    Co bude výstupem následujícího programu?

    balíček com.instanceofjava; třída A ( void metoda(int i) ( ) ) třída B rozšiřuje A ( @Override void metoda(Integer i) ( ) )
    • Který řádek programu způsobí chybu kompilace?
    balíček com.instanceofjava; třída A ( public static void main(String args) ( Integer i = new Integer(null); String s = new String(null); ) )

    Co bude výstupem následujícího programu?

    balíček com.instanceofjava; třída A ( public static void main(String args) ( Řetězec s = "JEDEN"+3+2+"DVA"+"TŘI"+5+4+"ČTYŘI"+"PĚT"+5; System.out.println (s); ))

    Co bude výstupem následujícího programu?

    balíček com.instanceofjava; třída A ( static int metoda1(int i) ( return method2(i *= 11); ) static int method2(int i) ( return method3(i /= 11); ) static int method3(int i) ( return method4( i -= 11); ) static int metoda4(int i) ( return i += 11; ) public static void main(String args) ( System.out.println(method1(11)); ) )

    Co bude výstupem následujícího programu?

    balíček com.instanceofjava; třída A ( public static void main(String args) ( System.out.println(null); ) )

    Co se stane, když napíšete System.out.println(null); ?

    Samozřejmě dojde k chybě při kompilaci. Metoda println má několik variant. Může přijmout řetězec, objekt nebo znak. Při předávání nulového argumentu této funkci se kompilátor nemůže rozhodnout, kterou ze tří metod zavolat.

    Přetížené metody:

    • public void printltln(String str) (
    • public void printltln(char ch) (
    • public void printltln(Object ch) (

    Pro kompilátor je volání System.out.println(null) nejednoznačné, protože dvě metody mohou být víceméně vhodné pro výstup null ‘a: println(String) a println(char) . Kompilátor ale neví, kterou konkrétní metodu volat. Aby byla kompilace úspěšná, měli byste napsat:

    • System.out.println((String)null);
    • System.out.println((char)null);
    • System.out.println((Object)null);

    Tady je ale potřeba být opatrný. Call System.out.println((char)null); bude mít za následek výjimku za běhu.

    Pro ty, kdo slyší slovo Java Core poprvé, to jsou základní základy jazyka. S těmito znalostmi můžete klidně vyrazit na stáž/stáž. Tyto otázky vám pomohou osvěžit si znalosti před pohovorem nebo se pro sebe naučit něco nového. Pro získání praktických dovedností studujte na.

      Jak vytvořit neměnný objekt v Javě? Uveďte všechny výhody

      Neměnná třída je třída, jejíž stav nelze po vytvoření změnit. Zde je stav objektu v podstatě považován za hodnoty uložené v instanci třídy, ať už jde o primitivní typy nebo referenční typy.

      Aby byla třída neměnná, musí být splněny následující podmínky:

      1. Neposkytujte nastavovače nebo metody, které upravují pole nebo objekty odkazující na pole. Setři znamenají změnu stavu objektu, čemuž se zde chceme vyhnout.
      2. Všechna pole nastavte jako konečná a soukromá. Pole označená jako soukromá nebudou přístupná mimo třídu a jejich označení jako konečná zajistí, že je nezměníte ani náhodou.
      3. Nedovolte podtřídám přepsat metody. Nejjednodušší způsob, jak to udělat, je prohlásit třídu za konečnou. Dokončené třídy v Javě nelze přepsat.
      4. Vždy si pamatujte, že instance vašich proměnných mohou být proměnlivé nebo neměnné. Definujte je a vraťte nové objekty se zkopírovaným obsahem pro všechny měnitelné objekty (typy odkazů). Neměnné proměnné (primitivní typy) lze bezpečně vrátit bez dalšího úsilí.

      Také si musíte pamatovat následné výhody neměnných tříd. Možná je budete potřebovat na pohovoru. Neměnné třídy:

      • snadné navrhování, testování a používání
      • automaticky vlákno bezpečné a nemá žádné problémy se synchronizací
      • nevyžadují kopírovací konstruktor
      • vám umožní líně inicializovat hashcode a uložit vrácenou hodnotu do mezipaměti
      • při použití jako pole nevyžadují zabezpečené kopírování
      • udělat dobré mapové klíče a prvky sady (tyto objekty by neměly měnit stav, když jsou v kolekci)
      • udělejte svou třídu trvalou tím, že ji jednou vytvoříte, a není třeba ji znovu kontrolovat
      • mít vždy „atomičnost selhání“ (termín vytvořený Joshuou Blochem): pokud neměnný objekt vyvolá výjimku, nikdy nezůstane v nechtěném nebo nedefinovaném stavu.

      Podívejte se na příklad napsaný v tomto příspěvku.

      Specifikace Java uvádí, že vše v Javě je předáváno hodnotou. V Javě nic takového jako „pass by reference“ neexistuje. Tyto podmínky jsou spojeny s voláním metod a předáváním proměnných jako parametrů metody. Dobře, primitivní typy jsou vždy předávány hodnotou bez jakéhokoli zmatku. Koncept by však měl být jasný v kontextu parametru metody komplexních typů.


      Ve výše uvedeném příkladu jsou bity adresy první instance zkopírovány jinou referenční proměnnou, což způsobí, že obě reference ukazují na stejné paměťové místo, kde je objekt uložen. Pamatujte, že přiřazením hodnoty null druhému odkazu nepřiřadíte hodnotu null prvnímu odkazu. Ale změna stavu objektu s jednou odkazující proměnnou se projeví v jiném odkazu.

      K čemu slouží konečně blok? Zaručuje tento blok provedení svého kódu? Kdy se konečně blok nevolá?

      Blok Konečně se volá vždy, pokud existuje blok try. Tím je zajištěno, že se zavolá konečný blok, i když dojde k neočekávané výjimce. Ale nakonec je užitečnější než jen zpracování výjimek – tento blok vám umožňuje vyčistit kód, který byl náhodně vynechán pomocí návratu, pokračování nebo přerušení. Umístění čistícího kódu do závěrečného bloku je vždy dobrým zvykem, i když se neočekávají žádné výjimky.

      Pokud se virtuální počítač ukončí během provádění bloku try nebo catch, pak se blok konečně neprovede. Podobně, pokud vlákno provádí blok try nebo catch a je přerušeno nebo zabito, konečný blok nebude proveden, i když aplikace pokračuje v běhu.

      Proč existují dvě třídy Date, jedna v balíčku java.util a druhá v java.sql?

      java.util.Date představuje datum a čas, zatímco java.sql.Date představuje pouze datum. Komplementární k java.sql.Date je třída java.sql.Time, která představuje pouze čas.

      Třída java.sql.Date je podtřídou (rozšířením) třídy java.util.Date. Co se tedy změnilo v java.sql.Date:

      • toString() vytváří jinou reprezentaci řetězce: yyyy-mm-dd
      • statická metoda valueOf(String) vytvoří datum z řetězce s výše uvedenou reprezentací
      • getter a setters pro hodiny, minuty a sekundy jsou vyloučeny

      Třída java.sql.Date se používá v JDBC a je navržena tak, aby neměla žádnou časovou složku, což znamená, že hodiny, minuty, sekundy a milisekundy musí být nula... ale pro třídu to není vyžadováno.

      Vysvětlete rozhraní značek.

      Vzor rozhraní-tokenu je návrhový vzor v počítačové vědě používaný programovacími jazyky, které poskytovat informace o objektech za běhu. Tento poskytuje způsob, jak přidružit metadata třídy tam, kde jazyk nemá explicitní podporu pro taková metadata. V Javě se k tomu používají rozhraní bez určení metod.

      Dobrým příkladem rozhraní tokenu v Javě je rozhraní Serializable. Třída implementuje toto rozhraní, aby naznačila, že její nepřechodná data mohou být zapsána do bajtového proudu nebo do systému souborů.

      Hlavní problém Rozhraní markeru je, že rozhraní definuje konvenci pro třídy, které jej implementují, a tato konvence je zděděna všemi podtřídami. To znamená, že nebudete moci token „deimplementovat“. Pokud ve výše uvedeném příkladu vytvoříte podtřídu, kterou nechcete serializovat (možná proto, že je v přechodném stavu), musíte se uchýlit k explicitnímu vyvolání NotSerializableException.

      Proč je metoda main() deklarována jako veřejná statická neplatnost?

      Proč veřejné? Hlavní metoda má modifikátor veřejného přístupu, takže k ní může přistupovat kdekoli a pro jakýkoli objekt, který chce tuto metodu použít ke spuštění aplikace. Teď neříkám, že JDK/JRE mají podobný důvod, protože java.exe nebo javaw.exe (pro windows) používají ke spuštění metody volání Java Native Interface (JNI), takže ji mohou volat tak jako tak, bez ohledu na modifikátor přístupu.

      Proč statické? Předpokládejme, že naše hlavní metoda není statická. Nyní k volání jakékoli metody potřebujete instanci třídy. Že jo? Java umožňuje přetížené konstruktory, to všichni víme. Který z nich by se pak měl použít a odkud budou pocházet parametry přetíženého konstruktoru?

      Proč prázdno? Návratová hodnota ve virtuálním počítači, který ve skutečnosti volá tuto metodu, není k ničemu. Jediná věc, kterou bude aplikace chtít volajícímu procesu sdělit, je, zda byl ukončen normálně nebo nenormálně. To je již možné pomocí System.exit(int) . Nenulová hodnota znamená abnormální dokončení, jinak je vše v pořádku.

      Jaký je rozdíl mezi vytvořením řetězce jako new() a vytvořením literálu (pomocí dvojitých uvozovek)?

      Když vytvoříme řetězec pomocí new(), vytvoří se v haldě a také se přidá do fondu řetězců, zatímco řetězec vytvořený pomocí literálu se vytvoří pouze ve fondu řetězců.

      Chcete-li odpovědět na tuto nebo podobné otázky, budete se muset blíže seznámit s konceptem sdružování řetězců. Moje rada je opravdu se naučit třídu String a fond řetězců.

      Jak funguje metoda substring() třídy String?

      Stejně jako ostatní programovací jazyky jsou řetězce v Javě posloupností znaků. Tato třída je spíše obslužnou třídou pro práci s touto sekvencí. Posloupnost znaků poskytuje následující proměnná:

      /** Hodnota se používá pro ukládání znaků. */ /** Hodnota se používá k ukládání znaků */ privátní konečná hodnota znaku; Následující proměnné se používají pro přístup k tomuto poli v různých scénářích /** Posun je první index použitého úložiště. */ /** Offset je první index používaného úložiště. */ soukromý konečný int offset; /** Počet je počet znaků v řetězci. */ /** Počet je počet znaků v řádku. */ soukromý konečný počet int;

      Pokaždé, když vytvoříme podřetězec z existující instance řetězce, metoda substring() pouze nastaví nové hodnoty pro proměnné offset a count. Vnitřní pole znaků se nemění. Toto je možný zdroj úniku paměti, pokud je metoda substring() použita neopatrně:

      Původní hodnota se nezmění. Pokud tedy vytvoříte řetězec dlouhý 10 000 znaků a vytvoříte 100 podřetězců s 5 až 10 znaky, všech 101 objektů bude obsahovat stejné pole znaků dlouhé 10 000 znaků. To je nepochybně plýtvání pamětí.

      Tomu se lze vyhnout změnou kódu takto:

      nahradit original.substring(beginIndex) novým String(original.substring(beginIndex)) , kde original je původní řetězec.

      Vysvětlete fungování HashMap. Jak se řeší problém duplikátů?

      Většina z vás bude pravděpodobně souhlasit s tím, že HashMap je v dnešní době nejoblíbenější téma pro rozhovory. Pokud mě někdo požádá, abych vám řekl „Jak funguje HashMap?“, odpovím jednoduše: „Na principu hashování“. Jak je to jednoduché.

      Hašování je tedy v podstatě způsob, jak přiřadit jedinečný kód jakékoli proměnné/objektu po aplikaci jakéhokoli vzorce/algoritmu na její vlastnosti.

      Definice mapy zní: „Objekt, který spojuje klíče s hodnotami“. Velmi jednoduché, že? HashMap tedy obsahuje svou vlastní vnitřní třídu Entry, která vypadá takto:

      statická třída Entry implementuje Map . Vstup(konečný klíč K; hodnota V; další položka; závěrečná int hash; …//Další kód je zde )

      Když se někdo pokusí vložit pár klíč–hodnota do HashMap, stane se následující:

      • Nejprve se zkontroluje klíčový objekt na null . Pokud je klíč null, hodnota se uloží na pozici tabulky. Protože hashcode pro null je vždy 0.
      • Dalším krokem je výpočet hodnoty hash voláním metody hashCode() klíčové proměnné. Tento hash se používá k výpočtu indexu do pole pro uložení objektu Entry. Vývojáři JDK si byli dobře vědomi toho, že metoda hashCode() může být špatně napsaná a může vrátit velmi velkou nebo velmi malou hodnotu. Aby tento problém vyřešili, zavedli další metodu hash() a předali hashcode objektu této metodě, aby přetypovala tuto hodnotu do rozsahu velikosti indexu pole.
      • Nyní je zavolána metoda indexFor(hash, table.length) pro výpočet přesné pozice pro uložení objektu Entry.
      • Nyní hlavní část. Jak víme, dva různé objekty mohou mít stejnou hodnotu hashcode, jak by byly dva různé objekty uloženy na stejném místě v archivu [nazývaném koš]?

      Odpověď je LinkedList. Pokud si pamatujete, třída Entry má vlastnost „next“. Tato vlastnost vždy ukazuje na další objekt v řetězci. Toto chování je velmi podobné LinkedList.

      Takže v případě shody hashcode jsou objekty Entry uloženy ve formě LinkedList. Když je třeba umístit objekt Entry do určitého indexu, HashMap zkontroluje, zda v tomto umístění neexistuje jiný objekt Entry? Pokud tam není žádný záznam, náš objekt bude uložen na toto místo.

      Pokud se v našem indexu již nachází jiný objekt, zkontroluje se jeho další pole. Pokud je null, náš objekt se stane dalším uzlem v LinkedList. Pokud next není null , tento postup se opakuje, dokud není nalezeno další pole, které je null.

      Co se stane, když přidáme další klíčovou hodnotu rovnou té, kterou jsme přidali dříve? Je logické, že by měl nahradit starou hodnotu. Jak se to stane? Po určení pozičního indexu pro objekt Entry, iterováním přes LinkedList umístěný v našem indexu, HashMap zavolá metodu equals() pro hodnotu klíče pro každý objekt Entry. Všechny tyto objekty Entry v LinkedList mají stejnou hodnotu hashcode, ale metoda equals() bude kontrolovat skutečnou rovnost. Pokud klíč. rovná se (k) bude skutečný, pak budou oba vnímány jako stejný objekt. To způsobí pouze nahrazení objektu value v objektu Entry.

      Tímto způsobem HashMap zajišťuje, že klíče jsou jedinečné.

      Rozdíly mezi rozhraními a abstraktními třídami?

      Toto je velmi častá otázka, pokud děláte pohovor pro programátora na nižší úrovni. Nejvýznamnější rozdíly jsou uvedeny níže:

      • V rozhraních Java jsou proměnné a priori konečné. Abstraktní třídy mohou obsahovat nefinální proměnné.
      • Rozhraní v Javě absolutně nemůže mít implementaci. Abstraktní třída může mít instance metod, které implementují základní chování.
      • Komponenty rozhraní musí být veřejné. Abstraktní třída může mít modifikátory přístupu, aby vyhovovaly každému vkusu.
      • Rozhraní musí být implementováno pomocí klíčového slova implements. Abstraktní třída musí být rozšířena o klíčové slovo rozšiřuje.
      • V Javě může třída implementovat mnoho rozhraní, ale může dědit pouze z jedné abstraktní třídy.
      • Rozhraní je zcela abstraktní a nemůže mít instance. Abstraktní třída také nemůže mít instance třídy, ale může být volána, pokud existuje metoda main().
      • Abstraktní třída je o něco rychlejší než rozhraní, protože rozhraní očekává vyhledávání před voláním jakékoli přepsané metody v Javě. Ve většině případů se jedná o nepatrný rozdíl, ale pokud píšete časově kritickou aplikaci, musíte tuto skutečnost vzít v úvahu.
    1. Kdy přepíšete metody hashCode() a equals()?

      Metody hashCode() a equals() jsou definovány ve třídě Object, která je rodičovskou třídou všech objektů Java. Z tohoto důvodu všechny objekty Java dědí základní implementaci těchto metod.

      Metoda hashCode() se používá k získání jedinečné celočíselné hodnoty pro daný objekt. Tato hodnota se používá k určení umístění bucketu, když je třeba objekt uložit do datové struktury, jako je HashTable. Ve výchozím nastavení vrací metoda hashCode() celočíselnou reprezentaci adresy paměti, kde je objekt uložen.

      Metoda equals(), jak název napovídá, se používá k provádění jednoduché ekvivalence objektů. Základní implementací metody je kontrola referencí dvou objektů, zda jsou ekvivalentní.

      Všimněte si, že je obvykle nutné přepsat metodu hashCode() vždy, když je přepsána metoda equals(). To je nezbytné pro podporu obecné konvence metody hashCode, která říká, že stejné objekty musí mít stejné hashcodes.

      Metoda equals() musí určit rovnost mezi vztahy (musí být opakující se, symetrická a tranzitivní). Navíc musí být perzistentní (pokud se objekt nezměnil, metoda musí vrátit stejnou hodnotu). Také by se mělo vždy vrátit o.equals(null). Nepravdivé.

      hashCode() musí být také perzistentní (pokud nebyl objekt upraven podmínkami metody equals(), musí nadále vracet stejnou hodnotu.

      Vztah mezi těmito dvěma metodami je: vždy pokud a.equals(b), pak a.hashCode() musí být stejný jako b.hashCode() .

    Hodně štěstí ve studiu!! Autor článku Lokeš Gupta Původní článek Odkazy na další díly:

    Pro ty, kdo slyší slovo Java Core poprvé, to jsou základní základy jazyka. S těmito znalostmi můžete klidně vyrazit na stáž/stáž. Tyto otázky vám pomohou osvěžit si znalosti před pohovorem nebo se pro sebe naučit něco nového. Chcete-li získat praktické dovednosti, studujte na JavaRush.

      Jak vytvořit neměnný objekt v Javě? Uveďte všechny výhody

      Neměnná třída je třída, jejíž stav nelze po vytvoření změnit. Zde je stav objektu v podstatě považován za hodnoty uložené v instanci třídy, ať už jde o primitivní typy nebo referenční typy.

      Aby byla třída neměnná, musí být splněny následující podmínky:

      1. Neposkytujte nastavovače nebo metody, které upravují pole nebo objekty odkazující na pole. Setři znamenají změnu stavu objektu, čemuž se zde chceme vyhnout.
      2. Všechna pole nastavte jako konečná a soukromá. Pole označená jako soukromá nebudou přístupná mimo třídu a jejich označení jako konečná zajistí, že je nezměníte ani náhodou.
      3. Nedovolte podtřídám přepsat metody. Nejjednodušší způsob, jak to udělat, je prohlásit třídu za konečnou. Dokončené třídy v Javě nelze přepsat.
      4. Vždy si pamatujte, že instance vašich proměnných mohou být proměnlivé nebo neměnné. Definujte je a vraťte nové objekty se zkopírovaným obsahem pro všechny měnitelné objekty (typy odkazů). Neměnné proměnné (primitivní typy) lze bezpečně vrátit bez dalšího úsilí.

      Také si musíte pamatovat následné výhody neměnných tříd. Možná je budete potřebovat na pohovoru. Neměnné třídy:

      • snadné navrhování, testování a používání
      • automaticky vlákno bezpečné a nemá žádné problémy se synchronizací
      • nevyžadují kopírovací konstruktor
      • vám umožní líně inicializovat hashcode a uložit vrácenou hodnotu do mezipaměti
      • při použití jako pole nevyžadují zabezpečené kopírování
      • udělat dobré mapové klíče a prvky sady (tyto objekty by neměly měnit stav, když jsou v kolekci)
      • udělejte svou třídu trvalou tím, že ji jednou vytvoříte, a není třeba ji znovu kontrolovat
      • mít vždy „atomičnost selhání“ (termín vytvořený Joshuou Blochem): pokud neměnný objekt vyvolá výjimku, nikdy nezůstane v nechtěném nebo nedefinovaném stavu.

      Podívejte se na příklad napsaný v tomto příspěvku.

      Specifikace Java uvádí, že vše v Javě je předáváno hodnotou. V Javě nic takového jako „pass by reference“ neexistuje. Tyto podmínky jsou spojeny s voláním metod a předáváním proměnných jako parametrů metody. Dobře, primitivní typy jsou vždy předávány hodnotou bez jakéhokoli zmatku. Koncept by však měl být jasný v kontextu parametru metody komplexních typů.


      Ve výše uvedeném příkladu jsou bity adresy první instance zkopírovány jinou referenční proměnnou, což způsobí, že obě reference ukazují na stejné paměťové místo, kde je objekt uložen. Pamatujte, že přiřazením hodnoty null druhému odkazu nepřiřadíte hodnotu null prvnímu odkazu. Ale změna stavu objektu s jednou odkazující proměnnou se projeví v jiném odkazu.

      K čemu slouží konečně blok? Zaručuje tento blok provedení svého kódu? Kdy se konečně blok nevolá?

      Blok Konečně se volá vždy, pokud existuje blok try. Tím je zajištěno, že se zavolá konečný blok, i když dojde k neočekávané výjimce. Ale nakonec je užitečnější než jen zpracování výjimek – tento blok vám umožňuje vyčistit kód, který byl náhodně vynechán pomocí návratu, pokračování nebo přerušení. Umístění čistícího kódu do závěrečného bloku je vždy dobrým zvykem, i když se neočekávají žádné výjimky.

      Pokud se virtuální počítač ukončí během provádění bloku try nebo catch, pak se blok konečně neprovede. Podobně, pokud vlákno provádí blok try nebo catch a je přerušeno nebo zabito, konečný blok nebude proveden, i když aplikace pokračuje v běhu.

      Proč existují dvě třídy Date, jedna v balíčku java.util a druhá v java.sql?

      java.util.Date představuje datum a čas, zatímco java.sql.Date představuje pouze datum. Komplementární k java.sql.Date je třída java.sql.Time, která představuje pouze čas.

      Třída java.sql.Date je podtřídou (rozšířením) třídy java.util.Date. Co se tedy změnilo v java.sql.Date:

      • toString() vytváří jinou reprezentaci řetězce: yyyy-mm-dd
      • statická metoda valueOf(String) vytvoří datum z řetězce s výše uvedenou reprezentací
      • getter a setters pro hodiny, minuty a sekundy jsou vyloučeny

      Třída java.sql.Date se používá v JDBC a je navržena tak, aby neměla žádnou časovou složku, což znamená, že hodiny, minuty, sekundy a milisekundy musí být nula... ale pro třídu to není vyžadováno.

      Vysvětlete rozhraní značek.

      Vzor rozhraní-tokenu je návrhový vzor v počítačové vědě používaný programovacími jazyky, které poskytovat informace o objektech za běhu. Tento poskytuje způsob, jak přidružit metadata třídy tam, kde jazyk nemá explicitní podporu pro taková metadata. V Javě se k tomu používají rozhraní bez určení metod.

      Dobrým příkladem rozhraní tokenu v Javě je rozhraní Serializable. Třída implementuje toto rozhraní, aby naznačila, že její nepřechodná data mohou být zapsána do bajtového proudu nebo do systému souborů.

      Hlavní problém Rozhraní markeru je, že rozhraní definuje konvenci pro třídy, které jej implementují, a tato konvence je zděděna všemi podtřídami. To znamená, že nebudete moci token „deimplementovat“. Pokud ve výše uvedeném příkladu vytvoříte podtřídu, kterou nechcete serializovat (možná proto, že je v přechodném stavu), musíte se uchýlit k explicitnímu vyvolání NotSerializableException.

      Proč je metoda main() deklarována jako veřejná statická neplatnost?

      Proč veřejné? Hlavní metoda má modifikátor veřejného přístupu, takže k ní může přistupovat kdekoli a pro jakýkoli objekt, který chce tuto metodu použít ke spuštění aplikace. Teď neříkám, že JDK/JRE mají podobný důvod, protože java.exe nebo javaw.exe (pro windows) používají ke spuštění metody volání Java Native Interface (JNI), takže ji mohou volat tak jako tak, bez ohledu na modifikátor přístupu.

      Proč statické? Předpokládejme, že naše hlavní metoda není statická. Nyní k volání jakékoli metody potřebujete instanci třídy. Že jo? Java umožňuje přetížené konstruktory, to všichni víme. Který z nich by se pak měl použít a odkud budou pocházet parametry přetíženého konstruktoru?

      Proč prázdno? Návratová hodnota ve virtuálním počítači, který ve skutečnosti volá tuto metodu, není k ničemu. Jediná věc, kterou bude aplikace chtít volajícímu procesu sdělit, je, zda byl ukončen normálně nebo nenormálně. To je již možné pomocí System.exit(int) . Nenulová hodnota znamená abnormální dokončení, jinak je vše v pořádku.

      Jaký je rozdíl mezi vytvořením řetězce jako new() a vytvořením literálu (pomocí dvojitých uvozovek)?

      Když vytvoříme řetězec pomocí new(), vytvoří se v haldě a také se přidá do fondu řetězců, zatímco řetězec vytvořený pomocí literálu se vytvoří pouze ve fondu řetězců.

      Chcete-li odpovědět na tuto nebo podobné otázky, budete se muset blíže seznámit s konceptem sdružování řetězců. Moje rada je opravdu se naučit třídu String a fond řetězců.

      Jak funguje metoda substring() třídy String?

      Stejně jako ostatní programovací jazyky jsou řetězce v Javě posloupností znaků. Tato třída je spíše obslužnou třídou pro práci s touto sekvencí. Posloupnost znaků poskytuje následující proměnná:

      /** Hodnota se používá pro ukládání znaků. */ /** Hodnota se používá k ukládání znaků */ privátní konečná hodnota znaku; Následující proměnné se používají pro přístup k tomuto poli v různých scénářích /** Posun je první index použitého úložiště. */ /** Offset je první index používaného úložiště. */ soukromý konečný int offset; /** Počet je počet znaků v řetězci. */ /** Počet je počet znaků v řádku. */ soukromý konečný počet int;

      Pokaždé, když vytvoříme podřetězec z existující instance řetězce, metoda substring() pouze nastaví nové hodnoty pro proměnné offset a count. Vnitřní pole znaků se nemění. Toto je možný zdroj úniku paměti, pokud je metoda substring() použita neopatrně:

      Původní hodnota se nezmění. Pokud tedy vytvoříte řetězec dlouhý 10 000 znaků a vytvoříte 100 podřetězců s 5 až 10 znaky, všech 101 objektů bude obsahovat stejné pole znaků dlouhé 10 000 znaků. To je nepochybně plýtvání pamětí.

      Tomu se lze vyhnout změnou kódu takto:

      nahradit original.substring(beginIndex) novým String(original.substring(beginIndex)) , kde original je původní řetězec.

      Vysvětlete fungování HashMap. Jak se řeší problém duplikátů?

      Většina z vás bude pravděpodobně souhlasit s tím, že HashMap je v dnešní době nejoblíbenější téma pro rozhovory. Pokud mě někdo požádá, abych vám řekl „Jak funguje HashMap?“, odpovím jednoduše: „Na principu hashování“. Jak je to jednoduché.

      Hašování je tedy v podstatě způsob, jak přiřadit jedinečný kód jakékoli proměnné/objektu po aplikaci jakéhokoli vzorce/algoritmu na její vlastnosti.

      Definice mapy zní: „Objekt, který spojuje klíče s hodnotami“. Velmi jednoduché, že? HashMap tedy obsahuje svou vlastní vnitřní třídu Entry, která vypadá takto:

      statická třída Entry implementuje Map . Vstup(konečný klíč K; hodnota V; další položka; závěrečná int hash; …//Další kód je zde )

      Když se někdo pokusí vložit pár klíč–hodnota do HashMap, stane se následující:

      • Nejprve se zkontroluje klíčový objekt na null . Pokud je klíč null, hodnota se uloží na pozici tabulky. Protože hashcode pro null je vždy 0.
      • Dalším krokem je výpočet hodnoty hash voláním metody hashCode() klíčové proměnné. Tento hash se používá k výpočtu indexu do pole pro uložení objektu Entry. Vývojáři JDK si byli dobře vědomi toho, že metoda hashCode() může být špatně napsaná a může vrátit velmi velkou nebo velmi malou hodnotu. Aby tento problém vyřešili, zavedli další metodu hash() a předali hashcode objektu této metodě, aby přetypovala tuto hodnotu do rozsahu velikosti indexu pole.
      • Nyní je zavolána metoda indexFor(hash, table.length) pro výpočet přesné pozice pro uložení objektu Entry.
      • Nyní hlavní část. Jak víme, dva různé objekty mohou mít stejnou hodnotu hashcode, jak by byly dva různé objekty uloženy na stejném místě v archivu [nazývaném koš]?

      Odpověď je LinkedList. Pokud si pamatujete, třída Entry má vlastnost „next“. Tato vlastnost vždy ukazuje na další objekt v řetězci. Toto chování je velmi podobné LinkedList.

      Takže v případě shody hashcode jsou objekty Entry uloženy ve formě LinkedList. Když je třeba umístit objekt Entry do určitého indexu, HashMap zkontroluje, zda v tomto umístění neexistuje jiný objekt Entry? Pokud tam není žádný záznam, náš objekt bude uložen na toto místo.

      Pokud se v našem indexu již nachází jiný objekt, zkontroluje se jeho další pole. Pokud je null, náš objekt se stane dalším uzlem v LinkedList. Pokud next není null , tento postup se opakuje, dokud není nalezeno další pole, které je null.

      Co se stane, když přidáme další klíčovou hodnotu rovnou té, kterou jsme přidali dříve? Je logické, že by měl nahradit starou hodnotu. Jak se to stane? Po určení pozičního indexu pro objekt Entry, iterováním přes LinkedList umístěný v našem indexu, HashMap zavolá metodu equals() pro hodnotu klíče pro každý objekt Entry. Všechny tyto objekty Entry v LinkedList mají stejnou hodnotu hashcode, ale metoda equals() bude kontrolovat skutečnou rovnost. Pokud klíč. rovná se (k) bude skutečný, pak budou oba vnímány jako stejný objekt. To způsobí pouze nahrazení objektu value v objektu Entry.

      Tímto způsobem HashMap zajišťuje, že klíče jsou jedinečné.

      Rozdíly mezi rozhraními a abstraktními třídami?

      Toto je velmi častá otázka, pokud děláte pohovor pro programátora na nižší úrovni. Nejvýznamnější rozdíly jsou uvedeny níže:

      • V rozhraních Java jsou proměnné a priori konečné. Abstraktní třídy mohou obsahovat nefinální proměnné.
      • Rozhraní v Javě absolutně nemůže mít implementaci. Abstraktní třída může mít instance metod, které implementují základní chování.
      • Komponenty rozhraní musí být veřejné. Abstraktní třída může mít modifikátory přístupu, aby vyhovovaly každému vkusu.
      • Rozhraní musí být implementováno pomocí klíčového slova implements. Abstraktní třída musí být rozšířena o klíčové slovo rozšiřuje.
      • V Javě může třída implementovat mnoho rozhraní, ale může dědit pouze z jedné abstraktní třídy.
      • Rozhraní je zcela abstraktní a nemůže mít instance. Abstraktní třída také nemůže mít instance třídy, ale může být volána, pokud existuje metoda main().
      • Abstraktní třída je o něco rychlejší než rozhraní, protože rozhraní očekává vyhledávání před voláním jakékoli přepsané metody v Javě. Ve většině případů se jedná o nepatrný rozdíl, ale pokud píšete časově kritickou aplikaci, musíte tuto skutečnost vzít v úvahu.
    1. Kdy přepíšete metody hashCode() a equals()?

      Metody hashCode() a equals() jsou definovány ve třídě Object, která je rodičovskou třídou všech objektů Java. Z tohoto důvodu všechny objekty Java dědí základní implementaci těchto metod.

      Metoda hashCode() se používá k získání jedinečné celočíselné hodnoty pro daný objekt. Tato hodnota se používá k určení umístění bucketu, když je třeba objekt uložit do datové struktury, jako je HashTable. Ve výchozím nastavení vrací metoda hashCode() celočíselnou reprezentaci adresy paměti, kde je objekt uložen.

      Metoda equals(), jak název napovídá, se používá k provádění jednoduché ekvivalence objektů. Základní implementací metody je kontrola referencí dvou objektů, zda jsou ekvivalentní.

      Všimněte si, že je obvykle nutné přepsat metodu hashCode() vždy, když je přepsána metoda equals(). To je nezbytné pro podporu obecné konvence metody hashCode, která říká, že stejné objekty musí mít stejné hashcodes.

      Metoda equals() musí určit rovnost mezi vztahy (musí být opakující se, symetrická a tranzitivní). Navíc musí být perzistentní (pokud se objekt nezměnil, metoda musí vrátit stejnou hodnotu). Také by se mělo vždy vrátit o.equals(null). Nepravdivé.

      hashCode() musí být také perzistentní (pokud nebyl objekt upraven podmínkami metody equals(), musí nadále vracet stejnou hodnotu.

      Vztah mezi těmito dvěma metodami je: vždy pokud a.equals(b), pak a.hashCode() musí být stejný jako b.hashCode() .

    Hodně štěstí ve studiu!! Autor článku Lokeš Gupta Původní článek Odkazy na další díly:
    Načítání...