
Kıdemsiz geliştirici pozisyonu için Soru-Cevap
Genel Sorular
1. Hangi tasarım modellerini biliyorsunuz? Bize işinizde kullandığınız iki tasarım modelinden bahsedin.
Çok çeşitli desenler var. Tasarım kalıplarını iyice tanımak isteyenler için "Önce Kafa. Tasarım Kalıpları" kitabını okumanızı tavsiye ederim. En temel tasarım kalıplarının detaylarını kolayca öğrenmenize yardımcı olacaktır. Bir iş görüşmesinde bahsedebileceğiniz tasarım kalıpları denilince aklınıza şunlar gelir:- Oluşturucu — sık kullanılan bir şablon, nesne oluşturmaya yönelik klasik yaklaşıma bir alternatif;
- Strateji — esas olarak polimorfizmi temsil eden bir kalıp. Yani, bir arayüzümüz var, ancak programın davranışı, işleve iletilen belirli arayüz uygulamasına bağlı olarak değişiyor (strateji kalıbı artık Java uygulamalarında hemen hemen her yerde kullanılıyor).
- Fabrika — bu kalıp, ApplicationContext'te (veya BeanFactory'de) bulunabilir;
- Singleton — tüm çekirdekler varsayılan olarak singleton'dur;
- Proxy — temel olarak, Spring'teki her şey bu modeli şu ya da bu şekilde kullanır, örneğin AOP;
- Sorumluluk zinciri — Spring Security'nin temelini oluşturan bir model;
- Şablon — Spring JDBC'de kullanılır.
Java Çekirdeği

