Java Kursu

Java'yı temelden eşzamanlılığa kadar öğren: kontrol akışı, OOP, exception'lar, generics, koleksiyonlar ve stream'ler; gerçek kod örnekleri ve quizlerle.

8 kategoride 45 ders

Java Temelleri

String

Java Basics kategorisinin ilk topic'i: `String`'in IMMUTABLE tasarımı, string pool ve `==` vs `equals()` tuzağı, `+` ile birleştirmenin O(n^2) maliyeti vs `StringBuilder`'ın amortized O(1)'i (gerçek, ısıtılmış bir ölçümle), `String.format()`/text block'lar (Java 15+), ve split/join/replace/trim/strip gibi yardımcı metotlar.

Başlangıç 20 dk
İncele →

Arrays

Java Basics kategorisinin ikinci topic'i: dizilerin sabit boyutlu, bitişik bellek yapısı, çok boyutlu diziler (jagged array dahil), `Arrays` yardımcı sınıfı (sort/binarySearch/equals/fill/copyOf), array covariance ve `ArrayStoreException` tuzağı, `Arrays.asList()`'in görünüm (view) olması, ve varargs.

Başlangıç 20 dk
İncele →

Scanner

Java Basics kategorisinin üçüncü topic'i: `Scanner`'ın token tabanlı okuma modeli, klasik `nextInt()` + `nextLine()` tuzağı, `useDelimiter()` ile özel ayırıcılar, `File` üzerinden okuma, `Scanner` ile `BufferedReader` arasındaki gerçek bir performans farkı, ve `InputMismatchException`/`NoSuchElementException` istisna yönetimi.

Başlangıç 20 dk
İncele →

Wrapper Classes & Autoboxing

Java Basics kategorisinin dördüncü topic'i: ilkel tiplerin nesne karşılıkları (Integer/Double/Boolean vb.), autoboxing/autounboxing, Integer önbellekleme (-128..127) ve `==` tuzağı, null bir wrapper'ı unboxing yapmanın gerçek bir NullPointerException fırlatması, autoboxing'in sıkı döngülerdeki performans maliyeti, ve wrapper sınıflarının generic koleksiyonları mümkün kılması.

Başlangıç 20 dk
İncele →

File Reading

Java Basics kategorisinin beşinci topic'i (File I/O'nun okuma yarısı): `Path`/`Files` temelleri, `Files.readAllLines()`/`Files.readString()`, `BufferedReader` ile satır satır okuma, `Files.lines()`'in lazy ve Closeable olması, dosyada kelime arama, ve `NoSuchFileException` ile `FileNotFoundException` arasındaki gerçek fark.

Başlangıç 20 dk
İncele →

File Writing

Java Basics kategorisinin altıncı topic'i (File I/O'nun yazma yarısı): `Files.writeString()`/`Files.write()`, `StandardOpenOption.APPEND` ile sona ekleme, `BufferedWriter` ile yazma, `Files.copy()` ile dosya kopyalama, `Files.createDirectories()`, bir dizin ağacını silmenin standart deseni, ve CSV dosyası yazma.

Başlangıç 20 dk
İncele →

Enum

Java'da sabit değer kümelerini tip güvenli şekilde tanımlama.

Başlangıç 35 dk
İncele →

Record

Java'da sabit (immutable) veri taşıyıcıları tek satırda tanımlama.

Orta 45 dk
İncele →

Reflection

Java'da çalışma zamanında sınıf, alan, metot ve constructor bilgisine erişme ve bunları dinamik olarak kullanma.

İleri 50 dk
İncele →

Date & Time API

Java'da java.time paketi; LocalDate/LocalTime/LocalDateTime, Instant, ZonedDateTime/OffsetDateTime, Duration/Period/ChronoUnit, formatlama/parse, saat dilimleri ve legacy Date/Calendar'dan geçiş.

Orta 55 dk
İncele →

Exception'lar

Exception'lara Giriş

Bir exception'ın gerçekte ne olduğu -- neden var olduğu (dönüş-değeri-tabanlı hata sinyallemesinin sorunları), Java'nın checked exception tasarım kararının kısa tarihçesi, bir exception nesnesinin taşıdığı mesaj/cause/stack trace, yakalanmamış bir exception'ın programı nasıl sonlandırdığı, stack trace okumak ve propagation, ve yaygın runtime exception tetikleyicileri (NullPointerException, ArrayIndexOutOfBoundsException, NumberFormatException). Bu serinin 7 dersinin ilki, henüz try/catch mekaniği yok.

Başlangıç 20 dk
İncele →

Try-Catch ve Finally

