Java Mülakat Soruları

Mustafa KAPLAN
10 min readMay 15, 2022
java mülakat soruları

Java’nın en temel özellikleri nelerdir?

Taşınabilir: Java, “Write once, run anywhere” yaklaşımını destekler ve her makinede çalıştırılabilir.

Platform bağımsız: Java, platformdan bağımsız bir dildir.

Güvenli: Java, açık işaretçiler kullanmadığı için güvenlidir. ByteCode ve Exception işleme konseptini sağlaması da onu daha güvenli hale getirir.

Sağlam: Java, güçlü bellek yönetimi sistemi kullanır bu durum Java’yı güçlü hale getirir.

Yorumlanabilir: Java, programın yürütülmesi için derleyiciyle birlikte Just-in-time (JIT) yorumlayıcısını kullanır.

Yüksek Performans: Java, diğer geleneksel yorumlanmış programlama dillerinden daha hızlıdır çünkü Java bayt kodu yerel koda daha yakındır.

Çok iş parçacıklı: Birden çok iş parçacığı tanımlama sayesinde birçok görevi aynı anda gerçekleştiren Java programları yazılabilir.

Dağıtılmış: Java’nın dağıtılma özelliği sayesinde internetteki herhangi bir makineden yöntemleri arayarak dosyalara erişmemizi sağlanabilir.

JVM, JRE ve JDK arasındaki farklar nelerdir?

JVM (Java Virtual Machine): Java bayt kodunu çalıştırmak için bir çalışma zamanı ortamı sağlar.

JRE (Java Runtime Environment): Java programlarını çalıştırmak için gereksinimlerini içeren, içerisinde JVM’yi ve çekirdek dosyalarını bulunduran yazılımdır.

JDK (Java Development Kit): Java uygulamaları geliştirmek için gerekli araçları içeren geliştirici paketidir.

JRE=JVM + Java Kütüphaneleri

JDK=JRE + Compiler + debugger

Classloader nedir?

Java programını her çalıştırdığımızda, ilk olarak sınıf yükleyici tarafından yüklenen ve asıl amacı sınıf dosyalarını yüklemek olan JVM alt sistemidir. Java’da üç sınıf yükleyici vardır.

Bootstrap ClassLoader: Extension classloader’ın üst sınıfı olan birinci sınıf yükleyicidir.

Extension ClassLoader: Bootstrap’ın alt sınıf yükleyicisi ve system classloader’ın üst sınıf yükleyicisidir.

Sistem / Uygulama ClassLoader: Extension sınıf yükleyicisinin alt sınıf yükleyicisidir.

Java’da pointerlar neden kullanılmaz?

Java, kod basitliği ile bilindiğinden, işaretçi kavramının eklenmesi çelişkili olacaktır. Güvenli olmadığı için ve karmaşıklığını artırdığı için Java’da pointerlar kullanmaz. JVM örtük bellek tahsisinden sorumlu olduğu için, kullanıcının belleğe doğrudan erişimini önlemek için Java’da işaretçilerin kullanılması önerilmez.

Java erişim belirleyiciler (access modifiers) nedir?

Sınıfların diğer farklı sınıflardaki metotlara erişim sağlaması veya bir sınıftaki özel bir metoda başka bir sınıfın erişim sağlayamaması için erişim belirleyicileri kullanılır.

Java’da erişim belirleyiciler 4 çeşittir;

public: Her yerden erişilebilir.

protected: Sınıf, paket ve altsınıflar tarafından erişilebilir

private: Sadece sınıf içerisinden erişilebilir.

Default (erişim belirleyici yok): Bir erişim belirleyici kullanmadan sınıf ve paket içerisinden erişilebilir.

Java’da this() ve super() arasındaki fark nedir?

this(): Bir sınıfın mevcut örneğini temsil eder. Aynı sınıfın varsayılan kurucusunu çağırmak için kullanılır. Mevcut sınıfın yöntemlerine erişmek ve sınıf örneğini işaret etmek için kullanılır.