2. Java'da hangi veri türleri vardır?
Java aşağıdaki ilkel veri türlerine sahiptir:- bayt — -128 ile 127 arasında değişen tamsayılar, 1 bayt yer kaplar;
- kısa — -32768 ile 32767 arasında değişen tamsayılar, 2 bayt yer kaplar;
- int — -2147483648 ile 2147483647 arasında değişen tamsayılar, 4 bayt yer kaplar;
- uzun — 9223372036854775808 ile 9223372036854775807 arasında değişen tamsayılar, 8 bayt yer kaplar;
- kayan nokta — -3,4E+38 ile 3,4E+38 arasında değişen kayan noktalı sayılar, 4 bayt yer kaplar;
- double — -1.7E+308 ile 1.7E+308 arasında değişen kayan noktalı sayılar, 8 bayt yer kaplar;
- char — UTF-16'daki tek karakterler, 2 bayt yer kaplar;
- boolean doğru/yanlış değerleri, 1 bayt yer kaplar.
3. Bir nesnenin ilkel veri türlerinden farkı nedir?
İlk fark, kullanılan bellek miktarıdır: ilkel öğeler çok az yer kaplar çünkü yalnızca kendi değerlerini içerirler, ancak nesneler çok sayıda farklı değer içerebilir - hem ilkel öğeler hem de diğer nesnelere referanslar. İkinci bir fark şudur: Java, nesne yönelimli bir dildir, dolayısıyla Java'daki her şey nesneler arasındaki bir etkileşimle çalışır. Primitifler buraya pek uymuyor. Aslında bu yüzden Java %100 nesne yönelimli bir dil değildir. İkinciden sonra gelen üçüncü fark, Java nesne etkileşimlerine odaklandığından, nesneleri yönetmek için birçok farklı mekanizmanın olmasıdır. Örneğin, yapıcılar, yöntemler, istisnalar (öncelikle nesnelerle çalışır), vb. Ve ilkellerin bu nesne yönelimli ortamda bir şekilde çalışmasına izin vermek için Java'nın yaratıcıları,ilkel türler için sarmalayıcılar ( Tamsayı , Karakter , Double , Boolean ...)4. Argümanları referansa göre ve değere göre iletmek arasındaki fark nedir?
İlkel alanlar değerlerini saklar: örneğin int i = 9 olarak ayarlarsak ; , o zaman i alanı 9 değerini saklar. Bir nesneye referansımız olduğunda, bu, nesneye referansı olan bir alanımız olduğu anlamına gelir. Yani nesnenin adresini hafızada saklayan bir alanımız var.
Cat cat = new Cat();
Bu, bir nesneye referansı olan alanların da değerleri sakladığı anlamına gelir . Değerleri bellek adresleridir. Yani cat , yeni Cat() nesnesinin bellek adresini saklar . Bir yönteme bir argüman ilettiğimizde değeri kopyalanır. Bir ilkel olması durumunda, ilkelin değeri kopyalanır. Buna göre, yöntem kopya ile çalışır. Kopya değiştirildiğinde, orijinal etkilenmez. Bir referans tipi olması durumunda, hafıza adresinin değeri kopyalanır. Buna göre, her iki referans değişkeni de aynı nesneye işaret eden adresleri saklayacaktır. Ve bu yeni referansı nesneyi değiştirmek için kullanırsak, o zaman eski referans için de değiştiğini bulacağız. Sonuçta ikisi de aynı nesneyi işaret ediyor.
5. JVM, JDK ve JRE nedir?
JVM , derleyici tarafından önceden oluşturulmuş Java bayt kodunu çalıştıran Java Sanal Makinesi anlamına gelir . JRE, Java Çalışma Zamanı Ortamı anlamına gelir . Temel olarak, Java uygulamalarını çalıştırmak için bir ortamdır. Java programlama dilinde yazılmış uygulamaları ve uygulamaları çalıştırmak için JVM'yi, standart kitaplıkları ve diğer bileşenleri içerir. Başka bir deyişle, JRE, derlenmiş bir Java programını çalıştırmak için gereken her şeyi içeren bir pakettir, ancak uygulama geliştirmek için derleyiciler veya hata ayıklayıcılar gibi araçları ve yardımcı programları içermez. JDK , JRE'nin bir uzantısı olan Java Development Kit'in kısaltmasıdır.. Yani sadece Java uygulamalarını çalıştırmak için değil, aynı zamanda onları geliştirmek için de bir ortamdır. JDK, JRE'deki her şeyin yanı sıra Java uygulamaları (Java belgeleri dahil) oluşturmak için gereken çeşitli ek araçları (derleyiciler ve hata ayıklayıcılar) içerir.
6. Neden JVM'yi kullanıyorsunuz?
Yukarıda belirtildiği gibi, Java Sanal Makinesi, derleyici tarafından önceden oluşturulmuş Java bayt kodunu çalıştıran sanal bir makinedir. Bu, JVM'nin Java kaynak kodunu anlamadığı anlamına gelir. İlk önce .java dosyalarını derliyoruz . Derlenen dosyalar .class'a sahiptiruzantısıdır ve artık JVM'nin anladığı bayt kodu biçimindedir. JVM, her işletim sistemi için farklıdır. JVM bayt kodu dosyalarını çalıştırdığında, bunları üzerinde çalıştığı işletim sistemine uyarlar. Aslında, farklı JVM'ler olduğundan, JDK (veya JRE) farklı işletim sistemleri için de farklılık gösterir (her sürümün kendi JVM'sine ihtiyacı vardır). Geliştirmenin diğer programlama dillerinde nasıl çalıştığını hatırlayalım. Bir program yazarsınız, ardından kodu belirli bir işletim sistemi için makine kodunda derlenir ve ardından onu çalıştırabilirsiniz. Yani her platform için programın farklı versiyonlarını yazmanız gerekiyor. Ancak Java'nın kodu çift işlemesi (kaynak kodun bayt koduna derlenmesi ve ardından bayt kodunun JVM tarafından işlenmesi), platformlar arası bir çözümün avantajlarından yararlanmanıza olanak tanır. Kodu bir kez oluşturup bayt koduna derliyoruz. Sonra onu herhangi bir işletim sistemine götürebiliriz ve yerel JVM onu çalıştırabilir. Ve bu kesinlikle Java'nın efsanevibir kez yaz, her yerde çalıştır özelliği.
7. Bayt kodu nedir?
Yukarıda söylediğim gibi, derleyici Java kodunu ara bayt koduna dönüştürür (.java uzantılı dosyalardan .class uzantılı dosyalara gideriz). Bytecode, komut setinin gerçek bir işlemci için değil, sanal bir işlemci için olması dışında birçok yönden makine koduna benzer. Bununla birlikte, programın üzerinde çalıştığı gerçek işlemci için komut yürütmeyi optimize eden bir JIT derleyicisi için tasarlanmış bölümler içerebilir. Anında derleme olarak da adlandırılan JIT derlemesi, program çalışırken bayt kodunu makine koduna veya başka bir formata derleyerek bir bayt kodu programının performansını artıran bir teknolojidir. Tahmin edebileceğiniz gibi, JVM bayt kodunu çalıştırdığında JIT derleyicisini kullanır. Bazı örnek bayt kodlarına bir göz atalım:
8. Bir JavaBean'in özellikleri nelerdir?
JavaBean , belirli kurallara uyan bir Java sınıfıdır. JavaBean yazmak için bazı kurallar şunlardır :-
Sınıf, genel erişim değiştiricisine sahip boş (argümansız) bir oluşturucu içermelidir . Bu yapıcı, herhangi bir gereksiz sorun olmaksızın sınıfın bir nesnesini yaratmayı mümkün kılar (böylece argümanlarla gereksiz yere uğraşmak olmaz).
-
Dahili alanlara , standart uygulamaya sahip olması gereken get ve set instance yöntemleriyle erişilir . Örneğin, bir ad alanımız varsa , o zaman getName ve setName , vb. olmalıdır. Bu, çeşitli araçların (çerçevelerin) fasulye içeriğini herhangi bir zorluk yaşamadan otomatik olarak almasına ve ayarlamasına olanak tanır.
-
Sınıf, equals() , hashCode() ve toString() yöntemlerini geçersiz kılmalıdır.
-
Sınıf seri hale getirilebilir olmalıdır. Yani Seri hale getirilebilir işaretleyici arabirimine sahip olmalı veya Externalizable arabirimini uygulamalıdır. Bu, çekirdeğin durumunun güvenilir bir şekilde kaydedilebilmesi, saklanabilmesi ve geri yüklenebilmesi içindir.

9. OutOfMemoryError nedir?
OutOfMemoryError , Java Virtual Machine (JVM) ile ilgili kritik bir çalışma zamanı hatasıdır. Bu hata, JVM bir nesne için yeterli bellek olmadığı için bir nesneyi ayıramadığında ve çöp toplayıcı daha fazla bellek ayıramadığında ortaya çıkar. Birkaç tür OutOfMemoryError :-
OutOfMemoryError: Java yığın alanı — nesne, yetersiz bellek nedeniyle Java yığınında ayrılamaz. Bu hataya bir bellek sızıntısı veya varsayılan yığın boyutunun geçerli uygulama için çok küçük olması neden olabilir.
-
OutOfMemoryError: GC Genel Yük sınırı aşıldı — uygulamanın verileri yığına zorlukla sığdığından, çöp toplayıcı her zaman çalışır ve Java programının çok yavaş çalışmasına neden olur. Sonuç olarak, çöp toplayıcı ek yük sınırı aşılır ve uygulama bu hatayla çöker.
-
OutOfMemoryError: İstenen dizi boyutu VM sınırını aşıyor — bu, uygulamanın yığın boyutunu aşan bir dizi için bellek ayırmaya çalıştığını gösterir. Yine, bu, varsayılan olarak yetersiz belleğin tahsis edildiği anlamına gelebilir.
-
OutOfMemoryError: Metaspace — öbekte meta veriler için ayrılmış alan kalmadı (meta veriler, sınıflar ve yöntemler için talimatlardır).
-
OutOfMemoryError: boyut baytlarını isteme nedeni. Takas alanı yetersiz — yığından bellek ayırmaya çalışırken bazı hatalar oluştu ve sonuç olarak yığında yeterli alan yok.
10. Yığın izleme nedir? Onu nasıl alırım?
Bir yığın izleme, bir uygulamanın yürütülmesinde bu noktaya kadar çağrılan sınıfların ve yöntemlerin bir listesidir. Bunu yaparak uygulamada belirli bir noktada yığın izlemesini alabilirsiniz:
StackTraceElement[] stackTraceElements =Thread.currentThread().getStackTrace();
Bu bize Son Giren İlk Çıkar (LIFO) düzeninde düzenlenmiş bir StackTraceElements dizisi sağlar . 
StackTraceElement[] stackTraceElements;
try{
...
} catch (Exception e) {
stackTraceElements = e.getStackTrace();
}
Konsolda bir istisnanın yığın izlemesini görüntülemek istiyorsak:
try{
...
} catch (Exception e) {
e.printStackTrace();
}
Ek olarak, bir hata, kontrol edilmeyen istisna veya işlenmeyen kontrol edilen istisna meydana gelirse, uygulama çöktüğünde konsolda istisnanın yığın izini otomatik olarak alırız. İşte konsoldaki yığın izlemenin küçük bir örneği: 

GO TO FULL VERSION