Java’nin Temelleri
2026
Yazılım geliştirme sürecinde matematiksel işlemler, günlük programlama pratiğinin vazgeçilmez bir parçasıdır. Bir e-ticaret sitesinde sepetteki ürünlerin toplam fiyatını hesaplamaktan, bir oyun motorunda karakterlerin hareketini simüle etmeye kadar pek çok alanda matematiksel hesaplamalara ihtiyaç duyulur.
Java, geliştiricilere bu hesaplamaları kolaylaştırmak için güçlü araçlar sunar. Bu bölümde, Java’nın Math sınıfı ile temel matematiksel işlemleri, rastgele sayı üretim mekanizmalarını ve karşılaşılan problemleri çözmek için kullanılabilecek yaklaşımları öğreneceksiniz.
💡 Pedagojik Not: Bu bölümde öğreneceğiniz kavramlar, ilerleyen konularda (özellikle oyun geliştirme, simülasyon ve veri analizi) sıkça karşınıza çıkacaktır. Her bir metodu sadece ezberlemek yerine, hangi durumda hangi aracı kullanmanız gerektiğini anlamaya odaklanın.
Rastgele sayı üretimi ve matematiksel hesaplamalar şu alanlarda kritik öneme sahiptir:
Bu bölümü tamamladığınızda:
- Math sınıfının temel metotlarını etkin bir şekilde kullanabileceksiniz
- Farklı rastgele sayı üretim yöntemlerini karşılaştırabileceksiniz
- Matematiksel problemleri Java’da modelleyip çözebileceksiniz
- Gerçek hayat problemlerine uygun çözüm stratejileri geliştirebileceksiniz
Java’nın Math sınıfı, java.lang paketinin bir parçası olduğu için herhangi bir import ifadesine gerek duymadan kullanılabilir. Tüm metotları statik olduğu için, sınıf adı üzerinden doğrudan çağrılabilirler.
// Math sınıfına ihtiyacımız yok - java.lang paketinin parçasıdır
public class MathOrnek {
public static void main(String[] args) {
double sayi = Math.abs(-15.7);
System.out.println("Mutlak değer: " + sayi);
}
}⚠️ Önemli Not:
Mathsınıfının metotları statik olduğu için,Mathnesnesi oluşturmanıza gerek yoktur.new Math()ifadesi derleme hatası verecektir çünküMathsınıfının constructor’ı private’dır.
abs() - Mutlak DeğerMutlak değer, bir sayının sıfıra olan uzaklığını ifade eder. Pozitif sayılar olduğu gibi kalırken, negatif sayılar pozitife dönüşür.
public class MutlakDegerOrnek {
public static void main(String[] args) {
int tamSayi = -42;
double ondalikli = -3.14;
System.out.println("Tam sayı mutlak: " + Math.abs(tamSayi)); // 42
System.out.println("Ondalıklı mutlak: " + Math.abs(ondalikli)); // 3.14
// Özel durum: Integer.MIN_VALUE
System.out.println("MIN_VALUE mutlak: " + Math.abs(Integer.MIN_VALUE));
// Bu durumda negatif değer döner çünkü 2^31 pozitif gösterilemez
}
}max() ve min() - Karşılaştırmaİki değer arasında büyük veya küçük olanı bulmak için kullanılır.
public class KarsilastirmaOrnek {
public static void main(String[] args) {
int a = 45, b = 78;
double x = 3.14, y = 2.71;
System.out.println("En büyük: " + Math.max(a, b)); // 78
System.out.println("En küçük: " + Math.min(a, b)); // 45
System.out.println("Ondalıklı en büyük: " + Math.max(x, y)); // 3.14
System.out.println("Ondalıklı en küçük: " + Math.min(x, y)); // 2.71
// Pratik kullanım: bir dizide en büyük değeri bulma
int[] sayilar = {12, 45, 67, 23, 89, 34, 56};
int enBuyuk = sayilar[0];
for (int sayi : sayilar) {
enBuyuk = Math.max(enBuyuk, sayi);
}
System.out.println("Dizideki en büyük: " + enBuyuk); // 89
}
}pow() - Üs AlmaBir sayının belirli bir kuvvetini hesaplar. double türünde değer döndürür.
public class UsAlmaOrnek {
public static void main(String[] args) {
// 2^3 = 8
System.out.println("2^3 = " + Math.pow(2, 3));
// 5^2 = 25
System.out.println("5^2 = " + Math.pow(5, 2));
// 10^0 = 1
System.out.println("10^0 = " + Math.pow(10, 0));
// Karekök için 0.5 üssü
System.out.println("16^(1/2) = " + Math.pow(16, 0.5));
// Negatif üs
System.out.println("2^(-3) = " + Math.pow(2, -3)); // 0.125
// Pratik: Bileşik faiz hesaplama
double anapara = 1000;
double faizOrani = 0.05;
int yil = 3;
double toplam = anapara * Math.pow(1 + faizOrani, yil);
System.out.printf("3 yıl sonraki toplam: %.2f TL%n", toplam);
}
}sqrt() - KarekökBir sayının karekökünü hesaplar. Negatif sayılar için NaN (Not a Number) döndürür.
public class KarekokOrnek {
public static void main(String[] args) {
System.out.println("25'in karekökü: " + Math.sqrt(25)); // 5.0
System.out.println("2'nin karekökü: " + Math.sqrt(2)); // 1.414...
System.out.println("0'ın karekökü: " + Math.sqrt(0)); // 0.0
System.out.println("-4'ün karekökü: " + Math.sqrt(-4)); // NaN
// Pratik: Pisagor teoremi
double kenarA = 3;
double kenarB = 4;
double hipotenus = Math.sqrt(Math.pow(kenarA, 2) + Math.pow(kenarB, 2));
System.out.println("Hipotenüs: " + hipotenus); // 5.0
}
}Ondalıklı sayıları farklı şekillerde yuvarlamak için kullanılan metotlardır.
ceil() - Yukarı YuvarlamaSayıyı her zaman bir üst tamsayıya yuvarlar. Pozitif sayılarda olduğu gibi negatif sayılarda da “yukarı” kavramı matematiksel anlamda kullanılır.
public class CeilOrnek {
public static void main(String[] args) {
System.out.println("3.2'nin tavanı: " + Math.ceil(3.2)); // 4.0
System.out.println("3.8'in tavanı: " + Math.ceil(3.8)); // 4.0
System.out.println("-3.2'nin tavanı: " + Math.ceil(-3.2)); // -3.0
System.out.println("-3.8'in tavanı: " + Math.ceil(-3.8)); // -3.0
System.out.println("5.0'ın tavanı: " + Math.ceil(5.0)); // 5.0
// Pratik: Bir sınavda geçme notu hesaplama
double puan = 67.3;
double yuvarlanmisPuan = Math.ceil(puan);
System.out.println("Yuvarlanmış puan: " + yuvarlanmisPuan); // 68.0
}
}floor() - Aşağı YuvarlamaSayıyı her zaman bir alt tamsayıya yuvarlar.
public class FloorOrnek {
public static void main(String[] args) {
System.out.println("3.2'nin tabanı: " + Math.floor(3.2)); // 3.0
System.out.println("3.8'in tabanı: " + Math.floor(3.8)); // 3.0
System.out.println("-3.2'nin tabanı: " + Math.floor(-3.2)); // -4.0
System.out.println("-3.8'in tabanı: " + Math.floor(-3.8)); // -4.0
System.out.println("5.0'ın tabanı: " + Math.floor(5.0)); // 5.0
// Pratik: KDV hesaplama
double fiyat = 99.99;
double kdvOrani = 0.18;
double kdvliFiyat = fiyat * (1 + kdvOrani);
double yuvarlanmisFiyat = Math.floor(kdvliFiyat * 100) / 100;
System.out.println("KDV'li fiyat: " + yuvarlanmisFiyat);
}
}round() - En Yakın Tamsayıya YuvarlamaMatematiksel yuvarlama kurallarına göre en yakın tamsayıya yuvarlar. .5 ve üzeri yukarı, altı aşağı yuvarlanır.
public class RoundOrnek {
public static void main(String[] args) {
System.out.println("3.2'nin yuvarlanmışı: " + Math.round(3.2)); // 3
System.out.println("3.5'in yuvarlanmışı: " + Math.round(3.5)); // 4
System.out.println("3.8'in yuvarlanmışı: " + Math.round(3.8)); // 4
System.out.println("-3.2'nin yuvarlanmışı: " + Math.round(-3.2)); // -3
System.out.println("-3.5'in yuvarlanmışı: " + Math.round(-3.5)); // -3
System.out.println("-3.8'in yuvarlanmışı: " + Math.round(-3.8)); // -4
// Not: round() float için int, double için long döndürür
float f = 3.7f;
double d = 3.7;
System.out.println("float round: " + Math.round(f)); // 4 (int)
System.out.println("double round: " + Math.round(d)); // 4 (long)
}
}📝 Önemli:
round()metodu,floatparametre içinint,doubleparametre içinlongdöndürür. Bu, büyük sayılarla çalışırken taşma riskini önlemek içindir.
Bu metotlar, bilimsel ve mühendislik hesaplamalarında sıkça kullanılır.
Math sınıfı, standart trigonometrik fonksiyonları sağlar. Tüm trigonometrik metotlar radyan cinsinden açı değerleri alır.
public class TrigonometriOrnek {
public static void main(String[] args) {
double aciDerece = 45;
double aciRadyan = Math.toRadians(aciDerece);
System.out.println("45° = " + aciRadyan + " radyan");
System.out.println("Sin 45°: " + Math.sin(aciRadyan));
System.out.println("Cos 45°: " + Math.cos(aciRadyan));
System.out.println("Tan 45°: " + Math.tan(aciRadyan));
// Ters trigonometrik fonksiyonlar
double sinDeger = 0.5;
double aci = Math.asin(sinDeger);
System.out.println("Arcsin(0.5) = " + Math.toDegrees(aci) + "°");
// Pratik: Dairenin alanı
double yaricap = 5;
double alan = Math.PI * Math.pow(yaricap, 2);
System.out.println("Daire alanı: " + alan);
}
}Doğal logaritma ve 10 tabanında logaritma hesaplamaları için kullanılır.
public class LogaritmaOrnek {
public static void main(String[] args) {
System.out.println("ln(e): " + Math.log(Math.E)); // 1.0
System.out.println("ln(10): " + Math.log(10)); // 2.302...
System.out.println("log10(100): " + Math.log10(100)); // 2.0
System.out.println("log10(1000): " + Math.log10(1000)); // 3.0
// Pratik: Bir sayının kaç basamaklı olduğunu bulma
int sayi = 12345;
int basamakSayisi = (int)Math.log10(sayi) + 1;
System.out.println(sayi + " sayısı " + basamakSayisi + " basamaklı");
}
}// Dosya: MathTemelMetotlar.java
public class MathTemelMetotlar {
public static void main(String[] args) {
// Demo: Temel matematiksel işlemler
double sayi = -5.7;
System.out.println("=== TEMEL METOTLAR ===");
System.out.println("Sayı: " + sayi);
System.out.println("Mutlak değer: " + Math.abs(sayi));
System.out.println("Yukarı yuvarla: " + Math.ceil(sayi));
System.out.println("Aşağı yuvarla: " + Math.floor(sayi));
System.out.println("En yakın: " + Math.round(sayi));
System.out.println("2^3 = " + Math.pow(2, 3));
System.out.println("25'in karekökü = " + Math.sqrt(25));
// Karşılaştırma
System.out.println("\n=== KARŞILAŞTIRMA ===");
System.out.println("max(10, 20): " + Math.max(10, 20));
System.out.println("min(10, 20): " + Math.min(10, 20));
// Matematiksel sabitler
System.out.println("\n=== SABİTLER ===");
System.out.println("PI: " + Math.PI);
System.out.println("E: " + Math.E);
}
}// Dosya: TrigonometriSabitler.java
public class TrigonometriSabitler {
public static void main(String[] args) {
System.out.println("=== TRİGONOMETRİK İŞLEMLER ===");
double aci = 45;
double radyan = Math.toRadians(aci);
System.out.println("Pi sayısı: " + Math.PI);
System.out.println("Sin 45°: " + Math.sin(radyan));
System.out.println("Cos 45°: " + Math.cos(radyan));
System.out.println("Tan 45°: " + Math.tan(radyan));
// Ters trigonometrik
System.out.println("\n=== TERS TRİGONOMETRİK ===");
System.out.println("Arcsin(1): " + Math.toDegrees(Math.asin(1)) + "°");
System.out.println("Arccos(0): " + Math.toDegrees(Math.acos(0)) + "°");
System.out.println("Arctan(1): " + Math.toDegrees(Math.atan(1)) + "°");
// Hiperbolik
System.out.println("\n=== HİPERBOLİK ===");
System.out.println("Sinh(1): " + Math.sinh(1));
System.out.println("Cosh(1): " + Math.cosh(1));
System.out.println("Tanh(1): " + Math.tanh(1));
}
}Rastgele sayı üretimi, birçok uygulamada kritik bir role sahiptir. Java, farklı ihtiyaçlara yönelik çeşitli rastgele sayı üretim mekanizmaları sunar.
Math.random() MetoduMath.random() metodu, 0.0 (dahil) ile 1.0 (hariç) arasında rastgele bir double değer üretir.
public class MathRandomTemel {
public static void main(String[] args) {
// Temel kullanım
double rastgele = Math.random();
System.out.println("0-1 arası rastgele: " + rastgele);
// Belirli aralıkta sayı üretme formülü:
// (int)(Math.random() * (max - min + 1)) + min
// 1-10 arası tamsayı
int birOn = (int)(Math.random() * 10) + 1;
System.out.println("1-10 arası: " + birOn);
// 50-100 arası tamsayı
int elliYuz = (int)(Math.random() * 51) + 50;
System.out.println("50-100 arası: " + elliYuz);
// 0-100 arası çift sayı
int ciftSayi = (int)(Math.random() * 51) * 2;
System.out.println("0-100 arası çift: " + ciftSayi);
}
}💡 İpucu:
Math.random()ile belirli bir aralıkta sayı üretirken formülü şöyle hatırlayın:(int)(Math.random() * aralikGenisligi) + baslangicDegeri
Random SınıfıRandom sınıfı, Math.random()’a göre daha esnek ve zengin bir API sunar. Farklı veri türlerinde rastgele değerler üretebilir.
import java.util.Random;
public class RandomSinifiOrnek {
public static void main(String[] args) {
Random rastgele = new Random();
// Farklı türlerde rastgele değerler
System.out.println("Rastgele tamsayı: " + rastgele.nextInt());
System.out.println("0-100 arası: " + rastgele.nextInt(101));
System.out.println("Rastgele ondalık: " + rastgele.nextDouble());
System.out.println("Rastgele boolean: " + rastgele.nextBoolean());
System.out.println("Rastgele float: " + rastgele.nextFloat());
System.out.println("Rastgele long: " + rastgele.nextLong());
// Belirli aralıkta sayı üretme
int min = 10, max = 20;
int aralik = rastgele.nextInt(max - min + 1) + min;
System.out.println(min + "-" + max + " arası: " + aralik);
}
}Seed (tohum değeri), rastgele sayı üretecinin başlangıç durumunu belirler. Aynı seed ile başlatılan üreteçler, her zaman aynı sayı dizisini üretir.
import java.util.Random;
public class SeedOrnek {
public static void main(String[] args) {
// Aynı seed ile aynı sayılar üretilir
Random r1 = new Random(42);
Random r2 = new Random(42);
System.out.println("=== AYNI SEED ===");
System.out.println("r1: " + r1.nextInt(100));
System.out.println("r2: " + r2.nextInt(100)); // Aynı sayı
System.out.println("r1: " + r1.nextInt(100));
System.out.println("r2: " + r2.nextInt(100)); // Aynı sayı
// Farklı seed ile farklı sayılar
Random r3 = new Random(100);
System.out.println("\n=== FARKLI SEED ===");
System.out.println("r3: " + r3.nextInt(100));
// Seed kullanım alanları:
// 1. Testlerde tekrarlanabilirlik
// 2. Oyunlarda harita oluşturma
// 3. Bilimsel simülasyonlar
}
}ThreadLocalRandom SınıfıÇoklu iş parçacığı (multi-thread) ortamlarında performanslı rastgele sayı üretimi için kullanılır.
import java.util.concurrent.ThreadLocalRandom;
public class ThreadLocalRandomOrnek {
public static void main(String[] args) {
// Thread-safe rastgele sayı üretimi
int sayi = ThreadLocalRandom.current().nextInt(1, 101);
System.out.println("Thread-safe rastgele: " + sayi);
// Belirli aralıkta sayı
double ondalik = ThreadLocalRandom.current().nextDouble(0.0, 1.0);
System.out.println("0-1 arası thread-safe: " + ondalik);
// Performans karşılaştırması (tek thread'de bile avantajlı)
long baslangic = System.nanoTime();
for (int i = 0; i < 1000000; i++) {
ThreadLocalRandom.current().nextInt();
}
long sure = System.nanoTime() - baslangic;
System.out.println("ThreadLocalRandom süresi: " + sure + " ns");
}
}// Dosya: RastgeleSayiTemel.java
public class RastgeleSayiTemel {
public static void main(String[] args) {
System.out.println("=== Math.random() KULLANIMI ===");
System.out.println("0-1 arası rastgele: " + Math.random());
System.out.println("1-10 arası rastgele tamsayı: " +
(int)(Math.random() * 10 + 1));
System.out.println("50-100 arası rastgele tamsayı: " +
(int)(Math.random() * 51 + 50));
// Birden fazla rastgele sayı
System.out.println("\n5 adet rastgele sayı (1-100):");
for (int i = 0; i < 5; i++) {
System.out.print((int)(Math.random() * 100 + 1) + " ");
}
System.out.println();
// Rastgele boolean (0.5 olasılıkla)
boolean yaziMi = Math.random() < 0.5;
System.out.println("Yazı mı? " + (yaziMi ? "Evet" : "Hayır"));
}
}// Dosya: RandomSinifiKullanim.java
import java.util.Random;
public class RandomSinifiKullanim {
public static void main(String[] args) {
Random rastgele = new Random();
System.out.println("=== Random SINIFI ===");
System.out.println("Rastgele tamsayı: " + rastgele.nextInt());
System.out.println("0-100 arası: " + rastgele.nextInt(101));
System.out.println("Rastgele ondalık: " + rastgele.nextDouble());
System.out.println("Rastgele boolean: " + rastgele.nextBoolean());
// Rastgele dizi oluşturma
int[] dizi = new int[10];
for (int i = 0; i < dizi.length; i++) {
dizi[i] = rastgele.nextInt(100);
}
System.out.print("Rastgele dizi: ");
for (int sayi : dizi) {
System.out.print(sayi + " ");
}
System.out.println();
// Rastgele renk üretme (RGB)
int kirmizi = rastgele.nextInt(256);
int yesil = rastgele.nextInt(256);
int mavi = rastgele.nextInt(256);
System.out.printf("Rastgele renk: RGB(%d, %d, %d)%n", kirmizi, yesil, mavi);
}
}Normal dağılım, doğada sıkça karşılaşılan bir olasılık dağılımıdır. nextGaussian() metodu, ortalaması 0 ve standart sapması 1 olan normal dağılımdan rastgele değerler üretir.
import java.util.Random;
public class GaussianOrnek {
public static void main(String[] args) {
Random rastgele = new Random();
// Normal dağılım (ortalama=0, std=1)
System.out.println("Normal dağılım örnekleri:");
for (int i = 0; i < 10; i++) {
double gaussian = rastgele.nextGaussian();
System.out.printf("%.3f ", gaussian);
}
System.out.println();
// Belirli ortalama ve standart sapma için dönüşüm
double ortalama = 75.0; // Sınav notu ortalaması
double stdSapma = 10.0; // Standart sapma
System.out.println("\nSınav notu simülasyonu (ort=75, std=10):");
for (int i = 0; i < 5; i++) {
double not = ortalama + stdSapma * rastgele.nextGaussian();
// Notu 0-100 arasında sınırla
not = Math.max(0, Math.min(100, not));
System.out.printf("%.1f ", not);
}
System.out.println();
}
}SecureRandom SınıfıKriptografik olarak güvenli rastgele sayı üretimi için kullanılır. Şifreleme anahtarları, token’lar ve güvenlik sertifikaları gibi hassas uygulamalarda tercih edilir.
import java.security.SecureRandom;
public class SecureRandomOrnek {
public static void main(String[] args) {
SecureRandom guvenli = new SecureRandom();
System.out.println("=== GÜVENLİ RASTGELE SAYILAR ===");
System.out.println("Güvenli tamsayı: " + guvenli.nextInt());
System.out.println("0-100 arası güvenli: " + guvenli.nextInt(100));
// Rastgele byte dizisi
byte[] rastgeleBytes = new byte[16];
guvenli.nextBytes(rastgeleBytes);
System.out.print("Rastgele byte dizisi: ");
for (byte b : rastgeleBytes) {
System.out.printf("%02X ", b);
}
System.out.println();
// Güvenli şifre oluşturma
String sifre = guvenliSifreUret(12);
System.out.println("Güvenli şifre: " + sifre);
}
public static String guvenliSifreUret(int uzunluk) {
SecureRandom rastgele = new SecureRandom();
String karakterler = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"abcdefghijklmnopqrstuvwxyz" +
"0123456789!@#$%^&*()_+-=[]{}|;:,.<>?";
StringBuilder sifre = new StringBuilder();
for (int i = 0; i < uzunluk; i++) {
int index = rastgele.nextInt(karakterler.length());
sifre.append(karakterler.charAt(index));
}
return sifre.toString();
}
}Rastgele karakter dizileri, şifre oluşturma, test verisi hazırlama ve oyun geliştirme gibi alanlarda kullanılır.
import java.util.Random;
public class RastgeleKarakterOrnek {
public static void main(String[] args) {
Random rastgele = new Random();
// Rastgele büyük harf
char buyukHarf = (char)('A' + rastgele.nextInt(26));
System.out.println("Rastgele büyük harf: " + buyukHarf);
// Rastgele küçük harf
char kucukHarf = (char)('a' + rastgele.nextInt(26));
System.out.println("Rastgele küçük harf: " + kucukHarf);
// Rastgele rakam
char rakam = (char)('0' + rastgele.nextInt(10));
System.out.println("Rastgele rakam: " + rakam);
// Rastgele string oluşturma
String rastgeleString = rastgeleStringUret(8);
System.out.println("Rastgele string: " + rastgeleString);
// Rastgele isim oluşturma (basit)
String[] isimler = {"Ali", "Ayşe", "Mehmet", "Zeynep", "Ahmet"};
String[] soyisimler = {"Yılmaz", "Demir", "Çelik", "Kaya", "Öztürk"};
String tamIsim = isimler[rastgele.nextInt(isimler.length)] + " " +
soyisimler[rastgele.nextInt(soyisimler.length)];
System.out.println("Rastgele isim: " + tamIsim);
}
public static String rastgeleStringUret(int uzunluk) {
Random rastgele = new Random();
String karakterler = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < uzunluk; i++) {
int index = rastgele.nextInt(karakterler.length());
sb.append(karakterler.charAt(index));
}
return sb.toString();
}
}Rastgele sayı üretiminde performans, özellikle büyük ölçekli simülasyonlarda önemli bir faktördür.
```java import java.util.Random; import java.util.concurrent.ThreadLocalRandom;
public class PerformansKarsilastirma { public static void main(String[] args) { int iterasyon = 10_000_000;
// Math.random() performansı
long baslangic = System.nanoTime();
for (int i = 0; i < iterasyon; i++) {
Math.random();
}
long mathSure = System.nanoTime() - baslangic;
System.out.println("Math.random(): " + mathSure / 1_000_000 + " ms");
// Random sınıfı performansı
Random rastgele = new Random();
baslangic = System.nanoTime();
for (int i = 0; i < iterasyon; i++) {
rastgele.nextDouble();
}
long randomSure = System.nanoTime() - baslangic;
System.out.println("Random sınıfı: " + randomSure / 1_000_000 + " ms");
// ThreadLocalRandom performansı
baslangic = System.nanoTime();
for (int i = 0; i < iterasyon; i++) {
ThreadLocalRandom.current().nextDouble();
}
long threadSure = System.nanoTime() - baslangic;
System.out.println("ThreadLocalRandom: