Java pitanja za razgovor za posao — Java osnove, 56 pitanja (23.000 reči, 68 ručno crtanih slika), mora za one koji žele da pobrate intervjuer 👍

Uvod
23.000 reči, 68 ručno crtanih slika, detaljno objašnjenje 56 čestih pitanja za razgovor za posao iz Java osnova (da nema teških za pamćenje), ako naučite ova pitanja, ovaj ćete razbiti intervjuer, mislim da je sigurno (ručni pas). Organizovao: Chenmo Wang Er, pogledajte link za repostovanje, originalni autor: gost iz planete Sanfen e, pogledajte link originalnog teksta.
Svetla verzija je pogodnija za štampanje, što je i način koji mnogi studenti vole, štampanje za efikasnije pamćenje.

- decembra 2024. počeo je rad na drugoj verziji.
Za česta pitanja, biće označena pozicija u kojoj se pojavljuju u "Java vodič za razgovor (plaćeni)", koja kompanija, koje je originalno pitanje, i biće dodata zvezdica 🌟, tako da je sadržini jasno iz prvog pogleda; ako želite da uštedite vreme, možete prvo da naučite ova pitanja, da bite što pre spremni, sto bitaka bez poraza.
Razlikovanje između odgovora "za pamćenje" i "objašnjenje principa", da biste razumeli "zašto" i "kako", a isto tako bili efikasni u odgovorima na razgovoru.
Kombinovanje sa projektima (Tehničkifrakcija, pmhub) u organizaciji jezika, da bi intervjuer osetio vašu iskrenost, a ne mašinsko pamćenje.
Popravka problema iz prve verzije, uključujući povratne informacije prijatelja iz planete, komentare u odeljku za komentare na veb sajtu, kao i issue-e iz GitHub skladišta, da bi se ovaj vodič za razgovor učinio potpunijim.
Dodavanje some-ih offer-a koje su prijatelji iz Erge programerske planete dobili, zahvalnice za "Prevazilaženje na razgovoru", kao i priznanja za izmenu biografije, da bi se ohrabrilo sve, da bi se dalo više samopouzdanja.
Unapređenje izgleda, dodavanje ručno crtanih slika, reorganizacija odgovora, da bi bili govorniji, a samim tim bliži očekivanjima intervjuera.

Uključio sam Ergov "Java napredni put", "JVM napredni put", "napredni put konkurentnog programiranja", kao i sve verzije "Prevazilaženja na razgovoru", obuhvatajući 16 velikih tema: Java osnove, Java kolekcije, Java konkurentnost, JVM, Spring, MyBatis, računarske mreže, operativni sistemi, MySQL, Redis, RocketMQ, distribuirane sisteme, mikroservise, dizajn paterne, Linux itd., ukupno preko 400.000 reči, preko 2000 ručno crtanih slika, zaista punoiskrenosti.
Prikažimo mračnu PDF verziju, izgled je jasan, font elegantan, pogodniji za noćno čitanje, noću će biti udobnije.

Java pregled
1.🌟Šta je Java?

Java je objektno-orijentisani programski jezik, koji je 1995. godine predstavio tim James-a Gosling-a iz Sun-a. Usvojio je mnoge prednosti C++-a, ali je odbacio mesta u C++-u koja su sklona greškama, kao što su sakupljanje otpada i pokazivači.
Ujedno, Java je i programski jezik nezavisan od platforme, tj. jednokratno kompajliraj, svuda pokreći.
Samo treba da instalirate odgovarajući JDK na odgovarajućoj platformi, pa možete da ostvarite međuplatformsku pokretljivost, da se pokreće na Windows-u, macOS-u, Linux-u.
Kad si počeo da učiš Java?
Ja sam počeo da učim Java u drugom semestru prve godine, tada sam već završio C, ali sam mukao jer C nije imao dobar pravac primene, pa sam počeo da učim Java, jer sam saznao da ogromna veća internet kompanija, uključujući banke i državna preduzeća, koristi Java za bekend servise. Pored toga, Java ima veoma bogate materijale za učenje, a položaji i plati su idealni.
Dakle, sam paralelno učio i vežbao, prvo sam radio projekat razdvojenog fronta i beka Tehničkifrakcija, gde sam došao u kontakt sa Spring Boot-om, MyBatis-Plus-om, MySQL-om, Redis-om, ElasticSearch-om, MongoDB-om, Docker-om, RabbitMQ-om i drugim tehnološkim stekom.

Kasnije sam radio i mikroservis projekat pmhub, gde sam došao u kontakt sa Spring Cloud-om, Nacos-om, Sentinel-om, Seata-om, SkyWalking-om i srodnim tehnološkim stekom.

Koji programski jezik obično koristiš?
Prvo semestar prve godine sam prvo naučio C, drugo polugodište prve godine sam počeo da učim Java, između sam učio malo Python-a i JavaScript-a, ali uopšteni utisak je da ipak više volim Java.
Zato što može da radi mnogo stvari, može da se koristi za pisanje veb bekend servisa, a i može da se prave "točkovi" (biblioteke), na primer MYDB je jedan takav "točak", napravljen u Java-i, ne samo da mi je dublje razumeo MySQL indekse, transakcije, MVCC, već mi je dao i dublje razumevanje Java NIO-a, višenitnosti, JVM-a.

Kako obično učiš Java?
Na početku, uglavnom sam sledio školski program, a nakon što sam ušao u program, osetio da program više ne može da zadovolji moju želju za znanjem, pa sam počeo da tražim kvalitetne video resurse i otvorene bazu znanja na B-u i GitHub-u.
Na primer, "Java napredni put" mi se veoma dopada, od Java sintakse, nizova & stringova, OOP-a, kolekciona_framework-a, Java IO-a, obrade izuzetaka, mrežnog programiranja, NIO-a, konkurentnog programiranja, JVM-a itd., sve je detaljno objašnjeno, i ima mnogo ručno crtanih slika i primera koda, sam sam pratio i korak-po-korak realizovao, osećao sam veliku korist.
Kasnije sam još jednom čitao "Java misao o programiranju", "Efektivna Java", učitelja Zhou Zhiming-a "Duboko razumevanje Java virtuelne mašine", kao i neke izvorne kodove iz JDK-a, na primer String, HashMap, kao i znanje o bajtkodu.
Pa sam onda počeo da radim projekte vežbanja MYDB, Tehničkifrakcija, PmHub, pa sam potpuno vladao procesom razvoja Java projekata.
Kakve su razlike između Java-e i C-a?
Java je međuplatformski programski jezik koji instaliranjem odgovarajuće verzije JVM-a na različitim operativnim sistemima ostvaruje cilj "jednom kompajliraj, svuda pokreći". A C zahteva re kompajliranje na različitim operativnim sistemima.
Java ostvaruje automatsko upravljanje memorijom, dok C zahteva ručno upravljanje memorijom pomoću malloc i free.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora za praksu u Ctrip-u: od kada učiš Java
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora male kompanije, future of good times test development engineer prvo intervju: koji programski jezik obično koristiš
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora državnog preduzeća: kako obično učiš Java?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora TP-LINK-a: koji programski jezik obično koristiš
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Honor-a: koje jezike si koristio
2.Koje su karakteristike Java jezika?

Karakteristike Java jezika su:
①,Objektno-orijentisan, uglavnom enkapsulacija, nasleđivanje, polimorfizam.
②,Platformska nezavisnost, "jednom pišeš, svuda pokreće", tako da programi napisani u Java-i imaju dobru prenosivost.
③,Podrška za više niti. C++ nema ugrađeni mehanizam za više niti, mora da poziva API operativnog sistema da bi realizovao program sa više niti, dok Java nudi dobro enkapsuliranu podršku za više niti.
④,Podrška za JIT kompajliranje, tj. Just-In-Time kompajler, koji može za vreme izvođenja programa da pretvori bajtkod u-hot machine kod da bi poboljšao brzinu izvršavanja programa.
3.Koje su razlike između JVM-a, JDK-a i JRE-a?

JVM: odnosno Java virtuelna mašina, ključna za Java ostvarivanje međuplatformskosti, različiti operativni sistemi imaju različite JVM implementacije. JVM je odgovoran za pretvaranje Java bajtkoda u mašinski kod specifične platforme i izvršavanje.
JRE: odnosno Java Runtime Environment, sadrži biblioteke neophodne za izvršavanje Java programa, kao i JVM.
JDK: kompletan Java SDK, uključujeći JRE, kompajler javac, alat za generisanje Java dokumentacije javadoc, alat za Java bajtkod javap itd. Za programere pruža kompletnu okolinu za razvoj, kompajliranje i otklanjanje grešaka u Java programima.
Jednostavno rečeno, JDK sadrži JRE, JRE sadrži JVM.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Huawei-a: koje su razlike između JRE-a i JDK-a, šta JDK ima više, ako su instalirani i JRE i JDK, šta možeš da radiš sa JDK-om
4.Šta je međuplatformskost? Kakav je princip?
Tzv. međuplatformskost znači da programi napisani u Java-i mogu nakon jednokratne kompilacije da se izvršavaju na više operativnih sistema.
Princip je dodavanje međusloja JVM, koji je odgovoran za pretvaranje Java bajtkoda u mašinski kod specifične platforme i izvršavanje.
5.Šta je bajtkod? Koje su prednosti korišćenja bajtkoda?
Tzv. bajtkod je .class fajl koji se dobije nakon kompajliranja Java programa.
Java program od izvornog koda do izvršavanja prolazi kroz tri koraka:
- Kompilacija: kompajliranje izvornog fajla .java u bajtkod fajl .class koji JVM može da prepozna
- Interpretacija: JVM izvršava bajtkod fajl, prevodeći bajtkod u mašinski kod koji operativni sistem može da prepozna
- Izvršavanje: operativni sistem izvršava binarni mašinski kod

6.Zašto neki kažu da je Java "jezik koji kompajlira i interpretira"?
Kompajlirajući jezik je onaj kod where kompajler jednom prevodi izvorni kod u mašinski kod koji ta platforma može da izvrši.
Intepreterski jezik je onaj gde interpreter red po red interpretira izvorni kod, prevodeći ga u mašinski kod specifične platforme i izvršavajući ga.
Na primer, hoću da pročitam inostranski roman, imam dva izbora:
- Naći prevodioca, sačekati da prevodioc prevede ceo roman, pa jednom pročitati.
- Naći prevodioca, prevodioc prevedi jedan deo ja pročitam jedan deo, polako pročitam knjigu.
Razlog što neki kažu da je Java "jezik koji kompajlira i interpretira" je što Java program prvo mora da kompajlira izvorni .java fajl u .class bajtkod fajl, pa onda da se interpretativno izvršava.

Osnovna sintaksa
7.🌟Koje su tipove podataka u Java-i?
Preporučeno čitanje 1: Java tipovi podataka Preporučeno čitanje 2: Intervjuer me je zapao ovo toliko jednostavno pitanje: koliko bajtova zauzima boolean u Java-i?
Java tipovi podataka mogu se podeliti u dve kategorije: osnovni tipovi podataka i referentni tipovi podataka.

Osnovni tipovi podataka su:
①,numerički
- celobrojni tipovi (bajt, short, int, long)
- tipovi sa pokretnim zarezom (float, double)
②,character (char)
③,boolean (boolean)
Njihove podrazumevane vrednosti i veličine su sledeće:
| Tip podatka | Podrazumevana vrednost | Veličina |
|---|---|---|
| boolean | false | 1 bajt ili 4 bajta |
| char | '\u0000' | 2 bajta |
| bajt | 0 | 1 bajt |
| short | 0 | 2 bajta |
| int | 0 | 4 bajta |
| long | 0L | 8 bajtova |
| float | 0.0f | 4 bajta |
| double | 0.0 | 8 bajtova |
Referentni tipovi podataka su:
Koliko bajtova zauzima boolean tip?
Preporučeno čitanje: Ergov Java napredni put: osnovni tipovi podataka
Ovo zavisi od konkretne JVM implementacije. JVM specifikacija ne definiše precizno veličinu boolean tipa, samo definiše da boolean tip može imati vrednosti true ili false.
boolean: The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.
Na mojoj lokalnoj 64-bitnoj JDK verziji, pomoću JOL alatke proverio sam da i pojedinačni boolean tip i boolean niz zauzimaju po 1 bajt.
Šta se desi ako najvećoj vrednosti Integer-a dodam 1?
Kada dodate 1 na Integer.MAX_VALUE, dolazi do preoptučenja i postaje Integer.MIN_VALUE.
int maxValue = Integer.MAX_VALUE;
System.out.println("Integer.MAX_VALUE = " + maxValue); // Integer.MAX_VALUE = 2147483647
System.out.println("Integer.MAX_VALUE + 1 = " + (maxValue + 1)); // Integer.MAX_VALUE + 1 = -2147483648
// Koristeći binarni zapis da prikažemo najveću i najmanju vrednost
System.out.println("Integer.MAX_VALUE in binary: " + Integer.toBinaryString(maxValue)); // Integer.MAX_VALUE in binary: 1111111111111111111111111111111
System.out.println("Integer.MIN_VALUE in binary: " + Integer.toBinaryString(Integer.MIN_VALUE)); // Integer.MIN_VALUE in binary: 10000000000000000000000000000000Ovo je zato što Java celobrojni tipovi koriste binarni zapis komplementa, pri preoptučenju vrednost postaje najmanja.
- Binarna reprezentacija Integer.MAX_VALUE je 01111111 11111111 11111111 11111111 (32 bita).
- Nakon dodavanja 1 rezultat postaje 10000000 00000000 00000000 00000000, tj. -2147483648 (Integer.MIN_VALUE).
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Yongyou Financial-a: koji su osnovni tipovi podataka u Java-i?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Kuaishou-a: koji su osnovni tipovi podataka u Java-i, koliko bajtova svaki zauzima
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora 360-e: koji su osnovni tipovi u Java-i
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Yongyou-a: kaži 8 velikih tipova podataka
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Kuaishou-a: šta se desi ako najvećoj vrednosti Integer-a dodaš 1
memo: 23. avgusta 2025. izmenjeno do ovde. Danas prilikom izmene biografije naišao sam na jedan povratni informacij, jedan prijatelj iz planete je već prešao u Ant Group-a, ali da bi se zaštitio od nezgodo, namerava da se još jednom bori za jesenji prijem, "Heima Dianping" je već zamenio Paiclever RAG, način pisanja biografije je direktno kopiran iz primera, veoma dobar i veoma nov projekat, direktno korišćen.
Način pisanja biografije Paiclever: https://paicoding.com/column/10/2

8.Zašta automatska konverzija tipova, forsirana konverzija tipova?
Preporučeno čitanje: Priča o konverziji osnovnih tipova podataka
Kada se vrednost ili promenljiva manjeg opsega dodeli drugoj promenljivoj većeg opsega, dolazi do automatske konverzije tipova; obrnuto, potrebna je forsirana konverzija.

