## Java Sayı ve Yazı İÅlemleri (Numbers & Strings) Java'da ilkel (Primitive) veri tiplerinden bahsetmiÅtik. Bu veri tiplerinin bir de referans özellikte olanları da vardır. Bunlar sınıf tabanlı veri tipleri diyoruz. ÃrneÄin: tamsayı olan ve ilkel bir veri tipi olan "int" tipinin bir de "Integer" Åeklinde bir sınıf ile temsil edildiÄi veri tiplerine referans veri tipi diyoruz. Bunun yanında matematiksel iÅlemlere yardımcı olmak ve matematiksek fonksiyonları hazır kullanmak için Java'da Math isminde bir hazır tanımlanmıŠsınıf vardır. AÅaÄıdaki örnekler kodların içinde gerekli açıklamalar verilmiÅtir. **Ãrnek:** ```java // Veri dönüÅümü Long personelId = new Long(100); int personalAsId = personelId.intValue(); byte personalAsByte = personelId.byteValue(); short personalAsShort = personelId.shortValue(); double personalAsDouble = personelId.doubleValue(); float personalAsFloat = personelId.floatValue(); String personalAsText = personelId.toString(); System.out.println(personalAsId); System.out.println(personalAsByte); System.out.println(personalAsShort); System.out.println(personalAsDouble); System.out.println(personalAsFloat); System.out.println(personalAsText); // Kıyaslama metodu ===> compareTo Long personelId = new Long(100); System.out.println(personelId.compareTo(50L)); System.out.println(personelId.compareTo(100L)); System.out.println(personelId.compareTo(150L)); // deÄerlerin eÅitliÄini karÅılaÅtırma metodu ===> equals Long personelId = new Long(100); System.out.println(personelId.equals(50L)); System.out.println(personelId.equals(100L)); // String deÄerlerden sayılara dönüÅüm metodu ===> valueOf long number1 = Long.valueOf("100"); int number2 = Integer.valueOf("5"); short number3 = Short.valueOf("1"); // String deÄerlerden sayılara dönüÅüm metodu ===> parseX long number1 = Long.parseLong("100"); int number2 = Integer.parseInt("5"); short number3 = Short.parseShort("1"); // mutlak deÄer alma fonksiyonu ===> abs Integer a = -8; double d = -100; float f = -90; System.out.println(Math.abs(a)); System.out.println(Math.abs(d)); System.out.println(Math.abs(f)); // ceil metodu ile yukarı yuvarlama, floor ile ise aÅaÄı yönlü yuvarlama yapılır. double d = 100.675; float f = 90.15f; System.out.println(Math.ceil(d)); System.out.println(Math.ceil(f)); System.out.println(Math.floor(d)); System.out.println(Math.floor(f)); // rint metodu ile ondalıklı kısım 0.5'den büyükse yukarı doÄru // eÄer 0.5'e eÅit ve küçük ise aÅaÄı doÄru yuvarlama yapar. rint fonksiyonu sonuç olarak sadece int tipinde deÄer verir. double d = 100.675; double e = 100.500; double f = 100.200; System.out.println(Math.rint(d)); System.out.println(Math.rint(e)); System.out.println(Math.rint(f)); // rint metodu ile ondalıklı kısım 0.5'e eÅit ve büyükse yukarı doÄru // eÄer 0.5'den küçük ise aÅaÄı doÄru yuvarlama yapar. // round fonksiyonu long veya int döndürür. double d = 100.675; double e = 100.500; float f = 100; float g = 90f; System.out.println(Math.round(d)); System.out.println(Math.round(e)); System.out.println(Math.round(f)); System.out.println(Math.round(g)); // max verilen iki deÄerden en büyüÄünü döndürür. // min verilen iki deÄerden en küçüÄünü döndürür. System.out.println(Math.min(12.123, 12.456)); System.out.println(Math.max(12.123, 12.456)); // e tabanında log alma fonksiyonudur. double x = 2.76; System.out.printf("log(%.3f) is %.3f%n", x, Math.log(x)); // üs alma fonksiyonudur. 2 üzeri 3 gibi. double x = 2; double y = 3; System.out.printf("pow(%f, %f) is %f", x, y, Math.pow(x, y)); // karekök alma fonksiyonudur. double x = 4; System.out.printf("sqrt(%.3f) is %.3f%n", x, Math.sqrt(x)); // 0-1 arasında rastgele sayı üretme fonksiyonudur. System.out.println(Math.random()); //PI Sayısının DeÄerini almak için PI sabiti kullanılabilir. System.out.println(Math.PI); ``` ## Java'da String İÅlemleri Java'da varsayılan dil içerisinde gelen String iÅleme kütüphaneleri mevcuttur. String sınıfı içinde yer alan statik fonksiyonlarda yazılımcılara yardımcı olmaktadır. String veri tipi Java'da ilkel (primitive) bir veri tipi deÄildir (non-primitive veri tipidir). Bu nedenle "new" anahtar sözcüÄü kullanılarak nesne Åeklinde oluÅturulabilir. Java'da String veri tipinde bir deÄiÅken tanımı aÅaÄıdaki gibi yapılabilir. Buna Literal tanımlama diyoruz. Sıklıkla kullanılan bir tanımlama biçimidir. DeÄiÅkene direkt olarak veriyi "=" operatörüyle atama yapıyoruz. ```java String greeting = "Hello world!"; ``` Literal tanımlama dıÅında "new" anahtar sözcüÄüyle bir nesne olarak oluÅturabilirsiniz. Bu yöntemle Heap hafıza bölgesinde bir alan kaplamıŠolursunuz. Literal tanımlama ile Heap hafızadan kazanç saÄlanır. Ãrnek: ``` String helloString = new String("Merhaba Dunya!"); ``` String tipinde tanımlanan deÄiÅkenler veya nesneler deÄiÅtirilemez duruma sahiptir. Buna Immutable Object denir. String içindeki deÄeri deÄiÅtirmek isterseniz. Yeni bir deÄiÅken veya nesne tanımlama yapmak gerekecektir. String veri tipi niçin Immurable (DeÄiÅtirilemez) tasarlandı diye düÅünebilirsiniz. Bunun birden fazla sebebi vardır. Ãncelikle, yazılım geliÅtirilirken String veri tipi çok sık kullanılır. String tipinde sürekli nesne üretilmesi Heap hafıza bölgesini çok kötü kullanmaya ve performans problemlerine yol açar. Bu nedenle Literal tanımlarla ve özel String Pool (Havuz) ile birlikte performans kazancı hedeflenmiÅtir. String'ler için Java'da özel bir hafıza bölgesi vardır. Bu bölgede bir String havuzu vardır. Gerçekten bu havuz içinde belli miktarda tanımlı String nesneleri bulunur. Bu nesneler Heap hafızada belli bir bölgeyi kaplarlar. Fakat, sınırlı sayıdadırlar. AÅaÄıda, Literal tanımlama ile "new" ile String oluÅturma arasındaki fark gösterilmektedir. İki tane Literal tanımlı s1 ve s2 isminde deÄiÅkenimiz olduÄunu düÅünelim. ```java String s1 = "Hello World"; String s2 = "Hello World"; s1 == s2 ```  Yukarıdaki örnekte bizler iki tane s1 ve s2 tipinde iki tane Literal tanımlı deÄiÅkenler oluÅturduk. Aslında, bu iki deÄiÅken aynı deÄere sahip oldukları içim String Pool'dan (Havuzdan) önceden oluÅturulmuÅ bir nesneyi iÅaret ederek iki tane ayrı hafıza bölgesini doldurmaktan kurtuldular ve hafıza kazancı saÄladılar. Yukarıdaki Åekilde de bu durum izah edilmektedir. S3 deÄiÅkeni s1 ve s2 ile aynı deÄere sahip olsa da "new" ile yeni bir nesne olarak oluÅturulduÄu için hafızada baÅka bir bölgede oluÅturulur. Ãrnek: ```java String s1 = "Hello"; String s2 = "Hello"; String s3 = "Merhaba"; String s4 = new String("Merhaba"); System.out.println("s1 == s2 : " + (s1 == s2)); System.out.println("s2 == s3 : " + (s2 == s3)); System.out.println("s3 == s4 : " + (s3 == s4)); ``` Yukarıdaki örnekte de bu durum geliÅtirilmiÅtir. s1 ve s2 deÄiÅkenleri aynı deÄere sahip Literal tanımlı String deÄiÅkenleri oldukları için aynı hafıza bölgesini iÅaret ederler. s3 deÄiÅkeni Literal tanımlı olmasına raÄmen baÅka bir deÄere sahip olduÄu için String Pool'dan (Havuzdan) baÅka bir nesneyi alıp onu iÅaret etmektedir. s4 deÄiÅkeni ise "new" ile oluÅturulduÄu için Heap hafızadan bambaÅka bir alanı almıÅtır. Yukarıdaki programın çıktısı aÅaÄıdaki gibidir. "==" operatörü String'lerde hafıza adresi kıyaslaması yapar. s1 ile s2 aynı hafıza adresini gösterir. s2 ve s3 Literal tanımlı olsalar da havuzdaki farklı nesneleri iÅaret ettikleri için adresleri eÅit deÄildir. s3 ve s4 aynı deÄerlere sahip olsa da biri Literal tanımlıdır ve havuzdaki bir nesneyi iÅaret eder. DiÄeri ise "new" ile tanımlandıÄı için Heap hafızada baÅka bir adresi iÅaret eder. ```java s1 == s2 : true s2 == s3 : false s3 == s4 : false ``` String'ler deÄiÅtirilemez olduÄu için Güvenlik ile ilgili konularda da varsayılan olan korumacı bir özelliÄe sahiptir. Ayrıca, String deÄiÅkenler Immutable (DeÄiÅtirilemez) olduklarından dolayı Ãok Kanallı (MultiThread) programlamada Thread-Safe özelliÄe sahiptirler. String Pool, String Literal ve String new arasındaki fark size mülakatlarda sorulabilir. Not: String veri tiplerinde verinin karakter uzunluÄunu bulmak için "length()" metodundan faydalanılır. Ãrnek: ```java String s1 = "Hello"; int lengthOfs1 = s1.length(); ``` Not: String ifadeleri birbiriyle birleÅtirmek için "+" operatörü veya "concat" metodu kullanılır. Ãrnek: ```java String namePrefix = "My name is "; String greetimgMessage = namePrefix.concat("Zara"); ``` ### Formatlı String İfadeler OluÅturmak Java'da "String.format" metoduyla formatlı veriler oluÅturabilirsiniz. "format" metodu String sınıfının static fonksiyonudur. Nesne üretmeksizin direkt sınıf ismiyle çaÄırabilirsiniz. Ãrnek: ```java int speed = 50; String departureCityName = "Akhisar"; String arrivalCityName = "İstanbul"; String fullText = String.format("Aracın ortalama hızı: %d kilometredir." + "Araç %s Åehrinden kalkıp %s Åehrine varacaktır.", speed, departureCityName, arrivalCityName); System.out.println(fullText); ``` Yukarıdaki örnekte bir metin oluÅturulmaya çalıÅılıyor. Metin içerisinde tanım sayıları ifade eden %d ve String veri tipini ifade eden %s alanları vardır. Bu alanlar dinamiktir. Gelen deÄerleri cümle içinde gösterilmesini saÄlarlar. ### String Metodları ve Ãzellikleri ```java String s = "Strings are immutable"; // s isimli String deÄiÅkendeki ifadenin 8. indeksindeki karakteri alır. // Burada dikkat edilmesi gereken Åey indeksler sıfırdan baÅlar. O yüzden 9. karakteri okuyoruz. char result = s.charAt(8); ----------------------------------------------------------- String str1 = "Strings are immutable"; String str2 = "Strings ARE immutable"; // s1 ve s2 deÄiÅkenleri içinde yer alan deÄerleri büyük küçük harf duyarlılıÄı olmaksızın kıyaslar. int result = str1.compareToIgnoreCase(str2); System.out.println(result); ----------------------------------------------------------- String str = new String("This is really not immutable!!"); // String ifadenin sonu verilen ifadeyle bitiyor mu kontrol eder. true veya false döner. // Cümlenin sonu "immutable!!" ile bitiyor mu kontrol ediyoruz. true döner. boolean retVal = str.endsWith( "not immutable!!" ); System.out.println("Returned Value = " + retVal ); ----------------------------------------------------------- String str1 = new String("This is really not immutable!!"); String str2 = new String("This is really not immutable!!"); // equals metodu iki String deÄiÅkenin aynı deÄere sahip olup olmadıÄını kıyaslar. // == operatörü ile iki String'leri kıyaslasaydık, hafıza adreslerini kıyaslamıŠolacaktır. // O da false dönecekti. boolean retVal = str1.equals( str2 ); System.out.println("Returned Value = " + retVal ); ----------------------------------------------------------- String str = new String("Welcome to kodluyoruz.org"); String subStr1 = new String("Tutorials"); // indexOf metodu verilen ifadenin cümlede nerede hangi indeksten itibaren baÅladıÄını belirtir. // EÄer ifadeyi cümle içinde bulamazsa -1 döner. System.out.println("Found Index :" + str.indexOf( subStr1 )); ----------------------------------------------------------- String str = new String("Welcome to kodluyoruz.com"); // replace metoduyla bir cümle içindeki istediÄimiz ifadeyi bir baÅka ifade ile deÄiÅtirebiliriz. // ÃrneÄin: Welcome ifadesini Merhaba ile deÄiÅtiriyoruz. // DeÄiÅiklik sonucunda deÄiÅmiÅ halini yeni bir String olarak döner str = str.replace("Welcome", "Merhaba"); str = str.replace("to", ""); System.out.println(str); ----------------------------------------------------------- String str = new String("Welcome-to-kodluyoruz.org"); // split fonksiyonu cümleyi ayırmak için bir karakter alır. // Sonra o karaktere göre cümleyi parçalara böler. // bu örnekte - iÅaretiyle ayırma iÅlemi uygulanmıÅtır. String[] items = str.split("-"); System.out.println("Return Value :" ); ----------------------------------------------------------- String str = new String("Welcome to kodluyoruz.com"); // startsWith metoduyla cümle belirtilen ifadeyle baÅlıyor mu diye kontrol edilebilir. System.out.println(str.startsWith("Welcome") ); ----------------------------------------------------------- String str = new String("Welcome to kodluyoruz.com"); // substring fonksiyonu verilen baÅlangıç indeksinden itibaren verilen bitiÅ indeksine kadar olan bölümü kırpar ve yeni bir string olarak döndürür. String subStringPart = str.substring(10, 15); ``` ```java // Char Array içindeki deÄerler, String objesi oluÅturduktan sonra içeri deÄer olarak verilirse // String bir ifadeye dönüÅür char data[] = {'a', 'b', 'c'}; String myFirstString = new String(data); // String içindeki deÄerleri char tipine dönüÅtürdükten sonra char tipinde kullanılabilir. for (char c: myFirstString.toCharArray()) { System.out.println(c); } ----------------------------------------------------------- // String içindeki deÄeri deÄiÅtirmek için replace() metodu kullanılabilir. // buradan gelen deÄer yeni bir String olarak kullanılabilir. String secondString = myFirstString.replace('a','z'); for (char c: secondString.toCharArray()) { System.out.println(c); } System.out.println(secondString); System.out.println(myFirstString); ----------------------------------------------------------- // İki farklı String deÄerinin içeriklerinin eÅit olma durumuna göre true veya false döner. String one = "Kodluyoruz."; String two = "Kodluyoruz."; boolean result = one.contentEquals(two); System.out.println(result); ----------------------------------------------------------- // Parametre olarak (data) verdiÄimiz char[] deÄeri String bir ifade olarak döner. String s = String.copyValueOf(data); System.out.println(s); ----------------------------------------------------------- // EÄer String deÄeri içinde belirli bir index deÄeri arıyorsak contains() metodu kullanılabilir. if(myFirstString.contains("z")){ System.out.println("Evet var"); }else { System.out.println("Hayır yok"); } ----------------------------------------------------------- // Sting deÄerinin hangi ifadeyle bittiÄini sorgulamak için endsWith() metodu kullanılabilir. String test = "Kodluyoruz."; boolean b = test.endsWith(".") ? true : false; System.out.println(b); ``` ```java // concat() metodu String deÄerinin sonuna içeriye girilen String deÄerini ekler. String myString = "Selam Dünya, Merhaba."; String resultStr = myString.concat("Dünya"); System.out.println(resultStr); ----------------------------------------------------------- // join() metodu ile String deÄerinin baÅına ve sonuna deÄerler eklenebilir. String a = String.join(myString, "ilk ","son"); System.out.println(a); ----------------------------------------------------------- // içeriye girilen String deÄerinin hangi index içinde olduÄunu dönen metod => lastInedxOf() // Belirli bir index aralıÄı içinde de arama yapılabilir. int value = a.lastIndexOf("s"); int secondValue = a.lastIndexOf("n",8); System.out.println(value); System.out.println(secondValue); ----------------------------------------------------------- String myStringValue = "Selam Dünya, Merhaba."; String myStringValue2 = "Selam Dünya, Merhaba."; String secondResultStr = "Selam Dünya, Merhabalar."; // matches() metodu String deÄerlerinin eÅit olma durumuna göre true veya false döner. boolean v1 = myStringValue.matches(myStringValue2); boolean v2 = myStringValue.matches(secondResultStr); System.out.println("DeÄerler = "+v1+" : "+v2); ----------------------------------------------------------- // String deÄerinin belirli bir bölümünü çekmek için substring() metodu kullanılır. // 0'dan baÅlar girilen index deÄerini dahil etmez. String newStr = myStringValue.substring(6); System.out.println(newStr); ----------------------------------------------------------- // 19 dahil deÄil 6 dahil String newStr2 = myStringValue.substring(6, 19); System.out.println(newStr2); String newString = "Selam Dünya, Merhaba ba."; ----------------------------------------------------------- //String eÄer içinde girilen ifadeyi barındıyorsa "kelime olarak" true döner. boolean tr = newString.contains("Dünya"); System.out.println(tr); ----------------------------------------------------------- // EÄer ilk girilen kelime string içinde varsa ikinci girilen kelime ile yer deÄiÅtirir string döner. String deneme = newString.replaceFirst("Dünya", "World"); System.out.println(deneme); ----------------------------------------------------------- // İlk girilen deÄer içeride varsa o deÄerlerin yerine ikinci girilen deÄer geçer. String deneme2 = newString.replaceAll("ba","World"); System.out.println(deneme2); ``` ### StringBuilder Sınıfının Kullanımı Java'da performanslı String birleÅtirme iÅlemleri için "StringBuilder" sınıfı kullanılabilir. "+" operatörü ve "concat" fonksiyonuna göre daha performanslı bir yöntemdir. Ãrnek: ```java StringBuilder builder = new StringBuilder(); builder.append("İlk cümle"); builder.append("İkinci cümle"); builder.append("Ãçüncü cümle"); System.out.println(builder.toString()); ``` "append" metoduyla String ifadeler eklenir. Ardından, "toString" metoduyla birleÅtirilmiÅ tüm String ifade alınır. ### StringBuilder Sınıfının DiÄer Metodları ```java StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("Kodluyoruz Harika !!! "); stringBuilder.append(10); stringBuilder.append('#'); System.out.println(stringBuilder.toString()); // insert metodunu kullanarak istenilen index'e yeni deÄer eklenebilir. stringBuilder.insert(stringBuilder.length()-1, " yeni deÄer "); System.out.println(stringBuilder.toString()); ----------------------------------------------------------- StringBuilder secondStringBuilder = new StringBuilder(); secondStringBuilder.append("Kodluyoruz Mükemmel tttt"); // İçerideki tüm deÄerleri olduÄu gibi tersine çevirir. secondStringBuilder.reverse(); System.out.println(secondStringBuilder.toString()); ----------------------------------------------------------- // stringBuilder deÄeri uzunluÄu length() metoduyla bulunabilir. int length = secondStringBuilder.length(); System.out.println(length); ----------------------------------------------------------- // capacity() metoduyla da uzunluk bulunabilir. System.out.println(secondStringBuilder.capacity()); ----------------------------------------------------------- // İstediÄiniz index aralıÄındaki deÄerleri deÄiÅtirmek için replace() metodu kullanılabilir. secondStringBuilder.replace(0,4,"Test"); System.out.println(secondStringBuilder.toString()); ----------------------------------------------------------- // BelirlediÄimiz index aralıÄındaki deÄerleri siler. secondStringBuilder.delete(0,5); System.out.println(secondStringBuilder.toString()); ----------------------------------------------------------- // Parametre olarak gönderilen index deÄerini int tipinde alır ve girilen index deÄerini siler. // Son index deÄerindeki char deÄerini sildik secondStringBuilder.deleteCharAt(secondStringBuilder.length()-1); System.out.println(secondStringBuilder.toString()); ``` ### Sorular ``` 1. AÅaÄıdaki veri tiplerini doÄru Åekilde tanımlayınız. myNumb = 123456373; myNumb = 7; myNumb = 8.98f; myNumb = 123.20; myString = "Kodluyoruza HoÅgeldin"; 2. AÅaÄıdaki deÄerleri istenilen deÄerlere dönüÅtürün. double myDouble = 9.78; int myInt = myDouble; ***************************** int myInt = 25; double myDouble = myInt; 3. AÅaÄıdaki deÄerlerin küçük olanını ve büyük olanın deÄerlerini yazdırın. (Math kullanarak) int x = 5; int y = 10; 4. İki tane minimum 10 karakterli String deÄer tanımlayın ve bu deÄerlerden 5. indexten sonrasını ekrana yazdırın. 5. Soyadınız ve adınızı içeren bir StringBuilder tanımlayın tersine çevrilmiÅ Åekilde ekrana yazdırın. 6. İki tane String oluÅturun ve bu deÄerlerin içinde "a" harfi geçiyor mu kontrol edin. ``` ### Cevaplar ```java 1. long, int, float, double, String ------------------------------------------ 2. double myDouble = 9.78; int myInt =(int)myDouble; System.out.println(myInt); *********************************** int myInt = 25; double myDouble = (double) myInt; System.out.println(myDouble); ------------------------------------------ 3. int x = 5; int y = 10; System.out.println(Math.min(x,y)); System.out.println(Math.max(x,y)); ------------------------------------------ 4. String str1 = "Kodluyoruz."; String str2 = "Kod yazmak çok eÄlenceli."; System.out.println(str1.substring(5)); System.out.println(str2.substring(5)); ------------------------------------------ 5. StringBuilder adSoyad = new StringBuilder(); adSoyad.append("soyad ad"); adSoyad.reverse(); System.out.println(adSoyad.toString()); ------------------------------------------ 6. String str1 = "Kodluyoruz Mükemmel"; String str2 = "Kodluyoruz Harika"; System.out.println(str1.contains("a")); System.out.println(str2.contains("a")); ``` ### Kaynaklar * [Oracle JavaSE Docs - String](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html) * [W3Schools JavaSE - DataTypes](https://www.w3schools.com/java/java_data_types.asp) * [JavaPoint JavaSE - Math](https://www.javatpoint.com/java-math)