super(): Bir üst/temel sınıfın geçerli örneğini temsil eder. Üst/temel sınıfın varsayılan yapıcısını çağırmak için kullanılır. Temel sınıfın yöntemlerine erişmek ve üst sınıf örneğini işaret etmek için kullanılır.

Object Oriented Programming kavramı nedir?

Nesne tabanlı programlama (OOP); yazılım tasarımını veri ve nesneler etrafında düzenleyen bir programlama dili modelidir.

Temel OOPL Kavramları;

Abstraction: Bir sınıfta davranış ve özelliklerin tanımlanmasıdır.

Encapsulation: Kapsülleme sayesinde, hangi özellik ve davranışların program dışına gösterilip gösterilmeyeceğini belirleriz.

Inheritance: Sınıfların birbirinden türeme durumudur. Farklı sınıflar arasındaki ilişki “is a” şeklinde ifade edilir.

Polymorphism: Methodların objeye göre farklı çıktılar üretmesi veya farklı işler yapmasıdır. Örneğin: Alt sınıfların farklı davranışlar göstermesi.

Java’da equals() ve == arasındaki fark nedir?

Aralarındaki temel fark, birinin metot diğerinin operatör olmasıdır.

(==) operatörünü referans karşılaştırması için ve equals() metodunu ise içerik karşılaştırması için kullanılır.

(==) operatörü, her iki nesnenin bellek konumlarının aynı olup olmadığını denetlerken equals() nesnelerdeki değerlerin karşılaştırılmasını değerlendirir.

Overloading ve Override nedir?

Overloading: Aynı isime sahip birden fazla metod kullanma durumuna overloading denir. Bu durumda, metotları birbirinden ayıran fark, aldıkları parametre olur. Bir metodu overloading yaparken aynı işlemi veya benzer işlemleri de gerçekleştirecek şekilde overloading yapmalısınız.

Override: Bir metodun tekrardan yazılması anlamına gelir. Kalıtım ile aldığımız bir metodu değiştirmek istersek o zaman override etmemiz yani yeniden yazmamız gerekir.

Array ve ArrayList arasındaki fark nedir?

Diziler, bellek üzerinde aynı tipte veri tutabilmemizi sağlar. ArrayList ise dizilerin eksik yanlarını gidermek için oluşturulmuştur. ArrayList’in en önemli özelliği, içerisinde farklı değişken türlerini barındırıyor olmasıdır.

Diziler sabit uzunlukta tanımlanırlar. ArrayList’te ise böyle bir koşul yoktur.

Diziler tanımlanırken içerisine dahil edeceğimiz elemanların türünü belirtmemiz gerekir. ArrayList’te böyle bir koşul yoktur.

Break ve Continue ifadeleri arasındaki fark nedir?

Break: Switch ve loop ifadelerinde kullanılabilir ve bu deyimlerin yürütüldüğü anda sona ermesine neden olur.

Continue: Yalnızca döngü ifadeleriyle kullanılabilir ve döngüyü sonlandırmaz, sadece döngünün bir sonraki yinelemeye atlamasına neden olur.

En kısa tanımıyla Object ve Class nedir?

Sınıf: Nesnelerin işlev ve özelliklerini tanımlar.

Nesne: Sınıfın davranışını belirler, bu durumda nesne bir sınıfın örneğidir diyebiliriz.

public static void main (String[ ] args) neden kullanılmalıdır?

JVM kodları çalışırken yazılmış classlar arasından başlayacağı noktayı bilmesi gerekmektedir. JVM, public static void main (String[ ] args) metodunu arar ve oradan çalışmaya başlar.

Public: Erişim durumunu belirtmek için kullanılan bir erişim belirleyicidir.

Main: Programın ana metodu olarak geçer.

Static: Java’nın sınıf tabanlı olduğunu tanımlayan bir anahtar kelimedir.

Void: herhangi bir değer döndürmeyecek yöntemi tanımlar.

String args []: Ana metoda aktarılan parametredir.

yield() methodunu neden kullanırız?

Statik bir metot olan yield(), iş parçacığının durdurulmasını ve eşit öncelikli iş parçacığına çalışma şansı vermek için kullanılır.

Java’da singleton sınıfı nedir ve bir sınıfı nasıl singleton yapabiliriz?

Singleton Design Pattern, bir sınıftan yalnızca tek bir nesne oluşturulması gerektiği durumlarda kullanılır. Singleton, singleton nesnesinin sistem içerisinde yalnızca bir kez oluşturulma gereksinimi durumunda kullanılır. Buna örnek olarak bir web sayfasının ilk kez yüklenirken yapması gereken veri tabanı işlemleri verilebilir.

Java’da thread nasıl oluşturulur?

Java’da thread oluşturmak için iki seçenek vardır:

1-Thread sınıfını genişleterek: Thread java.lang.Thread sınıfında mevcuttur. Bir thread oluşturmak için, bir iş parçacığı sınıfını genişletmeniz ve çalıştırma yöntemini geçersiz kılmanız gerekir.

2-Runnable Interface Uygularak: Bunu yapmak için, içinde tanımlanan run () yöntemi için uygulama sağlama ihtiyacı vardır.

Java thread yaşam döngüsü nasıl gerçekleşir?

New: Yaşam döngüsünün ilk durumunda, iş parçacığı örneği oluşturulur ve start () yöntemi henüz çağrılmamıştır.

Runnable: start() yöntemini çağırdıktan sonra, run () yöntemini çağırmadan önce bir iş parçacığı çalıştırılabilir durumdadır.

Running: İş parçacığı, run () yöntemi çağrıldıktan sonra çalışma durumuna girer. Bu, iş parçacığının yürütülmeye başladığı zamandır.

Non-Runnable: İş parçacığı canlı olmasına rağmen çalışamaz.

Terminated: İş parçacığı, run () yöntemi yürütülmesini tamamladığında sonlandırılmış duruma girer.

Java Collectionları nelerdir?

Java Collectionları Set, Map ve List olmak üzere 3 ana interface üzerinden tanımlanabilir. Bu interface’lerin nesleleri ise şunlardır;

Set: HashSet, TreeSet, LinkedHashSet

Map: HashTable, HashMap, TreeMap, LinkedHashMap

List: ArrayList, Vector, Stack, LinkedList, Queue

Upcasting nedir? Downcasting nedir?

Downcasting: Bir sınıf (parent) kendisini extend eden (child) sınıfa cast edilebilir.

Upcasting: Bir sınıf extend ettiği sınıfa cast edilebilir (tip dönüşümü).

Integer ve int arasındaki fark nedir?

int primative değişken tipidir. Sınıf olmadığı için herhangi bir metodu yoktur. Null değer alamaz.

Integer ise bir sınıftır ve tanımlandığında obje özelliği gösterir. Süper sınıf olan object sınıfını extend eder bu yüzden null değer alabilir. İçerisinde integer değişkeni ile alakalı sayısal işlemler veya çevrimler yapabilmemizi sağlayan metotlar bulunmaktadır.

Serilization nedir?

Bir nesnenin veya bir sınıfın saklanacak forma dönüştürülme işlemidir. Extend edilen Serilization sınıfı alt sınıf olan kullanacağımız sınıfın byte’lar halinde streamlere yazılabilir böylece bir java objesi veri tabanına kaydedilebilir. Deserilization ise byte haline çevrilen java objesinin eski haline çevrimine denir.

Autoboxing, Boxing, Autounboxing ve Unboxing nedir?

Autoboxing: Primitive bir değişkenin wrapper sınıf tipine otomatik olarak dönüştürme işlemine denir.

Integer number = 100;

Boxing: Primitive değişkeni wrapper sınıfına dönüştürme işlemidir fakat burada constructor yardımı ile gerçekleştirmiş olacağız.

Integer number = new Integer(100);

Autounboxing: Wrapper tipinden primitive tipine otomatik olarak dönüştürme işlemine denir.

Integer number = 100;

int autoboxing = number;

Unboxing: Burada wrapper tipinde primitive tipe dönüştürme işlemi yapacağız.Bu işlemi Integer Sınıfındaki intValue metotu ile gerçekleştireceğiz.Bu metot ile Integer sınıfındaki değişkenin int primitive tipindeki değerini bize döndürür.

Integer number = 250;

int unboxing = number.intValue();

Garbage Collection nedir?

Garbage Collection, otomatik bellek yönetimi mekanizmasıdır. Bu işlem heap belleğe bakıp, kullanılan objelerin tespit edilmesi ve referans edilmeyenlerin silinmesi üzerine kuruludur. Kullanılmayan/referans edilmeyen nesnelerin kapladığı alan bellekte boşa çıkarılır ve bellekte boş yer açılmış olur.

Mutable ve Immutable nedir?

Immutable nesneler bir kez oluşturulduktan sonra içeriği değiştirilemeyen sınıflardır. Tam tersi olarak da Mutable sınıflar ise değiştirilebilir sınıflardır. Immutable sınıflara örnek String, Integer, Long, Double, BigDecimal, BigInteger verilebilir. Mutable sınıflara örnek olarak ise Date sınıfı verilebilir. Mutable, Set ile yeni bir değer atayabildiğimiz sınıflara denir.

Java’da Immutable bir sınıf yaratmak için,

1-Sınıf final ile başlaması gerekir böylece extend edilemez.

2-Hiçbir değişken set metodu ile enkapsüle edilmemelidir.

3-Tüm değiştirilebilir alanlar final olarak tanımlanmalıdır böylece yalnızca bir kez atanabilir.

4-Tüm alanlar constructor aracılığı ile final bir değere atanmalıdır.

5-Sınıfın tüm alanları private olarak tanımlanmalıdır.

Immutable nesneler Thread-Safe’tir. Çünkü oluştuktan sonra içeriği değiştirilemez bu da threadlerde kullanımda ortaya çıkabilecek senkronizasyon sorunlarını ortadan kaldırır.

Instance nedir?

Referanstır, Objenin eşitlendiği değere denir. Bu instance kullanılarak üretilen obje birden fazla kez kullanılabilir.

Process ve Thread arasındaki farklar nelerdir?

Günümüzde bir bilgisayar sisteminde tek bir işlem birimi olsa dahi, bu tek işlem birimi (işlemci) işletim sisteminin kaynak kullanım stratejisine göre her birine belli bir zaman ayırma esasına göre işlem yapmaktadır. Dolayısıyla bilgisayarda aynı anda çok sayıda thread ve process bulunmaktadır.

Process kendisine ait kaynakları olan işlem birimidir. Örneğin her process kendisine ait hafıza alanına sahiptir.

Theadler de processler gibi işlem birimleridir ve hafif siklet processler (lightweight processes) olarak adlandırılır. Theadler daha az kaynağa ihtiyaç duymaktadır. Theadler bir process içinde yer almaktadır yani her Thead mutlaka bir processe sahiptir ve onun kaynaklarından faydalanır. Theadler de processler gibi uygulamalarda paralelllik elde etmek için kullanılır. Ancak processler daha bağımsız işletim birimleridir ve kendilerine ait durum bilgileri, kendilerine ait adres alanları vardır. Bir process içerisinde birçok thread barındırabilir ve her bir thread mutlaka bir process içinde yer almaktadır. Aynı process içindeki tüm theadler aynı hafıza ve aynı durumu paylaşır ve birbirleriyle direkt olarak haberleşebilirler çünkü aynı alanı paylaşırlar.

Solid prensipleri nelerdir?

Single Responsibilty: Bir nesne ya da bir sınıfın tek bir sorumluluğu olmalıdır.

Open-Closed: Bir sınıf değişime kapalı gelişmeye açık olmalıdır.

Liskov’s Substitution: Nesneler programın çalışmasında sorun yaratmadan kendi alt örnekleriyle değiştirilebilmelidir.

Interface Segregation: Nesneler ihtiyaç duymadıkları metotların interfacelerinden ayrıştırılmalıdır.

Dependency Inversion: Yüksek seviyeli sınıflar düşük seviyeli sınıflara bağlı olmamalı, her ikisi de soyut kavramlara bağlı olmalıdır.

Single Responsibilty nedir?

Single responsibilty bir nesnenin tek bir amaçla yaratılmasını konu alır. Bağlı olduğu sınıfın içerdiği davranışsal özellikler tek bir amaca uygun olmalı ve başka bir davranış göstermemelidir. Örneğin bir çalışan sınıfı içerisinde vergi hesaplama fonksiyonu bulunmamalıdır. Bu single responsibilty prensibine aykırı bir kod yazım şeklidir.

Cohesion Nedir?

Bir sınıfın oluşturulma amacını ne kadar temsil ettiğini gösterir. OOP’de sınıfların belirli bir amaca yönelik yazılması beklenir (High Cohesion). Örneğin matematik işlemi yapan bir sınıfa dosya işlemlerini gerçekleyen bir metot daha eklediğimiz zaman high cohesion prensibini bozmuş oluruz.

Coupling nedir?

İki sınıfın birbirine olan bağımlılığı diyebiliriz. OOP’de nesnelerin birbirleriyle az bağımlı olması benimsenir (Low coupling). Örnek olarak A sınıfı B sınıfına ne kadar bağımlıysa coupling bir o kadar artar. Bu da projenin bakımını ve genişletilebilirliğini azaltır. Low coupling için interface kullanımı, design patternler vb. gibi çeşitli prensipler uygulanır.

Final anahtar kelimesi ne işe yarar?

Final Variables: Değiştirilemez, sstatic ile beraber constant olarak kullanılabilir.

Final Class: Extend edilemez

Final Methods: Override edilemez.

Static değerlerin özellikleri nelerdir?

Static Variable: Class’a aittir yani her nesne için bir defa oluşturulmaz. Memory de bir defa oluşturulur.

Static Method: Class a aittir yani her nesne için bir defa oluşturulmaz. Class ismiyle çağrılabilir.

Static Block: Class execute edildiği zaman heap’te yerini alır.

Error ve Exception arasındaki farklar nelerdir?

Error, JVM tarafından runtime’da handle edilmesi mümkün olmayan türden hatalardır.

Exception ise try catch ile handle edilebilir. Java’da exceptionlar 5 farklı keyword ile handle edilebilir: — Try — Catch — Finally — Throw — Throws

Checked Exception ve Unchecked Exception arasındaki farklar nelerdir?

RuntimeException ve Error dışında Throwable sınıfını extend eden sınıflar Checked Exceptions olarak tanımlanabilir. Checked Exceptionlar compile edilirken alınan hatalardır (IOException, SQLException).

RuntimeException sınıfını extend eden exceptionlar Unchecked Exceptionlar olarak adlandırılır. Compile edilirken kontrol edilip gözükmez (ArithmeticException, NullPointerException).

Reflection nedir ve hangi amaçla kullanılır?

Java Reflection bir uygulama geliştirme arayüzü olup, o anki JVM’deki sınıfları, arayüzleri ve nesneleri yansıtan, temsil eden kütüphanedir. Özellikle geliştirme araçları yazarken reflection kütüphanesine ihtiyaç duyarız. Reflection kütüphanesini kullanarak;

Bir nesnenin sınıfını belirleriz -Classın fieldları, metodları, constructorları, üst classları ve değişkenleri hakkında bilgiler alabiliriz

Bir arayüze ait olan sabit ve metod tanımlamalarını tespit ederiz -Çalışma zamanına kadar ismi bilinmeyen bir sınıf örneği yaratabiliriz (Bir bakıma runtime’da yeni sınıflar yaratabilirsiniz)

Çalışma zamanına kadar ismi bilinmese de sahaların değerini ayarlar ve alabiliriz.

Aynen çalışma zamanına kadar bilinmeyen metotları çalıştırabiliriz.

Çalışma zamanına kadar bileşenleri ve boyutu bilinmeyen diziler yaratabilir, daha sonra bu dizinin bileşenlerini değiştirebiliriz.