Ovo je kao kada sipate vodu iz male šolje u veliku, nema problema, ali kada sipate vodu iz velike u malu, može da se prolije.
①,float f=3.4, tačno?
Nije tačno. 3.4 je podrazumevano double preciznosti, dodeljivanje double vrednosti float tipu spada u sužavanje (down-casting), što će izazvati gubitak preciznosti, stoga je potrebna forsirana konverzija tipova float f =(float)3.4; ili se može napisati float f =3.4F
②,short s1 = 1; s1 = s1 + 1; tačno? short s1 = 1; s1 += 1; tačno?
short s1 = 1; s1 = s1 + 1; neće proći kompajliranje, pošto je 1 int tip, pa je rezultat s1+1 takođe int tip, potrebna je forsirana konverzija tipa da bi se dodelio short tipu.
A short s1 = 1; s1 += 1; može se uspešno kompajlirati, pošto s1+= 1; je ekvivalentno sa s1 = (short(s1 + 1); gde je implicitna forsirana konverzija tipova.
9.Šta je automatski unboxing/boxing?
- Boxing: konvertovanje osnovnog tipa podataka u wrapper tip, na primer int u Integer.
- Unboxing: konvertovanje wrapper tipa u osnovni tip podataka.

Na primer:
Integer i = 10; //boxing
int n = i; //unboxingDrugim rečima, i je Integer tip, n je int tip; promenljiva i je wrapper klasa, promenljiva n je osnovni tip podataka.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Yongyou-a: koje wrapper klase odgovaraju?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora JD.com-a: koja je razlika između int i Integer
10.Koja je razlika između & i &&?
& je logičko I.
&& je kratkospojno I. Razlika između logičkog I i kratkogspojnog I je veoma velika, iako oboje zahtevaju da su vrednosti sa obe strane operatora true, da bi ceo izraz bio true.
&& se naziva kratkospojni operacija zato što ako je vrednost izraza levo od && false, desni izraz će biti preskočen i neće se izvršiti.
Na primer, prilikom verifikacije korisničkog prijave, treba proveriti da korisničko ime nije null i nije prazan string, treba napisati username != null && !username.equals(""), redosled ova dva ne može da se promeni, a ne može da se koristi & operator, zato što ako prvi uslov nije ispunjen, uopšte ne može da se vrši poređenje string-ova equals, inače će se baciti NullPointerException izuzetak.
Napomena: razlika između logičkog ILI operatora (|) i kratkogspojnog ILI operatora (||) je slična.
- decembra 2024. ažurirano do ovde.
11.Može li se switch statement koristiti za bajt/long/String tipove?
Pre Java 5-e, switch(expr) je mogao da bude samo bajt, short, char, int.
Od Java 5-e, uveden je enum tip, expr može da bude i enum tip.
Od Java 7-e, expr može da bude i string.
Od Java 21-e, switch statement doživeo korenite promene, može ne samo da radi sa long tipom, već i sa bilo kojim objektnim tipom uključujući null, i može da doda složene uslove pomoću when klazule.
12.Koje su razlike i uloge break, continue, return?
- break izlazi iz celog loop-a, ne izvršava se dalje loop (završava tekuće telo loop-a)
- continue izlazi iz tekućeg loop-a, nastavlja sa sledećim loop-om (završava se tekući izvršavanje loop-a, ulazi se u sledeći loop condition)
- return program se vraća, ne izvršava se dalji kod (završava tekuću metodu, direktno se vraća)

13.Koristeći najefikasniji metod, izračunaj 2 puta 8?
2 << 3. Bitwise operacija, pomeranje binarnih cifara za 3 mesta levo jednako je množenju sa 2 na 3. stepen.
14.Kaži nešto o inkrementnim i dekrementnim operatorima?
Tokom pisanja koda, česta situacija je da treba da se neka celobrojna promenljiva poveća ili smanji za 1, Java nudi specijalne operatore za takve izraze, zvane inkrementni operatori (++) i dekrementni operatori (--).
++ i -- operatori mogu da se postave pre ili posle promenljive.
Kada se operator postavi pre promenljive (prefiks), prvo se inkrementira/dekrementira, pa se dodeljuje; kada se operator postavi posle promenljive (sufiks), prvo se dodeljuje, pa se onda inkrementira/dekrementira.
Na primer, kada b = ++a, prvo se inkrementira (sam se povećava za 1), pa se dodeljuje (dodeljuje se b); kada b = a++, prvo se dodeljuje (dodeljuje se b), pa se onda inkrementira (sam se povećava za 1). Dakle, ++a izdaje vrednost a+1, a++ izdaje vrednost a.
Jednostavna formula: "simbol pre -> prvo dodati/oduzeti, simbol posle -> zatim dodati/oduzeti".
Pogledaj rezultat izvršavanja ovog koda?
int i = 1;
i = i++;
System.out.println(i);Odgovor je 1. Malko čudno, zar ne?
Za JVM, prilikom obrade inkrementnog operatora, prvo će definisati privremenu promenljivu da primi vrednost i, pa izvršiti inkrementnu operaciju, konačno ponovo dodeliti privremenu promenljivu vrednoći i koja je sada 2, pa je konačni rezultat 1.
Ovo je ekvivalentno sledećem kodu:
int i = 1;
int temp = i;
i++;
i = temp;
System.out.println(i);Šta će ovaj kod izdati?
int count = 0;
for(int i = 0;i < 100;i++)
{
count = count++;
}
System.out.println("count = "+count);Odgovor je 0.
Isto kao i gornje pitanje, korišćena je privremena promenljiva, count je u stvari jednak vrednosti privremene promenljive.
int autoAdd(int count)
{
int temp = count;
count = count + 1;
return temp;
}15.Kako float predstavlja decimalne brojeve? (dodatak)
- aprila 2024. dodato
Preporučeno čitanje: Osnove računarskih sistema (4) flotation point
float predstavlja decimalne brojeve na osnovu IEEE 754standarda, koristeći binarni flotation point format.
- S: sign bit, 0 predstavlja pozitivan broj, 1 predstavlja negativan broj;
- M: mantisa (fraction part), korišćena za predstavljanje preciznosti broja; na primer
; 1.25 je mantisa; - R: radix, u decimalnom sistemu je radix 10, u binarnom sistemu je radix 2;
- E: eksponent, na primer
gde je -1 eksponent.
Ovaj metod predstavljanja može da predstavi veoma velike ili veoma male vrednosti sa ograničenim brojem bita, ali to takođe znači da može doći do gubitka preciznosti.
Jednostruka preciznost flotation point zauzima 4 bajta (32 bita), ova 32 bita su podeljena u tri dela: sign bit, exponent i mantissa.

1 sign bit, 8 exponent bits, 23 mantissa bits. Sign bit određuje pozitivnost/negativnost, 0 znači pozitivan, 1 znači negativan. Except bits skladrište bias-ed exponent, actual exponent treba da oduzme 127. Mantissa bits skladrište binarnu reprezentaciju decimalnog dela.
Prema ovom pravilu, konverzija decimalnog broja 25.125 u flotation point izgleda ovako:
- Deo celih brojeva: 25 konvertovano u binary je 11001;
- Deo decimalnih brojeva: 0.125 konvertovano u binary je 0.001;
- Koristeći binary scientific notation: 25.125 =
Sign bit S je 0, predstavlja pozitivan broj; exponent E je 4, konvertovano u binary je 100; mantissa M je 1.001001.

Pri korišćenju flotation point-a treba voditi računa da zbog ograničenja preciznosti, prilikom matematičkih operacija može doći do zaokruživanja, posebno pri kontinuiranim operacijama akumulacija grešaka može postati značajna.
Za scenarije koji zahtevaju visoku preciznost (kao što su finansijske proračune), možda treba koristiti BigDecimal klasu da bi se izbegla ovakva greška.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora FanRuan-a: kako float predstavlja decimalne brojeve
memo: 23. avgusta 2025. ažurirano do ovde.U stvari, u planeti je došlo mnogo studenata koji studiraju u inostranstvu, zaista sam veoma srećan što mogu da pomognem svima.

16.Kaži kako se garantuje visoka preciznost podataka? (dodatak)
- aprila 2024. dodato
Za garanciju visoke preciznosti podataka u finansijskim proračunima postoje dva rešenja, jedno je koristiti BigDecimal, drugo je konvertovati flotation point u integer int za proračune.
Sigurno ne može da se koristi float i double tip, oni ne mogu da izbegnu uobičajene probleme sa preciznošću flotation point operacija, zato što ovi tipovi podataka koriste binary flotation point za predstavljanje, ne mogu tačno da predstave, na primer 0.1.
BigDecimal num1 = new BigDecimal("0.1");
BigDecimal num2 = new BigDecimal("0.2");
BigDecimal sum = num1.add(num2);
System.out.println("Sum of 0.1 and 0.2 using BigDecimal: " + sum); // output 0.3, tačan proračunPrilikom procesa malih plaćanja ili proračuna, konvertovanjem u manje monetarne jedinice (kao što su centi), ne samo da se poboljšava brzina proračuna, već se i garantuje preciznost proračuna.
int priceInCents = 199; // cena proizvoda 199 centi
int quantity = 3;
int totalInCents = priceInCents * quantity; // proračun ukupne cene
System.out.println("Total price in cents: " + totalInCents); // output 597 centi
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora ByteDance-a: kako se garantuje visoka preciznost podataka
Objektno-orijentisano
17.Koja je razlika između objektno-orijentisanog i procesno-orijentisanog?
Procesno-orijentisano je sa fokusom na proces, kroz funkcije obavlja zadatke, struktura programa je sekvencijalni tok sastavljen od funkcija + koraka.
Objektno-orijentisano je sa fokusom na objekte, kroz interakciju objekata obavlja zadatke, struktura programa je modularna struktura sastavljena od klasa i objekata, kod može da se ponovo koristi kroz nasleđivanje, kompoziciju, polimorfizam itd.

U Tehničkifrakcija projektu vežbanja, kao što su VO, DTO svi su objektni entiteti klasa poslovne apstrakcije, a Service, Controller su implementacija poslovne logike, ovo zapravo i objektno-orijentisana ideja.

- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Kuaishou-a: koja je razlika između objektno-orijentisanog i procesno-orijentisanog?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora ByteDance-a: koji su primeri objektno-orijentisanog u projektu
18.🌟Koje su osobine objektno-orijentisanog programiranja?
Preporučeno čitanje: Duboko razumevanje tri velike osobine Java-e
Objektno-orijentisano programiranje ima tri velike osobine: enkapsulacija, nasleđivanje, polimorfizam.

Šta je enkapsulacija?
Enkapsulacija se odnosi na vezivanje podataka (svojstva, ili polja) i metoda koji operišu podacima (ponašanje) u jednu celinu, formirajući nezavisan objekat (instancu klase).
class Nvshen {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
}Može se videti da klasa Nvshen nema getter metod za age, jer uzrast boginje treba da ostane tajna.
Stoga, enkapsulacija je privatizacija svojstava objekta, uzpružanjeljenje nekih metoda koje spolja može da pristupi.
Šta je nasleđivanje?
Nasleđivanje dozvoljava jednoj klasi (podklasi) da nasleđuje svojstva i metode postojeće klase (nadklase ili bazne klase). Da bi se poboljšala ponovljivost koda i uspostavila hijerarhija klasa.
Ujedno, podklasa može da prepiši ili proširi svojstva i metode nasleđena od nadklase, čime ostvaruje polimorfizam.
class Person {
protected String name;
protected int age;
public void eat() {
System.out.println("Jesti");
}
}
class Student extends Person {
private String school;
public void study() {
System.out.println("Učiti");
}
}Student klasa nasleđuje svojstva (name, age) i metode (eat) od Person klase, a isto tako ima svoja svojstva (school) i metode (study).
Šta je polimorfizam?
Polimorfizam dozvoljava objektima različitih klasa da odgovore na istu poruku, ali exhibiraju različito ponašanje (tj. raznolikost metoda).
Polimorfizam je u stvari jedna sposobnost — ista ponašanje ima različite manifestacije; drugim rečima, izvršavanje jednog koda, Java može u runtime-u na osnovu različitih tipova objekata da proizvede različite rezultate.
Polimorfizam ima tri preduslova:
- podklasa nasleđuje nadklasu
- podklasa rewrite-uje metode nadklase
- referenca nadklase pokazuje na objekat podklase
//podklasa nasleđuje nadklasu
class Wangxiaoer extends Wanger {
public void write() { // podklasa rewrite-uje metod nadklase
System.out.println("Zapamti mržnju, pokaži našu odlučnost da se uzdignemo");
}
public static void main(String[] args) {
// referenca nadklase pokazuje na objekat podklase
Wanger wanger = new Wangxiaoer();
wanger.write();
}
}
class Wanger {
public void write() {
System.out.println("Chenmo Wang Er je šega");
}
}Zašto u Java-i treba više kompozicije, a manje nasleđivanja?
Nasleđivanje je pogodno za opis "je-a" (is-a) odnosa, ali nasleđivanje lako dovodi do jakog spreganja između klasa, jednom kada se nadklasa promeni, i podklasa mora da sledi tih promena, što krši princip otvorenosti (što manje modifikatorExisting code, više dodavanje novog koda).
Kompozicija je pogodna za opis "ima-a" (has-a) ili "može-da-radi" (can-do) odnosa, kroz kompoziciju drugih klasa u klasi, može fleksibilnije proširiti funkcionalnost. Kompozicija izbegava komplikovanu hijerarhiju nasleđivanja, istovremeno prati principle otvorenosti i principle labavog spreganja.
Na primer, pretpostavimo da koristimo nasleđivanje, svaka kombinacija oblika i stila će dovesti do dramatičnog povećanja broja klasa:
// bazna klasa
class Shape {
public void draw() {
System.out.println("Drawing a shape");
}
}
// krug
class Circle extends Shape {
@Override
public void draw() {
System.out.println("Drawing a circle");
}
}
// crveni krug
class RedCircle extends Circle {
@Override
public void draw() {
System.out.println("Drawing a red circle");
}
}
// zeleni krug
class GreenCircle extends Circle {
@Override
public void draw() {
System.out.println("Drawing a green circle");
}
}
// slično, za pravougaonik takođe treba kreirati više klasa
class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("Drawing a rectangle");
}
}
class RedRectangle extends Rectangle {
@Override
public void draw() {
System.out.println("Drawing a red rectangle");
}
}Kompozicija je fleksibilnija, može da razdeli oblik i boju, labavo spreganje.
// interfejs oblika
interface Shape {
void draw();
}
// interfejs boje
interface Color {
void applyColor();
}Oblik radi stvari oblika.
// implementacija kruga
class Circle implements Shape {
private Color color; // kroz kompoziciju drži objekat boje
public Circle(Color color) {
this.color = color;
}
@Override
public void draw() {
System.out.print("Drawing a circle with ");
color.applyColor(); // poziv logike boje
}
}
// implementacija pravougaonika
class Rectangle implements Shape {
private Color color;
public Rectangle(Color color) {
this.color = color;
}
@Override
public void draw() {
System.out.print("Drawing a rectangle with ");
color.applyColor();
}
}Boja radi stvari boje.
// implementacija crvene
class RedColor implements Color {
@Override
public void applyColor() {
System.out.println("crvena boja");
}
}
// implementacija greene
class GreenColor implements Color {
@Override
public void applyColor() {
System.out.println("zelena boja");
}
}
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora državnog preduzeća: koje su osobine objektno-orijentisanog u Java-i, kako ih razumeeš
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: koje su osobine objektno-orijentisanog u Java-i
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora ByteDance-a: kaži nešto o osobinama Java-e, šta je polimorfizam
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora JD.com-a: tri velike osobine objektno-orijentisanog
19.Koji problem rešava polimorfizam? (dodatak)
- marta 2024. dodato
Polimorfizam znači da isti interfejs ili metod ima različite implementacije u različitim klasama, na primer dynamic binding, referenca nadklase pokazuje na objekat podklase, konkretni poziv metoda će biti odložen do runtime-a.
Na primer, sada imamo nadklasu Wanger, podklasu Wangxiaoer, obe imaju write metod. Sada imamo promenljivu wanger tipa Wanger, kada izvrši wanger.write(), da li će pozvati write() metod nadklase Wanger ili write() metod podklase Wangxiaoer?
//podklasa nasleđuje nadklasu
class Wangxiaoer extends Wanger {
public void write() { // podklasa override-uje metod nadklase
System.out.println("Zapamti mržnju, pokaži našuodlučnost da se uzdignemo");
}
public static void main(String[] args) {
// referenca nadklase pokazuje na objekat podklase
Wanger[] wangers = { new Wanger(), new Wangxiaoer() };
for (Wanger wanger : wangers) {
// kada je objekat Wanger, output: Zaboravi na nacionalnu sramotu
// kada je objekat Wangxiaoer, output: Zapamti mržnju, pokaži našuodlučnost da se uzdignemo
wanger.write();
}
}
}
class Wanger {
public void write() {
System.out.println("Zaboravi na nacionalnu sramotu");
}
}Odgovor je da se u runtime-u vršikasnija fazavezivanje na osnovu tipa objekta, kompajler u fazi kompajliranja ne zna tip objekata, ali Java mehanizam poziva metoda može da pronađe correct method body, pa izvrši, dobija correct rezultat, ovo je uloga polimorfizma.
Kakav je princip implementacije polimorfizma?
Polimorfizam se ostvaruje kroz dynamic binding, Java koristi virtual method table da skladrišti pokazivače metode, prilikom poziva metoda iz actual type-a objekata iz vmt-a pronalazi konkretnu implementaciju.

- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Huawei-a: cilj polimorfizma, koji problem rešava?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: kaži nešto o polimorfizmu, overloading-u i overriding-u
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora ByteDance-a: upotreba polimorfizma, princip implementacije polimorfizma
20.🌟Koja je razlika između override-a i overloading-a?
Preporučeno čitanje: Koja je razlika između metod override Override i metod overloading Overload?
Ako klasa ima više metoda sa istim imenom ali različitim brojem parametara, obično ih zovemo method overloading.
Ako podklasa ima isti metod kao i nadklasa (isti parametri, isti return type, isto ime metoda, ali različit body), zovemo to method overriding.

- Method overloading se dešava u istoj klasi, ako metodi sa istim imenom imaju različite parametre (različit tip parametra, različit broj parametara ili oboje).
- Method overriding se dešava između podklase i nadklase, zahteva da podklasa i nadklasa imaju isti return type, isto ime metoda i listu parametara, i ne može da declar-uje više izuzetaka nego nadklasini metod, sledi Liskov substitution principle.
Šta je Liskov substitution principle?
Liskov substitution principle (LSP) se takođe zove Li-ov replacement principle, njegovo pravilo je da bilo gde može da se pojavi nadklasa, mora može da se pojavi i podklasa.

LSP je kamen temeljac ponovne upotrebe nasleđivanja, samo kada podklasa može da zameni nadklasu bez uticanja na funkcionalnost jedinice, nadklasa može zaista da se ponovo koristi, a podklasa može da nadogradi novo ponašanje na osnovu nadklase.
Ovo znači da podklasa ne treba da menja originalno ponašanje nadklase pri proširivanju. Na primer, ako postoji metod koji prima objekat nadklase kao parametar, onda bilo koji objekat podklase prosleđen tom metodu takođe može da normalno radi.
class Bird {
void fly() {
System.out.println("Ptica leti");
}
}
class Duck extends Bird {
@Override
void fly() {
System.out.println("Patka leti");
}
}
class Ostrich extends Bird {
// Ostrich krši LSP, jer nojevi ne mogu da lete, ali su nasledili ptice koje mogu da lete
@Override
void fly() {
throw new UnsupportedOperationException("Nojevi ne mogu da lete");
}
}U ovom primeru, Ostrich (noj) klasa krši LSP princip, jer menja ponašanje nadklase Bird (tj. letenje). Pri design-u treba pažljivije koristiti odnos nasleđivanja, osigurati poštovanje LSP principa.
Pored Li-ov replacement principa, postoje i drugi važni principi objektno-orijentisanog dizajna, zajedno čine SOLID principe, to su:
①,Single Responsibility Principle (SRP), jedna klasa treba da ima samo jedan razlog za promenu, tj. jedna klasa je odgovorna samo za jednu dužnost. Svrha je da klasa bude jasnija, lakša za razumevanje i održavanje.
②,Open-Closed Principle (OCP), softverski entitet treba da bude otvoren za proširenje, zatvoren za izmenu. To znači da klasa treba da ostvari novu funkcionalnost kroz proširenje, a ne kroz izmenu postojećeg koda.
Na primer, ako se ne poštuje Open-Closed Principle, postoji klasa koja treba da obraditi različite oblike za crtanje.
class ShapeDrawer {
public void draw(Shape shape) {
if (shape instanceof Circle) {
drawCircle((Circle) shape);
} else if (shape instanceof Rectangle) {
drawRectangle((Rectangle) shape);
}
}
private void drawCircle(Circle circle) {
// crtaj krug
}
private void drawRectangle(Rectangle rectangle) {
// crtaj pravougaonik
}
}Svaki put kada se doda novi oblik, treba izmeniti draw metodu, ovo krši Open-Closed Principle. Pravi način je kroz nasleđivanje i polimorfizam da se kreiraju klase novih oblika, pa se u ShapeDrawer dodaje novi draw metoda.
// apstraktna Shape klasa
abstract class Shape {
public abstract void draw();
}
// konkretna Circle klasa
class Circle extends Shape {
@Override
public void draw() {
// crtaj krug
}
}
// konkretna Rectangle klasa
class Rectangle extends Shape {
@Override
public void draw() {
// crtaj pravougaonik
}
}
// ShapeDrawer klasa koja koristi Open-Closed Principle
class ShapeDrawer {
public void draw(Shape shape) {
shape.draw(); // poziv polimorfnog draw metoda
}
}③,Interface Segregation Principle (ISP), klijent ne treba da zavisni od interfejsa koji mu ne trebaju. To znači da pri design-u interfejsa treba biti što je moguće concise, ne treba dizajnirati pretežak interfejs.
④,Dependency Inversion Principle (DIP), visoki moduli ne treba da zavise od niskih modula, oba treba da zvise od apstrakcije; apstrakcija ne treba da zavisi od detalja, detalji treba da zavise od apstrakcije. To znači da pri design-u treba što je više moguće zaviseti od interfejsa ili apstraktnih klasa, a ne od implementacijskih klasa.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora FanRuan-a: metod dizajna, Li-ov princip, koje dizajn principe još znaš
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: kaži nešto o polimorfizmu, overloading-u i overriding-u
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora China Merchants Bank Network Technology-a: Java dizajn pattern Open-Closed Principle, da li znaš Liskov replacement
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora small and medium company: overriding i overloading
memo: 24. septembra 2025. izmenjeno do ovde, danas jedan prijatelj iz planete mi je poslao privatnu poruku da je dobio offer od China Merchants Bank Network Technology, pita da li se može još pregovarati o plati, ukupna kompenzacija je OK, ali stvarno, prostor za pregovaranje o plati u banci nije veliki, 😄

21.Koje su razlike između public, private, protected, i default pristupornih modifikatora?
U Java-i, mogu se koristiti kontrolni modifikatori pristupa za zaštitu pristupa klasama, promenljivim, metodama i konstruktorima. Java podržava 4 različita nivoa pristupa.
- default (tj. podrazumevano, ne piše se ništa): vidljiv isto unutar paketa, ne koristi nijedan modifikator. Može modifikovati klase, interfejse, promenljive, metode.
- private: vidljiv samo isto unutar klase. Može modifikovati promenljive, metode. Napomena: ne može modifikovati klase (spoljašnje klase)
- public: vidljiv za sve klase. Može modifikovati klase, interfejse, promenljive, metode
- protected: vidljiv za klase istog paketa i sve podklase. Može modifikovati promenljive, metode. Napomena: ne može modifikovati klase (spoljašnje klase).

22.Koja je uloga ključne reči this?
this je objekat samog sebe, predstavlja sam objekat, može da se razume kao: pokazivač koji ukazuje na sam objekat.
Upotreba this-a u Java-i može se uopšteno podeliti u 3 kategorije:
Obična direktna referenca, this je ekvivalentno pokazivaču na tekući objekat
Kada se ime formalnog parametra poklapa sa imenom član promenljive, koristi this da bi se razlikovalo:
public Person(String name,int age){
this.name=name;
this.age=age;
}- Poziv konstruktora iste klase
23.🌟Koje su razlike između apstraktne klase i interfejsa?
Jedna klasa može da nasleđuje samo jednu apstraktnu klasu; ali može da implementira više interfejsa. Stoga obično prilikom kreiranja klase niti preporučujemo da se implementira Runnable interfejs, tako da klasa niti još može da nasleđuje druge klase, a ne samo Thread klasu.
Apstraktna klasa odgovara "is-a" odnosu, dok interfejs više liči na "has-a" odnos, na primer klasa može da bude serijalizovana, samo treba da implementira Serializable interfejs, ne mora da nasleđuje serijalizacionu klasu.
Apstraktne klase se više koriste za davanje zajedničkog framework-a više srodnih klasa, uključujući inicijalizaciju stanja, dok interfejs definiše set standarda ponašanja, tako da različite klase mogu da implementiraju isti interfejs, dajući raznolike implementacije ponašanja.
Da li apstraktna klasa može da definiše konstruktor?
Može, apstraktna klasa može da ima konstruktor.
abstract class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
public abstract void makeSound();
}
public class Dog extends Animal {
private int age;
public Dog(String name, int age) {
super(name); // poziv konstruktor apstraktne klase
this.age = age;
}
@Override
public void makeSound() {
System.out.println(name + " says: Bark");
}
}Da li interfejs može da definiše konstruktor?
Ne može, interfejs se uglavnom koristi za definisanje seta standarda metoda, nema konkretne detalje implementacije.

Da li Java podržava višestruko nasleđivanje?
Java ne podržava višestruko nasleđivanje, jedna klasa može da nasleđuje samo jednu klasu, višestruko nasleđivanje može da izazove diamond problem.
class A {
void show() { System.out.println("A"); }
}
class B extends A {
void show() { System.out.println("B"); }
}
class C extends A {
void show() { System.out.println("C"); }
}
// ako Java podržava višestruko nasleđivanje
class D extends B, C {
// kada se pozove show() metoda, da li D treba da pozove B-ov show() ili C-ov show()?
}Da li interfejs može da ima višestruko nasleđivanje?
Interfejs može da ima višestruko nasleđivanje, jedan interfejs može da nasleđuje više interfejsa, razdvojenih zapetom.
interface InterfaceA {
void methodA();
}
interface InterfaceB {
void methodB();
}
interface InterfaceC extends InterfaceA, InterfaceB {
void methodC();
}
class MyClass implements InterfaceC {
public void methodA() {
System.out.println("Method A");
}
public void methodB() {
System.out.println("Method B");
}
public void methodC() {
System.out.println("Method C");
}
public static void main(String[] args) {
MyClass myClass = new MyClass();
myClass.methodA();
myClass.methodB();
myClass.methodC();
}
}U gornjem primeru, InterfaceA i InterfaceB su dva nezavisna interfejsa.
InterfaceC nasleđuje InterfaceA i InterfaceB, i definiše svoj metod methodC.
MyClass implementira InterfaceC, stoga mora da implementira metode methodA i methodB iz InterfaceA i InterfaceB, kao i methodC iz InterfaceC.
Koja je razlika između nasleđivanja i apstrakcije?
Nasleđivanje je mehanizam koji dozvoljava podklasi da nasledi svojstva i metode nadklase. Kroz nasleđivanje, podklasa može da ponovo koristi kod nadklase.
Apstrakcija je tehnika koja krije kompleksnost i prikazuje samo neophodne delove. U objektno-orijentisanom programiranju, apstrakcija se može ostvariti kroz apstraktne klase i interfejse.
Koja je razlika između apstraktne klase i obične klase?
Apstraktna klasa se definiše kroz abstract ključnu reč, ne može da se instancira, može samo da bude nadklasa drugih klasa. Obična klasa nema abstract ključnu reč, može direktno da se instancira.
Apstraktna klasa može da sadrži apstraktne metode i neapstraktne metode. Apstraktni metodi nemaju body, moraju da se implementiraju od strane podklase. Obična klasa može da sadrži samo neapstraktne metode.
abstract class Animal {
// apstraktni metod
public abstract void makeSound();
// neapstraktni metod
public void eat() {
System.out.println("Ova životinja jede.");
}
}
class Dog extends Animal {
// implementacija apstraktnog metoda
@Override
public void makeSound() {
System.out.println("Woof");
}
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound(); // output "Woof"
dog.eat(); // output "Ova životinja jede."
}
}
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora male kompanije: koja je razlika između apstraktne klase i interfejsa?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Yongyou-a: koja je razlika između apstraktne klase i interfejsa? Da li apstraktna klasa može da definiše konstruktor?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Baidu-a: koja je razlika između nasleđivanja i apstrakcije
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: da li apstraktna klasa može da ima konstruktor (može) a interfejs (ne) zašto postoji ovakva razlika
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Qunar-a: da li interfejs može da ima višestruko nasleđivanje
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora JD.com-a: koja je razlika između interfejsa i apstraktne klase
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Xiaomi-a: da li Java podržava višestruko nasleđivanje
24.Koje su razlike između member promenljivih i lokalnih promenljivih?
S gledišta sintakse: member promenljive pripadaju klasi, dok su lokalne promenljive definisane u metodama ili su parametri metoda; member promenljive mogu biti modifikovane sa public, private, static itd., dok lokalne promenljive ne mogu biti modifikovane sa kontrolnim modifikatorima pristupa i static; ali i member promenljive i lokalne promenljive mogu biti modifikovane sa final.
S gledišta načina skladištenja u memoriji: ako se member promenljiva modifikuje sa static, onda ona pripada klasi, ako ne, onda pripada instanci. Objekti se čuvaju u heap memoriji, ako je lokalna promenljiva osnovni tip, čuva se u stack memoriji, ako je referentni tip, čuva se pokazivač na objekat u heap memoriji ili adresa u constant pool-u.
S gledišta trajanja u memoriji: member promenljiva je deo objekta, postoji sa kreiranjem objekta, dok lokalna promenljiva nestaje automatski nakon završetka poziva metoda.
Ako member promenljiva nije dodeljena početna vrednost: biće automatski dodeljena podrazumevana vrednost tipa (jedan izuzetak: member promenljiva modifikovana sa final takođe mora eksplicitno da bude dodeljena), dok lokalna promenljiva neće biti automatski dodeljena.
25.Da li znaš static ključnu reč?
Preporučeno čitanje: Detaljno objašnjenje uloge Java static ključne reči
static ključna reč se može koristiti za modifikovanje promenljivih, metoda, code blocks i unutrašnjih klasa, kao i za import paketa.
| Modifikovani objekat | Uloga |
|---|---|
| Promenljiva | Statička promenljiva, promenljiva na nivou klase, sve instance dele isti podatak. |
| Metod | Statički metod, metod na nivou klase, nezavisan od instanci. |
| Code block | Prilikom učitavanja klase inicijuje neke podatke, izvršava se samo jednom. |
| Unutrašnja klasa | Vezana za spoljašnju klasu ali nezavisna od instanci spoljašnje klase. |
| Import | Može direktno pristupati statičkim članovima, nije potrebna referenca kroz ime klase, pojednostavljuje pisanje koda, ali smanjuje čitljivost koda. |
Koja je razlika između statičke promenljive i instance promenljive?
Statička promenljiva: promenljiva modifikovana sa static, poznata i kao klasna promenljiva, pripada klasi, ne pripada ni jednoj instanci klase, bez obzira koliko objekata se kreira, statička promenljiva u memoriji ima i može samo jednu kopiju.
Instance promenljiva: mora da postoji u okviru neke instance, prvo treba kreirati objekat pa kroz objekat može da se pristupi. Statička promenljiva može da ostvari da više objekata deli memoriju.
Koja je razlika između statičkog metoda i instance metoda?
Slično.
Statički metod: metod modifikovan sa static, poznat i kao klasni metod. Pri spoljašnjem pozivanju statičkog metoda, može se koristiti način "imeKlase.imeMetoda", a takođe i način "imeObjekta.imeMetoda". U statičkom metodu ne može da se pristupa nestatičkim member promenljivim i metodima.
Instance metod: zavisI od instance klase, treba koristiti način "imeObjekta.imeMetoda" za poziv; može da pristapi svim member promenljivim i metodima klase.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora ByteDance-a: upotreba static ključne reči
26. Koja je uloga final ključne reči?
①,Kada final modifikuje klasu, ukazuje da ova klasa ne može da se nasledi. Na primer, String klasa, Integer klasa i druge wrapper klase su sve modifikovane sa final.