Bir exception'ı gerçekten handle etmenin mekanizması: temel try-catch bloğu, birden fazla catch bloğu (sırayla eşleşme, süper sınıf/alt sınıf sıralama kısıtı), | ile multi-catch (Java 7+), finally'nin koşulsuz olarak her zaman çalışması, ve finally içinde return/throw'un try/catch'in ürettiği her şeyi sessizce ezmesi. Exception Handling serisinin 2.'si.

Başlangıç 20 dk
İncele →

Exception Hiyerarşisi

Throwable, Error, Exception ve RuntimeException arasındaki miras ilişkisi -- her exception'ın tek bir ortak kökten geldiği, catch bloklarının bir türün herhangi bir atasını da hedefleyebildiği (polimorfik yakalama), ve instanceof ile bu hiyerarşinin çalışma zamanında nasıl sorgulanacağı. Exception Handling serisinin 3.'sü.

Başlangıç 20 dk
İncele →

Checked ve Unchecked Exception'lar

Checked exception'ın derleyici tarafından zorlanan throws/catch sözleşmesi ile unchecked exception'ın (RuntimeException ailesi) bu zorunluluğu hiç taşımaması arasındaki fark -- ikisi arasında ne zaman hangisinin seçileceği, checked bir exception'ı cause parametresiyle unchecked'e sarmalamak, ve override edilen bir metotta throws bildiriminin yalnızca DARALTILABİLECEĞİ kısıtı. Exception Handling serisinin 4.'sü.

Başlangıç 20 dk
İncele →

Throw ve Throws

throw ifadesinin çalışma zamanında bir Throwable nesnesini JVM'e teslim etmesi ile throws bildiriminin yalnızca derleme-zamanı bir sözleşme olması arasındaki fark -- fail-fast doğrulama, yakalanan bir exception'ı cause parametresiyle farklı bir türle yeniden fırlatmak, ve checked exception'ın çağrı zinciri boyunca yakalanmadan yayılması. Exception Handling serisinin 5.'si.

Başlangıç 20 dk
İncele →

Özel (Custom) Exception Oluşturmak ve Fırlatmak

Kendi exception türünü Exception (checked) ya da RuntimeException (unchecked) genişleterek tanımlamak -- ekstra bağlam (context) taşıyan alanlar eklemek, Throwable'ın dört standart constructor'ını yansıtmak, ve ortak bir custom base sınıfıyla kendi küçük exception hiyerarşini kurmak. Exception Handling serisinin 6.'sı.

Başlangıç 20 dk
İncele →

Exception Handling Best Practices

Önceki altı dersin mekaniğinin üzerine kurulan pratikler -- exception'ları kontrol akışı için kullanma ve yutma anti-pattern'leri, catch bloklarını spesifikten genele doğru doğru sırada yakalamak, ve yalnızca gerçekten anlamlı bir tepki verilebilecek yerde yakalamak. Exception Handling serisinin 7. ve son dersi, tüm seriyi özetleyen bir kapanış bölümüyle.

Başlangıç 20 dk
İncele →

Generics

Generics'e Giriş

Generics'in neden var olduğu (pre-generics raw type/cast/ClassCastException sorunu), tür güvenliğinin derleme zamanında nasıl sağlandığı, generic sınıflar ve interface'ler, ve tür parametresi adlandırma kuralı. Generics serisinin 1.'si.

Orta 25 dk
İncele →

Generic Metotlar

Sınıfının generic olup olmamasından bağımsız olarak kendi tür parametresini bildiren generic metotlar -- metot tür parametreleri, birden fazla tür parametresi, tür çıkarımı (type inference) ve açık tür tanığı (type witness). Generics serisinin 2.'si.

Orta 20 dk
İncele →

Sınırlı Tür Parametreleri

Üst sınırlar (`<T extends ...>`), `&` ile birleştirilen birden fazla sınır, sınıflarla ve interface'lerle sınırlama, ve bir tür parametresini sınırlamanın tür parametresine hangi metotların çağrılabileceğini nasıl genişlettiği. Generics serisinin 3.'sü.

Orta 20 dk
İncele →

Wildcard'lar

Sınırsız wildcard (`<?>`), üst sınırlı wildcard (`<? extends T>`), alt sınırlı wildcard (`<? super T>`), üçü arasındaki fark, ve PECS (Producer Extends, Consumer Super) kuralı -- Java generics'in en yaygın yanlış anlaşılan bölümü, gerçek örneklerle adım adım. Generics serisinin 4.'sü.

Orta 30 dk
İncele →

Koleksiyonlarla Generics

List<T>, Set<T> ve Map<K,V> gibi generic koleksiyonlar, koleksiyonlarla tür güvenliği, List<Object>'in neden List<String> OLMADIĞI (generics değişmezliği, tam işleniş), ve diamond operatörü/var ile tür çıkarımı. Generics serisinin 5.'si.

Orta 25 dk
İncele →

Type Erasure ve Generics'in Kısıtları

Type erasure'ın (tür silme) ne olduğu, generic türlere çalışma zamanında ne olduğu, `new T()` ve generic array'lerin neden izin verilmediği, statik üyeler ve generics, ve generics'in çalışma zamanı kısıtlarının pratikte (raw type/unchecked uyarı/heap pollution) nasıl karşımıza çıktığı. Generics serisinin 6. ve son dersi.

Orta 25 dk
İncele →

Kontrol Akışı

if / else

Yeni Control Flow kategorisinin ilk topic'i: `if`/`else`'in temel kullanımı, `else if` zinciri, iç içe koşullar, altı karşılaştırma operatörü (`==`/`!=`/`<`/`>`/`<=`/`>=`) ve ondalıklı sayı/`String` karşılaştırma tuzakları, `&&`/`||`/`!` mantıksal operatörleri ve kısa devre değerlendirme, ve üçlü (ternary) operatör.

Başlangıç 20 dk
İncele →

switch

Control Flow kategorisinin ikinci topic'i: klasik `case`/`break` sözdizimi ve fall-through tuzağı, modern ok (`->`) sözdizimi, switch İFADESİ ve `yield`, birden fazla etiket ve enum kapsayıcılık (exhaustiveness) kontrolü, ve `String`/enum üzerinde `switch` kullanımı.

Başlangıç 20 dk
İncele →

for Loop

Control Flow kategorisinin üçüncü topic'i: klasik üç bölümlü (init;condition;update) `for` sözdizimi, `break` ile erken çıkış, `continue` ile bir adımı atlama, kasıtlı/kasıtsız sonsuz döngüler, virgüllü init/update ile birden fazla değişken, ve klasik index tabanlı dizi gezinme.

Başlangıç 20 dk
İncele →

Enhanced for Loop

Control Flow kategorisinin dördüncü topic'i: dizi/koleksiyon üzerinde for-each sözdizimi, üç gerçek sınırı (indekse erişilememesi, döngü değişkeninin bir kopya olması ve yapısal değişikliğin ConcurrentModificationException fırlatması, birden fazla koleksiyonu paralel gezememe), ve klasik `for` ile ne zaman hangisinin kullanılacağı.

Başlangıç 20 dk
İncele →

while & do-while Loops

Control Flow kategorisinin beşinci topic'i: temel `while` sözdizimi, gövdeyi en az bir kez çalıştıran `do-while`, while vs do-while karşılaştırması, break/continue, Scanner ile girdi doğrulama döngüsü, ve uygulamalı örnek olarak Sayı Tahmin Oyunu (Number Guessing Game).

Başlangıç 20 dk
İncele →

Nested Loops

Control Flow kategorisinin altıncı ve son topic'i: temel iç içe `for` döngüsü, 2 boyutlu dizi gezinme, etiketsiz break/continue'nun yalnızca en içteki döngüyü etkilemesi, etiketli (labeled) break/continue, ve O(n²) performans farkındalığı.

Başlangıç 22 dk
İncele →

Koleksiyonlar

Lists

Collections kategorisinin ilk topic'i: `List` arayüzü, `ArrayList` ile `LinkedList`'in gerçek bir ısıtılmış ölçümle karşılaştırılan performans farkı, `List.of()`/`Collections.unmodifiableList()`/`List.copyOf()` ile immutable listeler, `Iterator`/`ListIterator` ile güvenli dolaşma, `List.sort(Comparator)` ile sıralama, ve `subList()`/`toArray()`.

Başlangıç 20 dk
İncele →

Sets

Collections kategorisinin ikinci topic'i: `Set` arayüzü ve tekrar eden elemanlara izin vermemesi, `HashSet`/`LinkedHashSet`/`TreeSet` farkları, `NavigableSet` metotları, `equals()`/`hashCode()` sözleşmesinin `HashSet` için neden kritik olduğu (gerçek bir hata örneğiyle), küme işlemleri (birleşim/kesişim/fark), ve List/HashSet/TreeSet arasındaki gerçek bir performans ölçümü.

Başlangıç 20 dk
İncele →

Maps

Collections kategorisinin üçüncü topic'i: `Map<K,V>` arayüzü (her anahtar bir kez, değerlere eşlenir), `HashMap`/`LinkedHashMap`/`TreeMap` farkları, `NavigableMap` metotları, immutable map'ler (`Map.of()`/`Map.copyOf()`), Java 8'in modern API'si (`getOrDefault()`/`computeIfAbsent()`/`merge()`), ve `entrySet()` ile `keySet()+get()` arasındaki gerçek bir performans ölçümü.

Başlangıç 20 dk
İncele →

Queues & Collections Utility

Collections kategorisinin son topic'i: `Queue`/`Deque` arayüzleri (offer()/poll()/peek() vs add()/remove()/element()), `ArrayDeque`'ın hem kuyruk hem stack olarak `LinkedList`/`java.util.Stack`'a tercih edilmesi, `PriorityQueue`'nun heap tabanlı ve toString()'inin sıralı OLMADIĞI gerçek bir keşif, ve `Collections` yardımcı sınıfının sort/shuffle/max/binarySearch gibi statik metotları.

Başlangıç 20 dk
İncele →

Nesne Yönelimli Programlama

Interface

Java'da davranış sözleşmeleri tanımlama; default/static/private metotlar ve sealed interface'ler.

Orta 50 dk
İncele →

Abstract Class

Java'da ortak durum ve davranışı paylaşan soyut sınıflar; constructor, Template Method Pattern ve abstract class vs interface karşılaştırması.

Orta 50 dk
İncele →

Inheritance

Java'da kalıtım (inheritance); extends, constructor zinciri, method overriding, field hiding, upcasting/downcasting ve composition vs inheritance karşılaştırması.

Orta 50 dk
İncele →

Polymorphism

Java'da çok biçimlilik (polymorphism); method overloading, overload çözümleme kuralları, covariant return type, polymorphism vs inheritance ve composition ile Strategy Pattern.

Orta 45 dk
İncele →

Eşzamanlılık

Threads

Java'da thread'ler; oluşturma (Thread/Runnable), lifecycle, thread metotları, race condition, synchronized, volatile, wait/notify, Atomic sınıflar, ReentrantLock ve deadlock.

İleri 55 dk
İncele →

Functional Interface'ler ve Stream'ler

Lambda Expressions

Lambda expression syntax'ının tamamı: parametre yazım kuralları, expression body vs block body, derleyicinin lambda'ya bağlamdan tip vermesi (target typing), effectively final değişken yakalama, ve lambda'nın anonymous inner class'tan farkı.

Orta 20 dk
İncele →

Built-in Functional Interfaces

java.util.function paketindeki hazır interface'ler: Predicate<T>, Function<T,R>, Consumer<T>, Supplier<T>, UnaryOperator<T>, BinaryOperator<T>. Dört method reference biçimi: Class::staticMethod, object::instanceMethod, Class::instanceMethod, Class::new.

Orta 22 dk
İncele →

Stream API Temelleri

Stream API'nin temelleri: Stream nedir, Collection'dan Stream'e geçiş, pipeline'ın üç aşaması (source/intermediate/terminal). Intermediate operation'lar: filter(), map(), flatMap(), distinct(), sorted(), peek(), limit(), skip(). Lazy evaluation ve stream'in tek kullanımlık doğası.

Orta 25 dk
İncele →

Terminal Operations

Stream pipeline'ını tetikleyip sonuç üreten terminal operation'lar: forEach(), reduce(), count(), min()/max(), findFirst()/findAny(), anyMatch()/allMatch()/noneMatch(), toList()/toArray(). Kısa devre (short-circuiting) davranışı ve count()'un source boyutundan doğrudan hesaplanabilme optimizasyonu.

Orta 22 dk
İncele →

Collectors

Collectors sınıfının sunduğu hazır collect() tarifleri: toList()/toSet(), joining(), groupingBy() (+ downstream collector olarak counting()/mapping()), partitioningBy(), toMap(). Bir Collector'ın üç bileşeni: supplier, accumulator, combiner.

Orta 22 dk
İncele →

Optional

Optional<T>: bir değerin bulunmama ihtimalini tip sisteminde ifade etmek. of()/ofNullable()/empty() ile oluşturma, orElse() vs orElseGet() (eager vs lazy), orElseThrow(), map()/flatMap(), ifPresent()/ifPresentOrElse(), filter().

Orta 20 dk
İncele →

Primitive & Parallel Streams

IntStream/LongStream/DoubleStream ile autoboxing maliyetinden kaçınmak, boxed()/mapToInt() köprüleri. parallelStream() ile paralel çalışma, forEach() vs forEachOrdered() sıralama farkı, thread-safe olmayan paylaşılan durum tuzağı, ne zaman kullanılmalı ve neden her zaman daha hızlı olmadığı.

Orta 25 dk
İncele →