Küçük projelerde yapılan işlem sayısı, kullanılan tip sayısı pek fazla değildir. Buna bağlı olarak yazılan if-else blokları ve switch-case blokları nispeten küçük olacağından okunmasında, takip edilmesinde çok sıkıntı yaşanmaz. Reflection ve annotation’lar bu durumların tersinin ortaya çıktığı genellikle büyük ölçekli projelerde kullanışlı mekanizmalardır.

Sync Async nedir? Arasındaki farklar nedir ve ne amaçla kullanılır?

Senkron programlama, yazılımda her bir işlemin sıra ile yapılmasıdır. Örneğin süpermarketlerdeki kasa kuyruğunda bir önceki müşteri ürünlerinin ödemesini yapmadan sizin ürünlerinize sıra gelmemektedir. Beklerken yaşanan zaman kaybı Asenkron programlamada ortadan kalkar.

Asenkron programlama; işlemlerin birbirini beklemeden bağımsız olarak gerçekleşmesidir. Süpermarket örneğinden devam edecek olursak, Asenkron programlama; her müşterinin sıra beklemeden istediği kasadan ödeme yapabilmesini sağlamaktadır.

OOP’lerin avantajları nelerdir?

Kod fazlalığını azaltır

Kod okunabilirliğini iyileştirir

Düşük geliştirme maliyeti

Geliştirilmiş yazılım kalitesi

Daha hızlı ürün geliştirme

Kodun yeniden kullanılabilirliği

Kolay bakım

Genişletilebilir, bu da mevcut olana kolayca yeni özellikler ekleyebileceğimiz anlamına gelir.

JIT nedir?

Java kodlarını direkt olarak çalıştırılabilir derlemiyor. Bunun yerine bir ara derlemeden geçiriyor ve bu işlem sonucu bytecode elde ediyoruz yani class dosyaları. Önceden bu class dosyaları java sanal makinesi (JVM) altında derlenerek çalıştırılırdı. Program iki kez derlendiği için hız kaybı oluyordu.
JIT derleyici (JVM) altında çalışan bir derleyicidir. Bu derleyicinin özelliği ise çalıştırılacak bytecode un sadece kullanılacak kısmının derlenerek çalıştırılmasını sağlıyor. Diğer kısımlar basitçe yorumlanıyor. Böylece tekrar tam derleme gerekmediği ve tekrar tekrar aynı işlemlere gerek kalmadığı için hız artışı sağlamış oluyoruz.

String, String Builder ve String Buffer farkları nedir?

String sınıfları immutable, StringBuffer/StringBuilder ise mutable’dır (String = Değiştirilemez, StringBuffer||StringBuilder = Değiştirilebilir).

String objenin içinde saklanan değer değiştirilemez. String objesi değişmek için arka planda yeni bir String nesnesi oluşturur. Her değişiklikte yeni bir String class’ı oluşuyor. Bu da zamanla performansı kötü yönde etkiliyor.

StringBuffer/StringBuilder objelerini kullanırsanız performans açısından daha iyi sonuçlar elde edersiniz. Çünkü Objenin içinde saklanan değer değiştirilebilir bir değerdir.

StringBuffer ile StringBuilder arasındaki tek fark ise “senkronizasyon” dur.
StringBuffer “synchronized” iken StringBuilder “synchronized” değildir.

Thread kullancaksanız; StringBuffer, kullanmayacaksanız StringBuilder kullanmanız daha verimli olacaktır.

Comparable Nedir?

java.lang paketi içinde Comparable adlı bir interface vardır. ArrayListlerde int string gibi değerleri değil de Java Sınıfını istenen objeye göre sıralar. Comparable interface’ine ait compareTo() metodunu override ederek içerisinde objenin hangi kriterlere göre sıralanmasını istiyorsak o şekilde belirtmemiz gerekmektedir. Collections.sort(sınıf) ile compareTo metodunda yazdığımız algoritmaya göre sıralama yapılır.

--

--