②,Kada final modifikuje metod, ukazuje da ovaj metod ne može da se overriding-uje. To znači, ako klasa nasledi određenu klasu i želi da promeni ponašanje metoda modifikovanog sa final u nadklasi, to nije dozvoljeno.
③,Kada final modifikuje promenljivu, ukazuje da se vrednost ove promenljive ne može promeniti nakon inicijalizacije.
Ako se radi about osnovni tip podataka, njena vrednost se ne može promeniti nakon inicijalizacije; ako se radi about referentni tip, nakon inicijalizacije ne može više da pokazuje na drugi objekat.

Ali sadržaj objekta na koji pokazuje pokazivač može da se promeni.

- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: kaži nešto o final ključnoj reči
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora 360-e: koja je upotreba final-a
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora JD.com-a: final
27.Koja je razlika izmću final, finally, finalize?
①,final je modifikator, može da modifikuje klase, metode i promenljive. Kad final modifikuje klasu, ova klasa ne može da se nasledi; kada final modifikuje metod, ovaj metod ne može da se overriding-uje; kada final modifikuje promenljivu, ova promenljiva je konstanta, jednom dodeljena, ne može više da se menja.
②,finally je deo Java obrade izuzetaka, koristi se za kreiranje finally bloka nakon try bloka. Bez obzira da li try blok baca izuzetak ili ne, finally blok se uvek izvršava. Obično se finally blok koristi za oslobađanje resursa, kao što su zatvaranje fajlova, database konekcija itd.
③,finalize je Object klasa metod, koristi se za obavljanje neophodnih čišćenja pre nego što garbage collector očisti objekat iz memorije.
Ovaj metod se automatski poziva pre nego što garbage collector oslobađa memoriju koju objekat zauzima. Ne možemo eksplicitno da pozovemo finalize metod, jer se uvek automatski poziva od strane garbage collector-a u odgovarajućem vremenu.

- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora ByteDance-a: koja je razlika između final, finally, finalize?
28.Koja je razlika izmću == i equals?
U Java-i, == operator i equals() metod se koriste za poređenje dva objekta:
①,==: koristi se za poređenje referenci dva objekta, tj. da li pokazuju na istu instancu objekta.
Ako dve promenljive referenciraju istu instancu objekta, == vraća true, u suprotnom vraća false.
Za osnovne tipove podataka (kao int, double, char itd.), == poređuje vrednosti.
②,equals() metod: koristi se za poređenje sadržaja dva objekta. Podrazumevano, ponašanje equals() metoda je isto kao ==, tj. poređenje referenci objekata, kao u sup klasi Object:
public boolean equals(Object obj) {
return (this == obj);
}Međutim, equals() metod se obično overriding-uje u raznim klasama. Na primer, String klasa overriding-uje equals() metod, da bi mogao da poređi da li su sadržaji dva stringa potpuno isti.

Na primer:
String a = new String("Chenmo Wang Er");
String b = new String("Chenmo Wang Er");
// koristeći == za poređenje
System.out.println(a == b); // output false, jer a i b referenciraju različite objekte
// koristeći equals() za poređenje
System.out.println(a.equals(b)); // output true, jer sadržaji a i b su isti
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora male kompanije: koja je razlika između == i equals()?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora male kompanije future of good times test development engineer: koja je razlika između == i equals
29.🌟Zašto prilikom overriding equals-a mora overriding i hashCode metod?
Jer hash-based kolekcione klase (kao HashMap) trebaju da se zasnivaju na ovome da ispravno skladište i pronalaze objekte.
Konkretno, HashMap skladišti objekte u različitim "bucket-ima" na osnovu hashCode-a objekta, prilikom pretrage objekta, koristi hashCode ključa da odredi u kom bucket-u se objekat nalazi, pa onda kroz equals() metod pronalazi odgovarajući objekat.
Ako se overriding equals() metod, a ne overriding hashCode() metod, onda objekti koji se smatraju jednaki mogu imati različit hashCode, što će dovesti do toga da se ovi objekti ne mogu ispravno obraditi u HashMap-u.
Šta je hashCode metod?
hashCode() metod se koristi za dobijanje hash koda, vraća int integer, definisan u Object klasi, je native metod.
public native int hashCode();Zašto postoji hashCode metod?
hashCode metod se uglavnom koristi za dobijanje hash koda objekta, hash kod se racuna na osnovu memorije adrese objekta ili atributa objekta, je int tipa integer, obično se ne ponavlja, stoga može da se koristi kao ključ u paru ključ-vrednost, da bi se poboljšala efikasnost pretrage.
Na primer HashMap koristi hashCode kao ključ, pozivajući hashCode metod da bi dobili hash kod ključa, i vrši XOR operaciju sa hash kodom pomerenim za 16 bita udesno.
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}Zašto dva objekta sa istim hashCode vrednošću nisu nužno jednaki?
Ovo je uglavnom usled prirode hash koda (hashCode) i njegovog cilja.
Hash kod se dobija kroz hash funkciju koja mapira objekte u jednu celobrojnu vrednost, njegov glavni cilj je brzo lociranje pozicije skladištenja objekta u hash tabeli.
Budući da hash funkcija mapira veći domain unosa u manji domain izlaza, različiti unosi (tj. različiti objekti) mogu davati isti izlaz (tj. isti hash kod).
Ova situacija se zove hash collision. Kada se desi hash collision između dva nejednaka objekta, ona će imati isti hashCode.
Da bi se rešio problem hash collision-a, hash tabela prilikom obrade ključeva poredi ne samo hash kodove već i koristi equals metod da proveri da li su ključevi stvarno jednaki. Ako dva objekta imaju isti hash kod, ali se kroz equals metod poređenje pokazuje kao false, onda se ova dva objekta ne smatraju jednakim.
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
e = p;Koja je veza između hashCode i equals metoda?
Ako dva objekta kroz equals bude jednaka, njihovi hashCode moraju biti jednaki. Inače će doći do abnormalnog ponašanja hash tabelarnih data structure (kao HashMap, HashSet).
U hash tabeli, ako equals bude jednaka a hashCode nije jednaka, hash tabela možda neće moći da ispravno obrađuje ove objekte, što će dovesti do dupliciranih elemenata ilikonfliktova ključeva itd.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora JD.com-a: da li je dovoljno overriding samo jedan od hashCode i equals, ako samo overriding equals a ne overriding hashCode, šta će se desiti prilikom map put-a
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: zašto prilikom overriding equals-a, preporučuje se moraju overriding hashCode metod
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: koje metode ima object, zašto hashCode i equals treba da se overriding zajedno, zašto ne overriding će izazvati kakve probleme, kada će se koristiti overriding hashCode scenario
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora JD.com-a: kaži nešto o hashCode()-u
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora JD.com-a: hashCode i equal
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Kuaishou-a: koja je veza između HashCode i equals metoda? Ako equals dva objekta bude jednaka a hashCode nije jednaka šta će se desiti?
30.Da li Java prenosi po vrednosti ili po referenci?
Java prenosi po vrednosti, ne po referenci.
Kada se objekat prosledi kao parametar metod, vrednost parametra je referenca na objekat. Vrednost reference je adresa objekta u heap-u.
Objekti se čuvaju u heap-u, stoga pri prosleđivanju objekta, može se razumeti da se prosleđuje adresa objekta kogu čuva promenljiva.

Koje su karakteristike referentnih promenljivih?
Referentna promenljiva čuva adresu objekta, a ne sam objekat. Stoga, pri prosleđivanju referentne promenljive, zapravo se prosleđuje adresa objekta, tj. prenosi se vrednost reference.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Huawei OD-a: koje su karakteristike referentnih promenljivih
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: koje su karakteristike JVM referentnog tipa?
31.Kaži nešto o razlici između duboke kopije i plitke kopije?
Preporučeno čitanje: Duboko razumevanje Java plitke i duboke kopije
U Java-i, postoje dva načina kopiranja objekata: Deep Copy i Shallow Copy, ova dva načina se veoma razlikuju u načinu kopiranja objekata.

Plitka kopija će kreirati novi objekat, ali atributi (polja) ovog novog objekta su potpuno isti kao atributi originalnog objekta. Ako je attribute osnovni tip podataka, kopira se vrednost osnovnog tipa; ako je attribute referentni tip, kopira se adresa reference, stoga novi i stari objekat dele isti referentni objekat.
Način realizacije plitke kopije je: implementirati Cloneable interfejs i overriding clone() metod.
class Person implements Cloneable {
String name;
int age;
Address address;
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Address {
String city;
public Address(String city) {
this.city = city;
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("Henan provincija Luojang grad");
Person person1 = new Person("Chenmo Wang Er", 18, address);
Person person2 = (Person) person1.clone();
System.out.println(person1.address == person2.address); // true
}
}Duboka kopija takođe kreira novi objekat, ali rekurzivno kopira sve referentne objekte, osiguravajući da su novi i stari objekat potpuno nezavisni. Svaka izmena između novog i originalnog objekta neće uticati jedno na drugo.
Načini realizacije duboke kopije su: ručno kopirati sve referentne objekte, ili koristiti serializaciju i deserializaciju.
①,Ručno kopiranje
class Person {
String name;
int age;
Address address;
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
public Person(Person person) {
this.name = person.name;
this.age = person.age;
this.address = new Address(person.address.city);
}
}
class Address {
String city;
public Address(String city) {
this.city = city;
}
}
public class Main {
public static void main(String[] args) {
Address address = new Address("Henan provincija Luojang grad");
Person person1 = new Person("Chenmo Wang Er", 18, address);
Person person2 = new Person(person1);
System.out.println(person1.address == person2.address); // false
}
}②,Serializacija i deserializacija
import java.io.*;
class Person implements Serializable {
String name;
int age;
Address address;
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
public Person deepClone() throws IOException, ClassNotFoundException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (Person) ois.readObject();
}
}
class Address implements Serializable {
String city;
public Address(String city) {
this.city = city;
}
}
public class Main {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Address address = new Address("Henan provincija Luojang grad");
Person person1 = new Person("Chenmo Wang Er", 18, address);
Person person2 = person1.deepClone();
System.out.println(person1.address == person2.address); // false
}
}
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Alibaba-a: plitka kopija i duboka kopija
32.Koji su načini kreiranja objekata u Java-i?

Java ima četiri načina za kreiranje objekata:
①,new ključna reč za kreiranje, ovo je najčešći i najdirektniji način, kroz poziv konstruktor klase za kreiranje objekta.
Person person = new Person();②,Mehanizam refleksije za kreiranje, refleksija dozvoljava kreiranje objekata u runtime-u, i može da pristupi privatnim članovima klase, čest je u framework-ima i alatnim klasama.
Class clazz = Class.forName("Person");
Person person = (Person) clazz.newInstance();③,clone kopiranje za kreiranje, kroz clone metod za kreiranje objekta, potrebno je implementirati Cloneable interfejs i overriding clone metod.
Person person = new Person();
Person person2 = (Person) person.clone();④,Mehanizam serializacije za kreiranje, kroz serializaciju pretvara objekat u bajt stream, pa kroz deserializaciju vraća objekat iz bajt stream-a. Potrebno je implementirati Serializable interfejs.
Person person = new Person();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.txt"));
oos.writeObject(person);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.txt"));
Person person2 = (Person) ois.readObject();Pri kreiranju nove podklase, koji je redosled izvršavanja statičkog bloka nadklase, podklase i konstruktor?
U Java-i, pri kreiranju objekta podklase, redosled izvršavanja statičkog bloka nadklase i podklase i konstruktor prati određena pravila. Ova pravila uglavnom uključuju sledeće korake:
- Prvo se izvršava statički blok nadklase (izvršava se samo prvi put kada se klasa učita).
- Zatim se izvršava statički blok podklase (izvršava se samo prvi put kada se klasa učita).
- Zatim se izvršava konstruktor nadklase.
- Konačno se izvršava konstruktor podklase.
Detaljan primer koda:
class Parent {
// statički blok nadklase
static {
System.out.println("Statički blok nadklase");
}
// konstruktor nadklase
public Parent() {
System.out.println("Konstruktor nadklase");
}
}
class Child extends Parent {
// statički blok podklase
static {
System.out.println("Statički blok podklase");
}
// konstruktor podklase
public Child() {
System.out.println("Konstruktor podklase");
}
}
public class Main {
public static void main(String[] args) {
new Child();
}
}Ishod nakon izvršavanja gore navedenog koda:
Statički blok nadklase
Statički blok podklase
Konstruktor nadklase
Konstruktor podklase- Statički blok: izvršava se prilikom učitavanja klase, samo jednom, po redosledu nadklasa-podklasa.
- Konstruktor: izvršava se pri svakom kreiranju objekta, po redosledu nadklasa-podklasa, prvo se inicijalizuje blok pa konstruktor.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora JD.com-a: pri kreiranju nove podklase, koji je redosled izvršavanja statičkog bloka nadklase, podklase i konstruktor
String
33.Da li je String osnovni tip podataka u Java-i? Da li se može naslediti?
Ne, String je klasa, pripada referentnom tipu podataka. Osnovni tipovi podataka u Java-u uključuju osam vrsta: četiri celobrojna tipa (bajt, short, int, long), dva flotation point tipa (float, double), jedan karakter tip (char) i jedan boolean tip (boolean).
Da li se String klasa može naslediti?
Ne može. String klasa je modifikovana sa final, tj. tzv. immutable klasa, ne može se naslediti.
Koji su česti metod String klase?
Ja najčešće koristim:
length()- vraća dužinu stringa.charAt(int index)- vraća karakter na navedenoj poziciji.substring(int beginIndex, int endIndex)- vraća podstring odbeginIndexdoendIndex-1.contains(CharSequence s)- proverava da li string sadrži navedeni niz karaktera.equals(Object anotherObject)- poređi da li su sadržaji dva stringa jednaki.indexOf(int ch)iindexOf(String str)- vraća prvo pojavljivanje navedenog karaktera ili stringa.replace(char oldChar, char newChar)ireplace(CharSequence target, CharSequence replacement)- zamenjuje karaktere ili nizove karaktera u stringu.trim()- uklanja prazna mesta na početku i kraju stringa.split(String regex)- deluje ovaj string na osnovu regularnog izraza.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora male kompanije future of good times test development engineer: da li je String osnovni tip podataka u Java-u, koji metodi ima String?
34.🌟Koje je razlika između String, StringBuilder i StringBuffer?
Preporučeno čitanje: StringBuffer i StringBuilder dva brata
String, StringBuilder i StringBuffer se u Java-i koriste za obradu string-ova, razlika između njih je šta je String immutable, najčešće se koristi u razvoju, kada se susretne sa velikim povezivanjem string-ova, koristi StringBuilder, neće kreirati mnogo novih objekata, StringBuffer je sličan StringBuilder-u, ali svaki metod ima dodat synchronized ključnu reč, stoga je thread-safe.
Kaži nešto o karakteristikama String-a
Stringobjekti su nepromenjivi. To znači, jednom kada seStringobjekat kreira, njegov sadržaj se ne može promeniti.- Svaka modifikacija
Stringobjekta (kao povezivanje, zamena itd.) zapravo kreira noviStringobjekat, umesto menjanja postojećeg. Ovo može dovesti do memorijskog i performanskog troška, naročito pri velikom broju operacija nad string-ovima.
Kaži nešto o karakteristikama StringBuilder-a
StringBuilderpruža niz metoda za dodavanje, brisanje, izmenu čitanja string-ova, ove operacije se direktno vrše na originalnom nizu karaktera string objekta, umesto kreiranja novog String objekta.StringBuildernije thread-safe. To znači da se bez eksterne sinhronizacije ne koristi u multithread okruženju.- U poređenju sa
String-om, prilikom čestih izmena string-ova,StringBuildermože pružiti bolje performanse. Povezivanje string-ova sa+u Java-i se zapravo ostvaruje krozStringBuilder.
Kaži nešto o karakteristikama StringBuffer-a
StringBuffer je sličan StringBuilder-u, ali StringBuffer je thread-safe, ispred svakog metoda dodat je synchronized ključna reč.
Sumirajte scenario upotrebe
- String: pogodan za scenario gde se sadržaj stringa neće menjati, na primer kao HashMap kluč.
- StringBuilder: pogodan za single-thread okruženje gde treba često menjati sadržaj stringa, na primer u loop-u za povezivanje ili izmenu string-ova, je savršena zamena za String.
- StringBuffer: sada se retko koristi, jer obično neće u multithread scenario-u često menjati sadržaj string-ova.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Yongyou Financial-a: koja je razlika između String StringBuffer StringBuilder?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora državnog preduzeća: koje su razlike između String,StringBuffer,StringBuilder
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: kaži nešto o razlici između String, StringBuilder, StringBuffer, zašto je dizajnirano ovako?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora ByteDance-a: koje su razlike između String,StringBuilder,StringBuffer, performanse
35.Koja je razlika između String str1 = new String("abc") i String str2 = "abc"?
Kada se direktno koristi dvostruki navodnik za dodelu vrednosti string promenljivoj, Java prvo proverava da li u string constant pool-u već postoji isti sadržaj.
Ako postoji, Java će dati novoj promenljivoj referencu na postojeći string u pool-u; ako ne postoji, kreira novi string, stavlja ga u pool, i daje promenljivoj referencu na njega.
Kada se koristi new String("abc") za kreiranje string-a, zapravo se desava u dva koraka:
- Prvi korak, prvo proveriti da li se string literal "abc" nalazi u string constant pool-u, ako nema onda ga kreira; ako već postoji, onda ga referencira.
- Drugi korak, u heap-u još jednom kreira novi string objekat, i inicializuje ga kao kopiju "abc"-a iz string constant pool-a.

To znači:
String s1 = "Chenmo Wang Er";
String s2 = "Chenmo Wang Er";
String s3 = new String("Chenmo Wang Er");
System.out.println(s1 == s2); // output true, jer s1 i s2 referenciraju isti objekat u string constant pool-u.
System.out.println(s1 == s3); // output false, jer s3 je eksplicitno kreiran kroz new, pokazuje na različite objekte u heap-u.Koliko objekata se kreira kroz String s = new String("abc")?
Ako se u string constant pool-u već nalazi jedan, onda se ne kreira novi, direktno se referencira; ako nema, onda se kreira jedan.
U heap-u se sigurno nalazi jedan, jer se svaki put kada se koristi new ključna reč, sigurno kreira jedan u heap-u.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora male kompanije: da li su jednaki direktno dodeljena String promenljiva i dodeljena kroz konstruktor poređenjem sa ==
36.Da li je String immutable klasa? Koji je način implementacije spajanja string-ova?
- Preporučeno čitanje: Zašto je Java string String nepromenjiv?
- Preporučeno čitanje: Najelegantnije Java string String spajanje
String je nepromenjiv, to znači da jednom kada se String objekat kreira, njegov tekstualni sadržaj ne može biti promenjen. Razlozi su sledeći:
①,Nepromenjivost čini String objekte bezbednijim u upotrebi. Budući da se string-ovi često koriste kao parametri prosleđeni drugim Java metodima, na primer mrežne konekcije, otvaranje fajlova itd.
Ako bi String bio promenjiv, vrednost parametra tih metoda bi mogla biti promenjena bez svesti, što bi dovelo do toga da se mrežna konekcija manipuliše, fajl se misteriozno menja itd.
②,Budući da se stanje nepromenjivog objekta ne menja, lakše ga je kesirati i ponovo koristiti. Pojava string constant pool-a je upravo zasnovana na ovom razlogu.
Kada se u kodu pojave isti string literal-i, JVM će osigurati da sve reference pokazuju na isti objekat u pool-u, čime štedi memoriju.
③,Budući da se sadržaj String-a ne menja, njegov hash vrednost je fiksnirana. To čini String objekat posebno pogodnim kao kluč HashMap-a ili HashSet-a, jer se hash vrednost računa samo jednom, poboljšavajući efikasnost operacija nad hash tabelom.
Koji je način implementacije spajanja string-ova?
Budući da je String nepromenjiv, stoga se spajanje string-ova kroz "+" operator kreiranjem novog string objekta.
Na primer:
String a = "hello ";
String b = "world!";
String ab = a + b;a i b su definisani kroz dvostruke navodnike, stoga će se nalaziti u string constant pool-u, dok se ab kroz "+" operator spaja, stoga će se u heap-u kreira novi objekat.

U Java 8, JDK je optimizovao spajanje string-ova kroz "+" operator, prilikom kompajliranja će se spajati kroz StringBuilder append metod.
Sledeći bytecode dobijen kroz javap -verbose komandu, jasno se može videti kreiranje StringBuilder-a i poziv append metoda.
stack=2, locals=4, args_size=1
0: ldc #2 // String hello
2: astore_1
3: ldc #3 // String world!
5: astore_2
6: new #4 // class java/lang/StringBuilder
9: dup
10: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
13: aload_1
14: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17: aload_2
18: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_3
25: returnTo znači, gore navedeni kod je ekvivalentan sa:
String a = "hello ";
String b = "world!";
StringBuilder sb = new StringBuilder();
sb.append(a);
sb.append(b);
String ab = sb.toString();Stoga, ako se uopšteno govori, nije tačno reći da se kroz plus spajanje string-ova kreira više String objekata. Zato što plus spajanje pri kompajliranju još uvek kreira jedan StringBuilder objekat, konačno poziv toString() metoda vraća novi String objekat.
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}Pored koristenja + operatora za spajanje string-ova, postoje i StringBuilder.append(), String.join() i drugi načini.
Preporučeno čitanje: Kako spajati string-ove?
Kako se osigurava da je String nepromenjiv?
Prvo, String klasa interno koristi privatni niz karaktera za čuvanje podataka o stringu. Ovaj niz karaktera se inicijalizuje pri kreiranju string-a, kasnije se ne dozvoljava promena.
private final char value[];Drugo, String klasa nema pružene javne metode koje mogu da menjaju sadržaj, metode poput concat koje izgleda kao da menjaju string, zapravo vraćaju novokreirani string objekat, a originalni string objekat ostaje nepromenjen.
public String concat(String str) {
if (str.isEmpty()) {
return this;
}
int len = value.length;
int otherLen = str.length();
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}Treće, String klasa sama je deklarisana kao final, to znači da se ne može naslediti. Ovo sprečava mogućnost da podklasa doda metode za menjanje sadržaja string-ova.
public final class String
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Xiaomi spring recruitment K: da li je String promenjiv, zašto je dizajnirano kao nepromenjiv
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: da li je String nepromenjiv? Zašto je nepromenjiv? Koji je benefit? Kako se osigurava nepromenjivost.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora JD.com-a: spajanje string-ova
37.Koja je uloga intern metoda?
U JDK izvornom kodu je već objašnjeno ovaj metod:
* <p>
* When the intern method is invoked, if the pool already contains a
* string equal to this {@code String} object as determined by
* the {@link #equals(Object)} method, then the string from the pool is
* returned. Otherwise, this {@code String} object is added to the
* pool and a reference to this {@code String} object is returned.
* <p>Značenje je vrlo lako razumeti:
- ako se sadržaj trenutnog string-a već nalazi u string constant pool-u (tj. equals() metod je true, tj. isti sadržaj), direktno se vraća string iz constant pool-a
- u suprotnom, ovaj String objekat se dodaje u pool, i vraća se referenca na ovaj String objekat
Integer
38.Integer a= 127,Integer b = 127;Integer c= 128,Integer d = 128;da li su jednaki?
- Preporučeno čitanje: IntegerCache
- Preporučeno čitanje: Duboko i plitko Java unboxing i boxing
a i b su jednaki, c i d nisu jednaki.
Ovo pitanje se tiče Java mehanizma automatskog boxing-a i Integer keš mehanizma.
Za prvi par:
Integer a = 127;
Integer b = 127;a i b su jednaki. Zato što Java prilikom automatskog boxing-a koristi Integer.valueOf() metod za kreiranje Integer objekata.
Integer.valueOf() metod koristi keš za Integer objekte čija je vrednost u opsegu od -128 do 127. Stoga, a i b zapravo referenciraju isti Integer objekat iz keš-a.
Za drugi par:
Integer c = 128;
Integer d = 128;c i d nisu jednaki. Zato što 128 prevazilazi opseg Integer keš-a (-128 do 127).
Stoga, prilikom automatskog boxing-a za c i d kreira dva različita Integer objekta, ona imaju različite memorijske adrese.
Može se proveriti kroz == operator:
System.out.println(a == b); // output true
System.out.println(c == d); // output falseDa bi se poredeli numericke vrednosti Integer objekata, treba koristiti equals metod, umeto == operatora:
System.out.println(a.equals(b)); // output true
System.out.println(c.equals(d)); // output trueKada se koristi equals metod, poređenje c i d će biti true, zato što equals poređeni numericke vrednosti, a ne memorijske adrese.
Šta je Integer keš?
Uzmi za primer Integer keš. Na osnovu prakse, većina operacija podataka se koncentriše na manji opseg vrednosti, stoga Integer ima keš pool, podrazumevani opseg je -128 do 127.

Kada se koristi automatski boxing da bi se kreirao Integer objekat u ovom opsegu, Java će direktno vratiti postojeći objekat iz keš-a, umesto da svaki put kreira novi. To znači, da sve Integer objekte u ovom opsegu zapravo referenciraju istu instancu objekta.
Glavni cilj Integer keš-a je poboljšanje performansi i smanjenje memorijske potrošnje. Za česte operacije nad malim celobrojnim vrednostima, krešom može značajno smanjiti broj kreiranja objekata.
Može se kroz dodatak -Djava.lang.Integer.IntegerCache.high=1000 pri pokretanju podesiti maksimalnu vrednost keš pool-a.

Kada je referenca Integer tipa, = desna strana je int osnovni tip, dolazi do automatskog boxing-a, zapravo se poziva Integer.valueOf() metod, ovaće pozvati IntegerCache.
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}IntegerCache je statička ugrađena klasa, u statičkom bloku će se inicijalizovati keširane vrednosti.
private static class IntegerCache {
……
static {
//kreiranje Integer objekta za čuvanje
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
……
}
}Da li je new Integer(10) == new Integer(10) jednako?
U Java-i, kada se porede new Integer(10) == new Integer(10), rezultat je false.
Zato što new ključna reč svaki put dodeljuje novi memorijski prostor za Integer objekat u heap-u, stoga su ovde kreirana dva različita Integer objekta, ona imaju različite memorijske adrese.
Kada se koristi == operator za poređenje ova dva objekta, zapravo se porede njihove memorijske adrese, a ne njihove vrednosti, stoga čak iako ova dva objekta predstavljaju istu numericiku vrednost (10), rezultat je false.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Xiaomi spring recruitment K: da li je new Integer(10) == new Integer(10) jednako, constant pool
39.Kako se String konvertuje u Integer? Koji je princip?
PS: ovaj pitanje mi se utiskalo da se ponekad pojavljuvalo u nekim razgovorima.
String konvertovanje u Integer, uglavnom postoji dva metoda:
- Integer.parseInt(String s)
- Integer.valueOf(String s)
Bez obzira koji metod, na kraju će se pozvati parseInt(String s, int radix) metod unutra Integer klase.
Ostavljajući po strani neke granice, pogledajmo osnovni kod:
public static int parseInt(String s, int radix)
throws NumberFormatException
{
int result = 0;
//da li je negativan broj
boolean negative = false;
//indeks i dužina niza karaktera
int i = 0, len = s.length();
……
int digit;
//proverava da li je dužina karaktera veća od 0, u suprotnom baca izuzetak
if (len > 0) {
……
while (i < len) {
// Accumulating negatively avoids surprises near MAX_VALUE
//vraća numericiku vrednost karaktera u navedenoj bazi (ovde je decimalni sistem)
digit = Character.digit(s.charAt(i++),radix);
//množenje brojne baze sa numericikom
result *= radix;
result -= digit;
}
}
//vraca odgovarajuću vrednost na osnovu toga da li je negativan ili ne
return negative ? result : -result;
}Nakon što se uklone suvišne granice (naravno, ove granice možeš da pogledaš, izvorni kod pokriva mnogo slučajeva), zapravo ostaje jednostavna iteracija niza karaktera i računanje, ali način računanja je malo neobičan, koristi se negativna vrednost za akumuliranje.

Object
40.Koji su česti metod Object klase?
U Java-i, često se koristi izraz "sve je objekat", "sve" se odnosi na sve klase u Java-i, a ove klase su sve podklase Object klase.
Object uglavnom pruža 11 metoda, grubo se mogu podeliti u šest kategorija:

Poređenje objekata:
①,public native int hashCode() : native metod, koristi se za vraćanje hash koda objekta.
public native int hashCode();Po ugovoru, objekti koji su jednaki moraju imati isti hash kod. Ako se overriding equals metod, takođe treba overriding hashCode metod. Može se koristiti Objects.hash() metod za generisanje hash koda.
public int hashCode() {
return Objects.hash(name, age);
}②,public boolean equals(Object obj): koristi se za poređenje da li su memorijske adrese dva objekta jednake.
public boolean equals(Object obj) {
return (this == obj);
}Ako se porede da li su vrednosti dva objekta jednake, treba overriding ovaj metod, na primer String klasa, Integer klasa itd. su overriding-ovale ovaj metod. Na primer, ako postoji Person klasa, mi smatramo da dok su god ime i uz isti, to je ista osoba, onda možemo ovako overriding equals metod:
class Person1 {
private String name;
private int age;
// izostavljen getter i setter metod
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Person1) {
Person1 p = (Person1) obj;
return this.name.equals(p.getName()) && this.age == p.getAge();
}
return false;
}
}Kopiranje objekata:
protected native Object clone() throws CloneNotSupportedException : native metod, vraća kopiju ovog objekta. Podrazumevana implementacija radi samo plitko kopiranje, i klasa mora implementirati Cloneable interfejs.
Object sam ne implementira Cloneable interfejs, stoga se ako se direktno poziva ovaj metod bez overriding clone metoda, događa se CloneNotSupportedException izuzetak.
Konverzija objekta u string:
public String toString(): vraća string reprezentaciju objekta. Podrazumevana implementacija vraća imeKlase@hexadecimalniReprezentacijaHashKoda, ali se obično overriding da bi se vratio značajniji informacija.
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}Na primer, za Person klasu, možemo overriding toString metod, da bi vratili značajan string:
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}Naravno, ovaj posao možeš prepustiti IDE-u, na primer IntelliJ IDEA, direktno desni klik izaberi Generate, zatim izaberi toString metod, automatski će se generisati toString metod.
Takođe možeš prepustiti Lombok-u, koristiti @Data anotaciju, ova će automatski generisati toString metod.
Niz je takođe objekat, stoga obično kada štampamo niz, možemo videti string poput [I@1b6d3586, ovo je hash kod int niza.
Multithread raspoređivanje:
Svaki objekat može da poziva Object wait/notify metode da bi ostvario mehanizam wait/notify. Napišimo jedan primer:
public class WaitNotifyDemo {
public static void main(String[] args) {
Object lock = new Object();
new Thread(() -> {
synchronized (lock) {
System.out.println("Nit 1: čekam");
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Nit 1: budna sam");
}
}).start();
new Thread(() -> {
synchronized (lock) {
System.out.println("Nit 2: budim");
lock.notify();
System.out.println("Nit 2: već sam probudio");
}
}).start();
}
}Objašnjenje:
- Nit 1 prvo izvršava, pozvala je
lock.wait()metod, pa ušla u stanje čekanja. - Nit 2 zatim izvršava, pozvala je
lock.notify()metod, pa je nit 1 probuđena.
①,public final void wait() throws InterruptedException: poziv ovog metoda dovodi do toga da tekuća nit čeka, dok druga nit ne pozove notify() ili notifyAll() metod ovog objekta.
②,public final native void notify(): buđi jednu nit koja čeka u monitor-u ovog objekta. Ako više niti čeka, bira se jedna nit za buđenje.
③,public final native void notifyAll(): buđi sve niti koje čeka u monitor-u ovog objekta.
④,public final native void wait(long timeout) throws InterruptedException: čeka timeout milisekundi, ako se u okviru timeout milisekundi ne probudi, automatski će se probudit.
⑥,public final void wait(long timeout, int nanos) throws InterruptedException: preciznije, čeka timeout milisekundi i nanos nanosekundi, ako se u okviru timeout milisekundi i nanos nanosekundi ne probudi, automatski će se probudit.
Refleksija:
Preporučeno čitanje: Ergov Java napredni put: mastering Java refleksiju
public final native Class<?> getClass(): koristi se za dobijanje informacija o klasu objekta, na primer ime klase. Na primer:
public class GetClassDemo {
public static void main(String[] args) {
Person p = new Person();
Class<? extends Person> aClass = p.getClass();
System.out.println(aClass.getName());
}
}Izlaz:
com.itwanger.PersonGarbage collection:
protected void finalize() throws Throwable: poziva se kada garbage collector odluči da očisti memoriju koju objekat zauzima. Koristi se za očišćenje resursa, ali Java ne preporučuje, jer je nepredvidiv i lako dovodi do problema, od Java 9 je deprecated.

- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Yongyou Financial-a: koji su česti metod Object klase?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: koje metode ima object, zašto hashCode i equals treba da se overriding zajedno, zašto ne overriding će izazvati kakve probleme, kada će se koristiti overriding hashCode scenario
Obrada izuzetaka
41.🌟Kolji je sistem obrade izuzetaka u Java-i?
Preporučeno čitanje: Jednom za svaki razumeti Java obradu izuzetaka
Sistem obrade izuzetaka u Java-i koristi se za obradu raznih mogućih izuzetaka tokom izvršavanja programa, uglavnom kroz try-catch-finally statement i throw ključnu reč.

Throwable je bazna klasa svih grešaka i izuzetaka u Java jeziku. Ima dve glavne podklase: Error i Exception, ove dve klase predstavljaju dve grane sistema obrade izuzetaka u Java-i.
Error klasa predstavlja ozbiljne greške, ove greške su obično ono što program ne može da obradi. Na primer, OutOfMemoryError znači nedostatak memorije, StackOverflowError znači overflow steka. Ove greške su obično vezane za runtime status JVM-a, jednom kada se dese, aplikacija obično ne može da se oporavi.
Exception klasa predstavlja izuzetke koje program može da obradi. Deli se na dve glavne kategorije: compile-time exceptions (Checked Exception) i runtime exceptions (Runtime Exception).
①,Compile-time exception (Checked Exception): ovi izuzeci moraju da se eksplicitno obrade (catch ilideklarisati bacati) prilikom kompajliranja.
Ako metod može da baci neki checked izuzetak, ali ga ne hvata (try-catch) ili ga ne declar-uje sa throws clause u metod deklaraciji, kompajliranje neće proći. Na primer: IOException, SQLException itd.
②,Runtime exception (Runtime Exception): ovi izuzeci se bacaju u runtime-u, sve su podklasse RuntimeException-a. Za runtime izuzetak, Java kompajler ne zahteva da se mora obraditi (tj. ne mora hvatati ni declar-ati throws).
Runtime izuzetak je obično izazvan logičkom greškom u kodu, kao NullPointerException, IndexOutOfBoundsException itd.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora JD.com-a: koja je razlika između Java compile-time izuzetka i runtime izuzetka
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora ByteDance-a: koje su kategorije izuzetaka?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora ByteDance-a: čija su podklasa Error i Exception?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora WeBank-a: koliko razumeš o sistem izuzetaka?
- Prijatelji iz Erge programerske planete prijatelj Zhen Yun Mian Meituan AI razgovor originalno pitanje: šta je obrada izuzetaka u java-i, koja je razlika između checked izuzetka i unchecked izuzetka
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora JD.com-a: koje su izuzetke sretao u razvoju, kategorije nadređene tipove izuzetaka, relacije nasleđivanja itd., kako da se obrade izuzetci prilikom pisanja programa?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Pinduoduo-a: sličnosti i razlike između error i exception, da li se program ne može izvršavati kada se baci error
42.Kolji su načini obrade izuzetaka?

①,Kada se susretne sa izuzetkom, može se ne obrađivati, direktno proslediti kroz throw i throws, pa gornji sloj da obradi.
throws ključna reč se koristi za declaration mogućih izuzetaka, dok throw ključna reč se koristi za bacanje izuzetka.
public void test() throws Exception {
throw new Exception("Bacanje izuzetka");
}②,Koristiti try-catch da hvata izuzetak, obraditi izuzetak.
try {
//sadrži kod koji može da baci izuzetak i metod koji declar-uje izuzetak
}catch(Exception e) {
//hvata izuzetak i obrađuje ga
}finally {
//opciono, kod koji se mora izvršiti
}Da li catch i finally mogu u isto vreme da bacaju izuzetak?
Ako catch blok baci izuzetak, a finally blok takođe baci izuzetak, konačno će se baciti izuzetak iz finally bloka. Izuzetak iz catch bloka će biti odbačen, a izuzetak iz finally bloka će ga prekriti i proslediti se naviše.
public class Example {
public static void main(String[] args) {
try {
throw new Exception("Izuzetak u try");
} catch (Exception e) {
throw new RuntimeException("Izuzetak u catch");
} finally {
throw new IllegalArgumentException("Izuzetak u finally");
}
}
}- Try blok prvo baca Exception.
- Kontrola ulazi u catch blok, catch blok ponovo baca RuntimeException.
- Ali u finally bloku se baca IllegalArgumentException, konačno program baca izuzetak iz finally bloka IllegalArgumentException.
Iako catch i finally ne mogu u isto vreme da bacaju izuzetak, može se ručno hvatati izuzetak iz finally bloka i zadržati izuzetak iz catch bloka, da se ne bi prekrio. Uobičajen način je koristiti jednu promenljivu da privremeno čuva izuzetak iz catch bloka, zatim u finally bloku obraditi taj izuzetak:
public class Example {
public static void main(String[] args) {
Exception catchException = null;
try {
throw new Exception("Izuzetak u try");
} catch (Exception e) {
catchException = e;
throw new RuntimeException("Izuzetak u catch");
} finally {
try {
throw new IllegalArgumentException("Izuzetak u finally");
} catch (IllegalArgumentException e) {
if (catchException != null) {
System.out.println("Catch izuzetak: " + catchException.getMessage());
}
System.out.println("Finally izuzetak: " + e.getMessage());
}
}
}
}
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora JD.com-a: kako da se obrade izuzetci prilikom pisanja programa?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Pinduoduo-a: try-catch-finally baca izuzetak, da li catch i finally mogu u isto vreme da bacaju izuzetak?
43.Tri klasična kod pitanja o obradi izuzetaka
Pitanje 1
public class TryDemo {
public static void main(String[] args) {
System.out.println(test());
}
public static int test() {
try {
return 1;
} catch (Exception e) {
return 2;
} finally {
System.out.print("3");
}
}
}U test() metod-u, prvo postoji try blok, zatim catch blok (za hvatanje izuzetka), konačno finally blok (bez obzira da li je izuzetak uhvaćen ili ne, finally blok se uvek izvršava).
①,try blok sadrži return 1; iskaz. U normalnim uslovima, ako kod u try bloku može da se uspešno izvrši, metod će vratiti broj 1. U ovom primeru, try blok ne sadrži operacije koje mogu da bace izuzetak, stoga će se normalno izvršiti i pripremiti za povraćanje 1.
②,Budući da se u try bloku nije desio izuzetak, kod u catch bloku se neće izvršiti.
③,Bez obzira da li se desio izuzetak u prethodnom kodu, finally blok se uvek izvršava. U ovom primeru, finally blok sadrži System.out.print("3"); iskaz, što znači da pre nego što metod završi, na konzoli će se ispisati 3.
Kada se izvršava main metod, ispis na konzoli će biti:
31Zato što finally blok osigurava da će se izvršiti System.out.print("3"); ispisati 3, zatim test() metod vraća vrednost 1 iz try bloka, konačni rezultat je 31.
Pitanje 2
public class TryDemo {
public static void main(String[] args) {
System.out.println(test1());
}
public static int test1() {
try {
return 2;
} finally {
return 3;
}
}
}Rezultat izvršavanja: 3.
try se vraća pre izvršavanja finally, ali se u finally ne pridržava pravila, direktno return, stoga se ne može stići do return-a u try.
Napomena: koristeće return u finally-u postoji samo u razgovornim pitanjima, u stvarnom razvoju ako se ovako napiše, biće pretučen.
Pitanje 3
public class TryDemo {
public static void main(String[] args) {
System.out.println(test1());
}
public static int test1() {
int i = 0;
try {
i = 2;
return i;
} finally {
i = 3;
}
}
}Rezultat izvršavanja: 2.
Možda mislite da rezultat treba biti 3, jer se pre return-a izvršava finally, a i je modifikovan u finally na 3, pa konačni return i ne bi trebalo biti 3?
Ali zapravo, JVM će prvo privremeno sačuvati rezultat i pre izvršavanja finally-a, nakon što se finally završi, vraća se prethodno sačuvani rezultat, a ne i, stoga čak iako je i već modifikovan na 3, konačni return je ipak prethodno sačuvani rezultat 2.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora JD.com-a: da li se prvo izvršava return ili finally
I/O
44.Kolje se deli I/O tok u Java-i?
Java I/O tokovi mogu da se podele na više dimenzija, uključujući smer toka podataka (ulazni ili izlazni), jedinicu obrade podataka (bajt ili karakter), funkciju toka i da li tok podržava random pristup itd.
Kako se podele s po gledištu smera toka podataka?
- Ulazni tok (Input Stream): čita podatke iz izvora (kao fajl, mreža itd.) u program.
- Izlazni tok (Output Stream): piše podatke iz program-a u odredište (kao fajl, mreža, konzola itd.).
Kako se podele s po gledištu jedinice obrade podataka?
- Bajt tokovi (Byte Streams): čitaju i pišu podatke u bajtovima, uglavnom koriste se za obradu binarnih podataka, kao audio fajlovi, fajlovi slika itd.
- Karakter tokovi (Character Streams): čitaju i pišu podatke u karakterima, uglavnom koriste se za obradu tekstualnih podataka.

Kako se podele s po gledištu funkcije?
- Node tokovi (Node Streams): direktno povezani sa izvorom ili odredištem podataka, kao FileInputStream, FileOutputStream.
- Processing tokovi (Processing Streams): vrše wrapping postojećeg toka, kao BufferedInputStream, BufferedOutputStream.
- Piped tokovi (Piped Streams): koriste se za prenos podataka između niti, kao PipedInputStream, PipedOutputStream.
Kolji dizajn pattern se koristi u I/O tok-ovima?
Koristi se——Dekorator pattern, ključna ideja dekorator pattern-a je da se dinamički dodaju nove funkcionalnosti objektu bez menjanja njegove postojeće strukture.

Konkretno u Java I/O-u, InputStream i OutputStream ove apstraktne klase definišu osnovne čitanje i pisanje operacije, zatim kroz razne dekorator klase pojačavaju funkcionalnost. Na primer, BufferedInputStream dodaje funkcionalnost bafera na osnovni ulazni tok, DataInputStream dodaje mogućnost čitanja osnovnih tipova podataka, ove sve su dekoracije i pojačavanja osnovnog toka.
InputStream input = new BufferedInputStream(
new DataInputStream(
new FileInputStream("data.txt")
)
);Ovde FileInputStream pruža osnovnu mogućnost čitanja fajlova, DataInputStream ga dekorira dodajući funkcionalnost konverzije tipova podataka, BufferedInputStream ga još jednom dekorira dodajući funkcionalnost bafera. Svaki sloj dekoracije dodaje nove karakteristike na osnovu prethodnih funkcionalnosti, i može se fleksibilno kombinovati.
Moje razumevanje dekorator pattern-a je da dobro reflektuje dizajn princip "kompozicija je bolja od nasleđivanja". Prednost je u tome što se funkcionalnost može dinamički kombinovati u runtime-u, i sledi principle otvorenosti i zatvorenosti, može se dodati nove funkcionalnosti bez menjanja postojećeg koda.
memo: 19. septembra 2025. izmenjeno do ovde, danas jedan prijatelj iz planete je u VIP grupi javio da je dobio offer od Meituan-a, čestitam mu! Septembar je upravo sezon žetve, svi se morate potrudi.

Kako se sprečava Java overflow bafera?
Java overflow bafera se uglavnom dešava zbog toga što se u bafer piše više podataka nego što može da skladišti. Može se preduzeti nekoliko mera:
①,Razumno podesiti veličinu bafera: pri kreiranju bafera, treba razumno podesiti veličinu bafera na osnovu stvarnih potreba, izbegavati kreiranje prevelikog ili premalog bafera.
②,Kontrolisati količinu upisanih podataka: pri upisivanju podataka u bafer, treba kontrolisati količinu upisanih podataka, osiguravati da ne prevazilazi kapacitet bafera. Java ByteBuffer klasa pruža remaining() metod, koji može da dobije preostalu količinu podataka koja se može upisati u bafer.
import java.nio.ByteBuffer;
public class ByteBufferExample {
public static void main(String[] args) {
// simulacija primljenih podataka
byte[] receivedData = {1, 2, 3, 4, 5};
int bufferSize = 1024; // podesiti razumenu veličinu bafera
// kreirati ByteBuffer
ByteBuffer buffer = ByteBuffer.allocate(bufferSize);
// pre upisa podataka proveriti da li ima dovoljno kapaciteta
if (buffer.remaining() >= receivedData.length) {
buffer.put(receivedData);
} else {
System.out.println("Nema dovoljno prostora u baferu za upis podataka.");
}
// pripremiti za čitanje: postaviti limit na trenutnu poziciju, position vratiti na 0
buffer.flip();
// čitati podatke
while (buffer.hasRemaining()) {
byte data = buffer.get();
System.out.println("Pročitani podaci: " + data);
}
// očistiti bafer kako bi se mogao ponovo koristiti
buffer.clear();
}
}
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: Kolje se deli Java I/O tok?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Huawei-a: Kako se sprečava Java overflow bafera
45.Zašto postoji karakter tok pored bajt toka?
Zato što se karakter tokovi u Java-u dobijaju konvertovanjem bajtova u karaktere, ovaj proces je vreme trošeći i ako se ne zna tip kodiranja, lako dolazi do problema o grešci (charset).
Stoga, I/O tok jednostavno pruža interfejs za direktno rad sa karakterima, povoljno nam za uobičajene karakter tok operacije. Ako se radi o audio fajlovima, slikama itd. medijskim fajlovima, bolje je koristiti bajt tok, ako se radi o karakterima, bolje je koristiti karakter tok.
Da li se tekstualni skladišti kao bajt tok ili kao karakter tok, a video fajlovi?
U računaru, i tekst i video se skladište kao bajtovi, samo ako se radi o tekst fajlu, možemo ga čitati kroz karakter tok, tako je povoljnije za direktne procese.
Na primer, ako treba da pronađemo određeni string u velikom tekst fajlu, možemo direktno ga pročitati kroz karakter tok i prosuditi.
Prilikom procesiranja video fajlova, obično se koriste bajt tokovi (kao FileInputStream, FileOutputStream u Java-i) za čitanje ili pisanje podataka, i po mogućnosti se koriste buffered tokovi (kao BufferedInputStream, BufferedOutputStream) da bi se poboljšala efikasnost čitanja i pisanja.
U Tehničkifrakcija projektu vežbanja, za tekst, na primer sadržaj članaka i tutorijala, čuva se direktno u bazi podataka, a za video i slike i druge velike fajlove, čuvaju se u OSS-u.
Stoga, bilo da se radi o tekst fajlovima ili video fajlovima, na fizskom nivou skladištenja postoje kao bajt tokovi. Razlika je u tome kako kroz Java kod interpretamo i obrađujemo ove bajt tokove: kao kodirane karaktere ili kao binarne podatke.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora državnog preduzeća: da li se tekstualni skladišti kao bajt tok ili karakter tok, a video fajlovi?
46.🌟Koje su razlike između BIO-a, NIO-a i AIO-a?
Preporučeno čitanje: Šta je Java NIO bolje od tradicionalnog I/O-a?
Java uobičajeno ima tri I/O modela: BIO, NIO i AIO.

BIO: koristi blocking I/O model, nit se blokira prilikom izvršavanja I/O operacija, ne može da obraduje druge zadatke, pogodno za scenario sa manjim brojem konekcija.
NIO: koristi non-blocking I/O model, nit može da obrađuje druge zadatke dok čeka I/O, kroz Selector nadgleda događaje na više Channel-a, pogodno za scenario sa više konekcija ali kratkim vremenom konekcije.
AIO: koristi asinhroni I/O model, nakon što nit pokrene I/O zahtev odmah se vraća, kada se I/O operacija završi kroz callback funkciju obaveštava nit, pogodno za scenario sa više konekcija i dugim vremenom konekcije.
Kaži nešto o BIO-u?
BIO, tj. traditionalni I/O, baziran na bajt ili karakter tok-ovima (kao FileInputStream, BufferedReader itd.) za čitanje i pisanje fajlova, baziran na Socket i ServerSocket za mrežnu komunikaciju.
Za svaku konekciju, potreban je posebna nit za obradu čitanja i pisanja.

Kaži nešto o NIO-u?
NIO, uveden u JDK 1.4, smešten u java.nio paket, pruža nove apstrakcije kao što su Channel, Buffer, Selector, baziran na RandomAccessFile, FileChannel, ByteBuffer za čitanje i pisanje fajlova, baziran na SocketChannel i ServerSocketChannel za mrežnu komunikaciju.
U stvari, "stari" I/O paket je već implementiran kroz NIO, stoga prilikom čitanja i pisanja fajlova, NIO ne može značajno da iskaže bolji performanse od BIO-a.
Naminje NIO-a se ogleda u mrežnom programiranju, server može jednom nitom da obraduje više klijentskih konekcija, kroz Selector koji sluša više Channel-a da ostvari multiplexing, znatno poboljšavajući performanse mrežnog programiranja.

Buffer može značajno poboljšati efikasnost jedne I/O operacije.

Kaži nešto o AIO-u?
AIO je uveden u Java 7, smešten u java.nio.channels paket, pruža asinhrone Channel-e kao što su AsynchronousFileChannel, AsynchronousSocketChannel itd.
Uveo je koncept asinhronog Channel-a, tako da I/O operacije mogu da se obavljaju asinhrono. To znači da nakon što nit pokrene čitanje ili pisanje, ne mora da čeka završetak, može odmah da pređe na druge zadatke, i kada se zaista završi čitanje ili pisanje, nit će biti asinhrono obaveštena.
AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(Paths.get("test.txt"), StandardOpenOption.READ);
ByteBuffer buffer = ByteBuffer.allocate(1024);
Future<Integer> result = fileChannel.read(buffer, 0);
while (!result.isDone()) {
// radi nešto
}
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora BYD-a: koja je razlika između BIO NIO-a
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: koje su razlike između BIO-a, NIO-a i AIO-a?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora 360-e: kaži nešto o blokirajućem i neblokirajućem I/O-u - rekao sam o BIO-u i NIO-u
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Alibaba Cloud-a: intro NIO BIO AIO
Serijalizacija
47.Šta je serijalizacija? Šta je deserijalizacija?
Serijalizacija (Serialization) je proces konvertovanja objekta u bajt tok, kako bi se mogao sačuvati u fajl, bazu podataka, ili se transportovao kroz mrežu.
Deserijalizacija (Deserialization) je proces konvertovanja bajt tok-a nazad u objekat, kako bi se rekonstruisao originalni objekat.

Koja je uloga Serializable interfejsa?
Serializable interfejs se koristi za markiranje da klasa može da se serijalizuje.
public class Person implements Serializable {
private String name;
private int age;
// izostavljen getter i setter metod
}Koja je uloga serialVersionUID-a?
serialVersionUID je jedinstveni identifikator verzije klase u mehanizmu Java serijalizacije. Njegova uloga je da osigura da su verzije klasa kompatibilne tokom serijalizacije i deserijalizacije.
import java.io.Serializable;
public class MyClass implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
// getters and setters
}serialVersionUID je podešen na 1L, ovo je relativno lako rešenje, takođe može koristiti Intellij IDEA za automatsko generisanje.
Dokle serialVersionUID ostaje konzistentan tokom serijalizacije i deserijalizacije, neće biti problema.
Ako se eksplicitno ne deklariše serialVersionUID, Java runtime će automatski generisati jedan na osnovu detaljnih informacija o klasi. Tada, kada se struktura klase promeni, automatski generisani serialVersionUID će se takođe promeniti, što će dovesti do neuspeha deserijalizacije.
Da li Java serijalizacija ne uključuje statičke promenljive?
Da, mehanizam serijalizacije čuva samo stanje objekta, a statičke promenljive pripadaju stanju klase, ne stanju objekta.
Ako neke promenljive ne želite da serijalizujete, šta da radite?
Može se koristiti transient ključna reč za modifikovanje promenljive koju ne želite da serijalizujete.
public class Person implements Serializable {
private String name;
private transient int age;
// izostavljen getter i setter metod
}Možeš li da objasniš proces i ulogu serijalizacije?
Proces serijalizacije obično uključuje sledeće korake:
Prvi korak, implementirati Serializable interfejs.
public class Person implements Serializable {
private String name;
private int age;
// izostavljen konstruktor, getters i setters
}Drugi korak, koristiti ObjectOutputStream da bi se objekat zapisao u izlazni tok.
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"));Treći korak, pozvati writeObject metod ObjectOutputStream-a, da bi se objekat serijalizovao i zapisao u izlazni tok.
Person person = new Person("Chenmo Wang Er", 18);
out.writeObject(person);
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora JD.com-a: da li ste koristili serijalizaciju i deserijalizaciju?
- Prijatelji iz Erge programerske planete prijatelj Zhen Yun Mian Meituan AI razgovor originalno pitanje: da li razumesh Java serijalizaciju i deserijalizaciju, možeš li da objasniš proces i ulogu serijalizacije
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora vivo-a: šta je serijalizacija, šta je deserijalizacija
48.Kolji načina serijalizacije postoje?
Postoji mnogo načina Java serijalizacije, uglavnom tri česta:

- Java objekat serijalizacija : Java nativni metod serijalizacije, tj. kroz Java nativni tok (konverzija između InputStream i OutputStream), uglavnom kroz objekat izlazni tok
ObjectOutputStreami objekat ulazni tokObjectInputStream. - Json serijalizacija: ovo je možda najčešći način serijalizacije koji koristimo, izbor Json serijalizacije je veliki, uglavnom će se koristiti jackson paket, kroz ObjectMapper klasu za neke operacije, na primer konvertovanje objekta u bajt niz ili konvertovanje json niza u objekat.
- ProtoBuff serijalizacija: ProtocolBuffer je lagan i efikasan format strukturiranih podataka za skladištenje, ProtoBuff serijalizacija objekta može ga veliko kompresovati, može značajno smanjiti veličinu prenosa podataka, poboljšati performanse sistema.
Mrežno programiranje
49.Da li ste čuli za Socket mrežni utičnik? (dodatak)
- novembra 2024. dodato
Preporučeno čitanje: Java Socket: mrežni utičnik za prenošenje golubice
Socket je osnova mrežne komunikacije, predstavlja krajnju tačku komunikacije između dva uređaja. Socket se obično koristi za uspostavljanje TCP ili UDP konekcije, ostvarujući procesnu mrežnu komunikaciju.

Jednostavan TCP klijent:
class TcpClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 8080); // povezivanje sa serverom
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Zdravo, Server!"); // slanje poruke
System.out.println("Server response: " + in.readLine()); // primanje odgovora servera
socket.close();
}
}TCP server:
class TcpServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080); // kreiranje server soketa
System.out.println("Server pokrenut, čekam konekciju...");
Socket socket = serverSocket.accept(); // čekanje konekcije klijenta
System.out.println("Klijent povezan: " + socket.getInetAddress());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
String message;
while ((message = in.readLine()) != null) {
System.out.println("Primljeno: " + message);
out.println("Echo: " + message); // vraćanje poruke
}
socket.close();
serverSocket.close();
}
}Da li znate za RPC framework?
RPC je protokol koji dozvoljava programima da pozivaju metode na udaljenom serveru kao da pozivaju lokalne metode. RPC se obično realizira na osnovu Socket komunikacije.
RPC, Remote Procedure Call, udaljeno pozivanje procedure
RPC framework podržava efikasnu serijalizaciju (kao Protocol Buffers) i komunikacioni protokol (kao HTTP/2), sakriva detalje donjeg sloja mrežne komunikacije, programeri se samo fokusiraju na business logiku.

Česti RPC framework-i uključuju:
- gRPC: baziran na HTTP/2 i Protocol Buffers.
- Dubbo: Alibaba open source distriburani RPC framework, pogodan za microservice scenario.
- Spring Cloud OpenFeign: lagan RPCframework baziran na REST-u.
- Thrift: Apache cross-language RPC framework, podržava generisanje koda za više jezika.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Li Auto: koje su komunikacione metode u nit-i? Koje su komunikacione metode između niti?
Generici
50.Da li znate za Java generike?
Preporučeno čitanje: Ručno pisati Java generike, potpuno ih savladati
Generici se uglavnom koriste za poboljšanje type safety-a koda, dozvoljavajući da se prilikom definisanja klasa, interfejsa i metoda koriste tip parametri, čime se mogu u compile vremeni proveriti tip konsistenciju, izbegavajući nepotrebne tip konverzije i tip greške.
Bez generika, kolekcione klase kao što je List čuvaju Object tip, stoga se prilikom čitanja podataka iz kolekcije mora vršiti forsirana tip konverzija, inače će se desiti ClassCastException.
List list = new ArrayList();
list.add("hello");
String str = (String) list.get(0); // mora vršiti forsiranu tip konverzijuGenerici se uglavnom koriste na tri načina:generička klasa,generički interfejs,generički metod.

1.Generička klasa:
//ovde T može biti bilo koji identifikator, česti kao T, E, K, V itd. parametri se često koriste za reprezentaciju generičkog tipa
//prilikom instanciranja generičke klase, mora specificirati konkretni tip T
public class Generic{
private T key;
public Generic(T key) {
this.key = key;
}
public T getKey(){
return key;
}
}Kako da se instancira generička klasa:
Generic<Integer> genericInteger = new Generic<Integer>(123456);2.Generički interfejs :
public interface Generator {
public T method();
}Implementacija generičkog interfejsa, specificiranje tipa:
class GeneratorImpl<T> implements Generator<String>{
@Override
public String method() {
return "hello";
}
}3.Generički metod :
public static < E > void printArray( E[] inputArray )
{
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}Korišćenje:
// kreiranje različitih tipova nizova: Integer, Double i Character
Integer[] intArray = { 1, 2, 3 };
String[] stringArray = { "Hello", "World" };
printArray( intArray );
printArray( stringArray );Koji su uobičajeni wildcard karakteri za generike?
Uobičajeni wildcard karakteri su: T, E, K, V, ?
- ? predstavlja neodređeni java tip
- T (type) predstavlja jedan konkretni java tip
- K V (key value) redom predstavljaju Java Key Value u paru ključ-vrednost
- E (element) predstavlja Element
Šta je type erasure?
Tzv. generikbrisanje, zvanični naziv je "type erasure".
Java generici su pseudo-generics, zato što se u compile vremeni svi tip informacija brišu.
To znači, u runtime-u ne postoje generici.
Na primer, ovaj kod, staviti psa u gomilu mačaka:
LinkedList<Cat> cats = new LinkedList<Cat>();
LinkedList list = cats; // ovde sam uklonio generik, ali list i cats su ista lista!
list.add(new Dog()); // potpuno u redu!Zato što Java generici postoje samo u izvornom kodu, kompajler statički proverava da li su tipovi generika ispravni, a u runtime-u se ne proverava. Gore navedeni kod za JRE (Java runtime environment) izgleda isto kao i ovaj kod:
LinkedList cats = new LinkedList(); // napomena: nema generika!
LinkedList list = cats;
list.add(new Dog());Zašto postoji type erasure?
Uglavnom radinazad kompatibilannosti, zato što pre JDK5 nije bilo generika, da bi se JVM ostaonazad kompatibilan, uveden je strategija type erasure.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora OPPO-a: koja je uloga generika?
Anotacije
51.Šta znaš o anotacijama?
Java anotacija je u suštini mark, može se razumeti kao mali ukras u životu, na primer koju šešir nosi, koju naocale nosi.

Anotacije se mogu markirati na klasama, metodima, atributima itd., i same mark-e mogu da postave neke vrednosti, na primer boja kape je zelena.
Nakon što se imaju mark-e, možemo u compile ili runtime fazi da prepoznamo ove mark-e, pa nešto da radimo, ovo je uloga anotacija.
Na primer, česti AOP, koristeći anotaciju kao tačku preseca je primena runtime anotacija; na primer lombok, je primena anotacija u compile vremenu.
Postoje tri glavne kategorije životnog ciklusa anotacija:
- RetentionPolicy.SOURCE: za kompajler, ne upisuje u class fajl
- RetentionPolicy.CLASS: upisuje se u class fajl, baca se u fazi učitavanja klase, tj. u runtime-u nema ove informacije
- RetentionPolicy.RUNTIME: upisuje se u class fajl, trajno čuvati, može se dobiti informacije o anotaciji kroz refleksiju
Stoga sam gore napisao "prilikom parsing-a", nisam napisao šta konkretno parsing, zato što različite životne cikluse imaju različite parsing radnje.
Kao česte:

su za kompajler, kompajler pri kompajliranju proverava da nema problema, over-u, u class fajlu neće biti Override mark-e.
Pored toga, Spring uobičajeni Autowired, je RUNTIME, dakle u runtime-u može kroz refleksiju dobiti informacije o anotaciji, i može dobiti vrednost mark-e required.

Refleksija
52.🌟Šta je refleksija? Aplikacije? Princip?
Refleksija dozvoljava Java-u da u runtime-u pregleda i operiše metodima i poljima klase. Kroz refleksiju, može dinamički da dobije informacije o poljima, metodima, konstruktorima klase, i u runtime-u poziva metode ili pristupa poljima.
Na primer, kreiranje objekta je kroz new ključnu reč:
Person person = new Person();Informacije o Person klasi su određene u compile vremenu, a ako se u compile vremenu ne može odrediti informacije o klasi, ali se u runtime-u želi da dobijete informacije o klasi, kreirate instancu klase, pozivate metod klase, tada treba koristiti refleksiju.
Refleksija se uglavnom ostvaruje kroz java.lang.Class klasu i klase u java.lang.reflect paketu kao što su Method, Field, Constructor itd.

Na primer, možemo dinamički da učitamo klasu i kreiramo objekat:
String className = "java.util.Date";
Class<?> cls = Class.forName(className);
Object obj = cls.newInstance();
System.out.println(obj.getClass().getName());Na primer, možemo ovako da pristupimo poljima i metodima:
// učitati i instancirati klasu
Class<?> cls = Class.forName("java.util.Date");
Object obj = cls.newInstance();
// dobiti i pozvati metod
Method method = cls.getMethod("getTime");
Object result = method.invoke(obj);
System.out.println("Time: " + result);
// pristupiti polju
Field field = cls.getDeclaredField("fastTime");
field.setAccessible(true); // za privatna polja treba uraditi ovako
System.out.println("fastTime: " + field.getLong(obj));Koje su scenario upotrebe refleksije?
①,Spring framework ekstenzivno koristi refleksiju za dinamičko učitavanje i upravljanje Bean-ova.
Class<?> clazz = Class.forName("com.example.MyClass");
Object instance = clazz.newInstance();②,Java mehanizam dinamičkog proxi koristi refleksiju za kreiranje proxi klase. Proxi klasa može u runtime-u dinamički da obrada pozive metoda, ovo je vrlo korisno pri realizaciji AOP-a i interceptor-a.
InvocationHandler handler = new MyInvocationHandler();
MyInterface proxyInstance = (MyInterface) Proxy.newProxyInstance(
MyInterface.class.getClassLoader(),
new Class<?>[] { MyInterface.class },
handler
);③,JUnit i TestNG test framework-i koriste mehanizam refleksije za otkrivanje i izvršavanje test metoda. Refleksija dozvoljava framework-u da skenira klasu, pronalazi metode sa određenim anotacijama (kao @Test), i u runtime-u ih poziva.
Method testMethod = testClass.getMethod("testSomething");
testMethod.invoke(testInstance);④,Najčešće je pisanje generičkih alatnih klasa, na primer alati za kopiranje objekata. Na primer BeanUtils, MapStruct itd. Mogu automatski da kopiraju ista imena atributa između dva objekta, ovo se ostvaruje kroz refleksiju.

Kolji je princip refleksije?
Svaka klasa nakon učitavanja u JVM, generiše odgovarajući Class objekat u metod oblasti, ovaj objekat sadrži sve metapodatke o klasi, kao što su polja, metodi, konstruktori, anotacije itd.
Kroz ovaj Class objekat, možemo u runtime-u dinamički da kreiramo objekte, pozivamo metode, pristupamo poljima.
Koje su prednosti i mane refleksije?
Prednosti refleksije su ipak vrlo jasne. Prvo je mogućnost dinamičke operacije klasa i objekata u runtime-u. Drugo je mogućnost pisanja generičkog koda, jedan kod može da obradi različite tipove objekata. Treće je mogućnost probijanja barrieri pristupa, pristupati i menjati private članove, ovo je korisno u scenario dekompajliranja.
Ali mane refleksije su takođe mnogo. Najvidljivija je performans problem, refleksija operacije su mnogo sporije od direktnog poziva, zato što u runtime-u treba parsirati informacije o klasi, vršiti proveru tipova, verifikaciju dozvola itd.
Drugo je to što refleksija može da zaobiđe kontrolu pristupa, pristupa i menja private članove, ovo može da uništi enkapsulaciju klase.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: da li ste koristili Java refleksiju?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: refleksija i scenario upotrebe
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Xiaomi-a: intro i upotreba scenario refleksije
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Meituan-a: mehanizam refleksije u java-i, scenario upotrebe refleksije, kolji je princip implementacije AOP-a, koja je razlika između dinamičkog proxi-ja i refleksije
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora BYD-a: java refleksija
memo: 27. septembra 2025. izmenjeno do ovde, danas dok sam pomagao prijatelju iz planete da menja biografiju, naišao sam na jednu povratnu informaciju, vrlo dirnuto: pre dva meseca sam bio posebno anksiozan i izgubljen, jednom sam potražio tatu (Erge) za savet, ti si mi rekao da ne brinem, prvo da radim, da apliciram, ta komunikacija me je razbudila, počeo sam da prestajem da zamisljam najgore rezultate, učim priprema za intervju u skladu sa biografijom, šaljem CV, konačno sam dobio poziv za razgovor, srećom sam i što sam naučio upripremi za intervju takođe je došao do koristi, mada nisam odjednom postao specijalista, ali zaista osećam da sam zreliji i stabilniji nego pre. U procesu učenja sam otkrio da zaista volim softversko inženjerstvo, mogu da ostvarim osećaje dostignuća, stoga sam posebno zahvalan tati (Erge) za stalnu pomoć svima.

JDK1.8 nove karakteristike
JDK je već izdao verziju 17, ali vi iterirate vašu verziju, ja koristim moju 8. Nove karakteristike JDK 1.8, sada nisu više nove, u stvarnom radu su već uobičajene.
53.Koje su nove karakteristike JDK 1.8?
JDK 1.8 dodao je mnogo novih karakteristika, kao što su Lambda izraz, default metod interfejsa, Stream API, API datuma i vremena, Optional klasa itd.

①,Java 8 dozvoljava dodavanje default metoda i statičkog metoda u interfejs.
public interface MyInterface {
default void myDefaultMethod() {
System.out.println("My default method");
}
static void myStaticMethod() {
System.out.println("My static method");
}
}②,Lambda izraz opisuje blok koda (ili anonimnu metodu), može ga se proslediti kao parametar konstruktoru ili običnom metodu za kasnije izvršavanje.
public class LamadaTest {
public static void main(String[] args) {
new Thread(() -> System.out.println("Chenmo Wang Er")).start();
}
}Autor "Effective Java" Josh Bloch preporučuje da pri korišćenju Lambda izraza najbolje ne prelazi 3 reda. U suprotnom će čitljivost koda postati vrlo loša.
③,Stream je pojačanje Java kolekcionog framework-a, pruža efikasan i lako za upotrebu način obrade podataka.
List<String> list = new ArrayList<>();
list.add("Kina, hajde!");
list.add("Svet, hajde!");
list.add("Svet, hajde!");
long count = list.stream().distinct().count();
System.out.println(count);④,Java 8 uveo je potpuno nov API datuma i vremena, smešten u java.time paket. Ovaj novi API popravlja mnoge nedostatke starog java.util.Date API-ja.
LocalDate today = LocalDate.now();
System.out.println("Današnji lokalni datum : " + today);
LocalTime time = LocalTime.now();
System.out.println("Lokalno vreme : " + time);
LocalDateTime now = LocalDateTime.now();
System.out.println("Trenutni datum i vreme : " + now);⑤,Uvođenje Optional-a je smanjilo NullPointerException.
Optional<String> optional = Optional.of("Chenmo Wang Er");
optional.isPresent(); // true
optional.get(); // "Chenmo Wang Er"
optional.orElse("Chenmo Wang San"); // "bam"
optional.ifPresent((s) -> System.out.println(s.charAt(0))); // "Chen"
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora China Merchants Bank-a: Koje su karakteristike JDK1.8?
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora Lenovo-a: Koja Java verzija update vam se najviše impressira
54.Šta znate o Lambda izrazu?
Lambda izraz se uglavnom koristi za pružanje jednostavnog načina za reprezentaciju anonimnih metoda, dajućići Java funkcionalno programiranje.
Na primer, možemo koristiti Lambda izraz da bi pojednostavili kreiranje niti:
new Thread(() -> System.out.println("Hello World")).start();Ovo je mnogo jednostavnije nego prethodna anonimna unutrašnja klasa.
Tzv. funkcionalno programiranje, značit prenositi funkciju kao parametar metodima, ili kao rezultat metoda. Na primer, možemo koristiti sa Stream tokom za filtriranje podataka:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());Gde n -> n % 2 == 0 je Lambda izraz. Znači prosleđivanje parametra n, vraća rezultat n % 2 == 0.
Koje su ugrađene funkcionalne interfejse u Java 8?
JDK 1.8 API sadrži mnogo ugrađenih funkcionalnih interfejsa. Među njima su Comparator i Runnable koje smo često viđali u starim verzijama, Java 8 im je dodao @FunctionalInterface anotaciju, da bi podržali Lambda izraz.
Pored ova dva, postoje i Callable, Predicate, Function, Supplier, Consumer itd.
- Java vodič za razgovor (plaćeni) uključuje originalno pitanje iz razgovora China Merchants Bank-a: Koja je uloga Lamada izraza?
55.Da li znate Optional?
Optional je za sprečavanje NullPointerException.
Može se razumeti Optional kao kontejner koji može sadržati objekat (može biti null, ili ne null), koga definismet metod, ovaj metod vraća objekat koji može biti prazan ili ne prazan, onda možete razmisliti o korisćenju Optional da ga pakujete, ovo je preporučena praksa u Java 8.
Optional<String> optional = Optional.of("bam");
optional.isPresent(); // true
optional.get(); // "bam"
optional.orElse("fallback"); // "bam"
optional.ifPresent((s) -> System.out.println(s.charAt(0))); // "b"56.Da li ste koristili Stream tok?
Stream tok, jednostavno rečeno, koristi java.util.Stream da obavlja razne operacije nad kolekcijom koja sadrži jedan ili više elemenata. Ove operacije mogu biti srednje operacije ili terminalne operacije. Terminalne operacije vraćaju rezultat, dok srednje operacije vraćaju Stream tok.
Stream tokovi se uglavnom koriste za kolekcije, mi vršimo nekoliko uobičajenih operacija nad kolekcijom:
List<String> stringCollection = new ArrayList<>();
stringCollection.add("ddd2");
stringCollection.add("aaa2");
stringCollection.add("bbb1");
stringCollection.add("aaa1");
stringCollection.add("bbb3");
stringCollection.add("ccc");
stringCollection.add("bbb2");
stringCollection.add("ddd1");- Filter filtriranje
stringCollection
.stream()
.filter((s) -> s.startsWith("a"))
.forEach(System.out::println);
// "aaa2", "aaa1"- Sorted sortiranje
stringCollection
.stream()
.sorted()
.filter((s) -> s.startsWith("a"))
.forEach(System.out::println);
// "aaa1", "aaa2"- Map konverzija
stringCollection
.stream()
.map(String::toUpperCase)
.sorted((a, b) -> b.compareTo(a))
.forEach(System.out::println);
// "DDD2", "DDD1", "CCC", "BBB3", "BBB2", "AAA2", "AAA1"- Match poklapanje
// proveriti da li u list-i string postoji string koji počinje sa a, nakon što se pronalazi prvi, odmah vraća true
boolean anyStartsWithA =
stringCollection
.stream()
.anyMatch((s) -> s.startsWith("a"));
System.out.println(anyStartsWithA); // true
// proveriti da li svi stringovi u list-i počinju sa a
boolean allStartsWithA =
stringCollection
.stream()
.allMatch((s) -> s.startsWith("a"));
System.out.println(allStartsWithA); // false
// proveriti da li nijedan string u list-i ne počinje sa z,
boolean noneStartsWithZ =
stringCollection
.stream()
.noneMatch((s) -> s.startsWith("z"));
System.out.println(noneStartsWithZ); // true- Count brojanje
count je terminalna operacija, može da izbroji totalan broj elemenata u stream toku, vraća tip long.
// prvo filtrirati stringove koje počinju sa b u list-i, pa onda izbrojiti količinu
long startsWithB =
stringCollection
.stream()
.filter((s) -> s.startsWith("b"))
.count();
System.out.println(startsWithB); // 3- Reduce
Reduce se prevodi kao: smanjiti, skratiti. Kroz ulazni Function, može da reduce-ira list-u u jednu vrednost. Njegov povratni tip je Optional tip.
Optional<String> reduced =
stringCollection
.stream()
.sorted()
.reduce((s1, s2) -> s1 + "#" + s2);
reduced.ifPresent(System.out::println);
// "aaa1#aaa2#bbb1#bbb2#bbb3#ccc#ddd1#ddd2"Ovo su nekoliko uobičajenih tok operacija, postoje i druge tok operacije, koje mogu pomoći lakše da obradimo kolekcione podatke.

- decembra 2024. druga verzija optimizacije je završena.
Recimo malo onome što mi je na srcu.
Na internetu zapravo postoji mnogopriprema za intervju, čak i plaćenih, svi kažu da su njihovi dobri.
Mislim da "Prevazilažeće na razgovoru" nije loše, ovo je na osnovu početne verzije gost iz planete Sanfen e, dodao sam sopstvenu razmišljanja, uključio više od 1000 autentičnih iskustava o razgovorima, od 24. generacije do 25. generacije, pomogao je bezbroj prijatelja da dobiju željeni offer, mislim da je ovo dovoljno.
Smram da sam se u procesu izrade "Prevazilažeća na razgovoru" potrošio mnogo truda, i zaista dobio neka priznanja od svih, vrlo sam zadovoljan.


Često mislim da sam miran čovek, ne volim da se nadmetam s drugima, a ne volim da namerno reklamiram svoje delo.
Volim da čekam da cveta.
Ako mislite da "Prevazilažeće na razgovoru" nije loše, možete reći mlađim drugovima i sestrama da postoji ovaj free materijal za učenje.
Još uvek ću nastaviti da ga unapređujem, ne znam kada će doći treća verzija, ali ću se potruditi.
Neka svi imaju svetlu budućnost.
Ovaj put će opet biti tri verzije, svetla, mračna i epub verzija. Prikažimo jednu epub verziju, neko prijatelji itek hitno trebaju ovu verziju, stoga ćemo i zadovoljiti sve.

Uključio sam Ergov "Java napredni put", "JVM napredni put", "napredni put konkurentnog programiranja", kao i sve verzije "Prevazilažeća na razgovoru", obuhvatajući 16 velikih tema: Java osnove, Java kolekcije, Java konkurentnost, JVM, Spring, MyBatis, računarske mreže, operativni sistemi, MySQL, Redis, RocketMQ, distriburane sisteme, microservices, dizajn pattern, Linux itd., ukupno preko 400.000 reči, preko 2000 ručno crtanih slika, zaista puno iskrenosti.
Detaljno objašnjenje 56 čestih pitanja za razgovor o Java osnovama, ovaj ćete razbiti intervjuer, mislim da je sigurno (ručni pas). Organizovao: Chenmo Wang Er, kliknite link za replikaciju, autor: Sanfen e, kliknite link originalnog teksta.
Ništa me ne zaustavlja — osim cilja, čak i ako na obali postoje ruže, zelena senka, mirna luka, ja sam brod bez veze.
Serijalni sadržaj:
- Prevazilažeće na razgovoru Java SE deo 👍
- Prevazilažeće na razgovoru Java kolekciona framework deo 👍
- Prevazilažeće na razgovoru Java konkurentno programiranje deo 👍
- Prevazilažeće na razgovoru JVM deo 👍
- Prevazilažeće na razgovoru Spring deo 👍
- Prevazilažeće na razgovoru Redis deo 👍
- Prevazilažeće na razgovoru MyBatis deo 👍
- Prevazilažeće na razgovoru MySQL deo 👍
- Prevazilažeće na razgovoru operativni sistem deo 👍
- Prevazilažeće na razgovoru računarske mreže deo 👍
- Prevazilažeće na razgovoru RocketMQ deo 👍
- Prevazilažeće na razgovoru distriburani deo 👍
- Prevazilažeće na razgovoru microservices deo 👍
- Prevazilažeće na razgovoru dizajn pattern deo 👍
- Prevazilažeće na razgovoru Linux deo 👍
- Prevazilažeće na razgovoru OpenClaw deo 👍
- Prevazilažeće na razgovoru Skills deo 👍
