Enteresan Bir Kod Olayı (YAZILIM)
-
ozgunlu bunu yazdı
Almaz, ikisi ayni deger farkli objeler. Primitive type degiller, objeleri kiyaslarken equals kullanilir.
Ayrıca; @unbalanced ve @theholiqan' ın dediği gibi bazen karşılaştırır bazen karşılaştırmaz diye bir olay yok.
Burdan da cevabını bulabilirsin;
http://stackoverflow.com/questions/7520432/java-vs-equals-confusion
hocam konuda linki verdim..
5.0 ile 5 ie karşılaştır hem equals ile hem == bak bakalım farklı sonuç dönüyor mu :)
-
unbalanced bunu yazdıozgunlu bunu yazdı
Almaz, ikisi ayni deger farkli objeler. Primitive type degiller, objeleri kiyaslarken equals kullanilir.
Ayrıca; @unbalanced ve @theholiqan' ın dediği gibi bazen karşılaştırır bazen karşılaştırmaz diye bir olay yok.
Burdan da cevabını bulabilirsin;
http://stackoverflow.com/questions/7520432/java-vs-equals-confusion
hocam konuda linki verdim..
5.0 ile 5 ie karşılaştır hem equals ile hem == bak bakalım farklı sonuç dönüyor mu :)
hocam 5.0' ı double olarak tanımlarsan eşit çıkar == de.
Ama sen obje olarak tanımlıyorsun long olarak, bellekte tutulduklar yerler farklı. == metodu adresine bakıyor, primitive type ler için geçerli.
equals obje karşılaştırmalarında kullanılır, arkadaşın tanımladığı long değeri obje, keza string' de java da objedir. sen bunları == ile kıyaslamaya kalkarsan her defasında hata alırsın.
ama equals bi doğru verir bi yanlış yoktur
ozgunlu tarafından 03/Şub/16 13:06 tarihinde düzenlenmiştir -
hocam eski konuda açıkladım biraz, yanlışın doğrunun alakası tipiyle ilgilidir. O yüzden bu tarz şeyleri kullanırken tiplerini gözönünde bulundurmak gerekir. Bir yanlış bir doğru çalışır diye diyen bir şey olmadı, farklı tipte değerler verirsen farklı sonuçlar alabilirsin o yüzden dikkatli olunması lazım dedim önceki konuda ve linkini de verdim.
-
Dün bu konu üstünde baya bi araştırma yaptım ne kadar basit bir konu olsa bile bazen if-else yazarken hiçbir şekilde kontrole etmezdim çalışıp çalışmadığını çünkü == ibaresi benim için EŞİT se anlamını ifade ediyordu bu gün anladım ki o kadar kolay değil biryerde String ifade karşılaştırırken 0 hata almak için önce string değeri parçalayıp CHAR dizi yaparak yani tek tek ascii kodlarını karşılarştırmak en iyisi Int-double gibi sayısal değerlerde @unbalanced abimin dediği gibi çıkarma işlemi yapmak en mantıklısı çünkü her zaman WebService/Database vs vs dışardan gelen veriler aynı tipte olmuyor. O yüzden == kullanmak biraz saçma imiş zaten ikisinin eşit olmasının sebepleri var ki olmalı yoksa eşitlik kavramı ortada olmaz biz yazılımcılar eşitse gibi ibare kullanmamamız gerekiyor . çünkü en ince ayrıntısına kadar bilmeliyiz çoğu şeyi.. Sayılarla işlemde çıkarma String ifadede ascii karşılaştırma mantıklı olandır . Tembellik edik == kullanmamalıymışız .. Bazıları bu görüşü gömüyor adam diyor 1 işlemi neden uzatayım aslında doğru program yavaşlar ama 0 hata için bunu göze almak gerekir @ozgunlu : Hocam sizin dediğiniz equals metodunun bir yararı yok bize denedim çünkü zaten o 2 veriyi karşılaştırıyor gene aynı kapıya çıkıyor yani @unbalanced abimin dediği gibi çıkarma işlemi en sağlı çalışanı bunu öğrendiğim iyi oldu teşekkürler :)
@sLeymN Hocam Long ve long aynı kapıya çıkıyor Long sadece long'un kalıntısı gibi birşey sanırım o yüzden bununla ilgili olacağını sanmıyorum çünkü 2 String değeri de karşılaştırırken düzgün çalışmıyor LeymN
-
Hacı object oriented olayına alışıp kod yazıyorsun ama == ten doğan sıkıntıyla nasıl ilk defa yeni karşılaşıyorsun onu anlamadım :S normalde ilk yapılan hatalardan biridir bu.
-
whopper bunu yazdı
Hacı object oriented olayına alışıp kod yazıyorsun ama == ten doğan sıkıntıyla nasıl ilk defa yeni karşılaşıyorsun onu anlamadım :S normalde ilk yapılan hatalardan biridir bu.
Bilmiyorum daha önce hiç karşıma çıkmadı gerçekten :/ genelde Equals ile çözüyordum fakat bu sefer olmadı o yüzden dün Equals da çalışmayınca kafamda birsürü soru işareti oldu .0 gibi gösterse diyeceğim ki .0 olduğu için karşılaştrmada hata oluyor ama öyle bi durumda olmadı çok ileri düzey bi programcı olmadığım için böyle bi durumla ilk defa karşılaştım :/ Yavaş yavaş öğreniyorum böyle basit şeyleri bazen büyüğe oynayınca basitler büyükten daha çok sıkıntı çıkarıyor Şekil A :)
-
MhmdAlmz bunu yazdı
Dün bu konu üstünde baya bi araştırma yaptım ne kadar basit bir konu olsa bile bazen if-else yazarken hiçbir şekilde kontrole etmezdim çalışıp çalışmadığını çünkü == ibaresi benim için EŞİT se anlamını ifade ediyordu bu gün anladım ki o kadar kolay değil biryerde String ifade karşılaştırırken 0 hata almak için önce string değeri parçalayıp CHAR dizi yaparak yani tek tek ascii kodlarını karşılarştırmak en iyisi Int-double gibi sayısal değerlerde @unbalanced abimin dediği gibi çıkarma işlemi yapmak en mantıklısı çünkü her zaman WebService/Database vs vs dışardan gelen veriler aynı tipte olmuyor. O yüzden == kullanmak biraz saçma imiş zaten ikisinin eşit olmasının sebepleri var ki olmalı yoksa eşitlik kavramı ortada olmaz biz yazılımcılar eşitse gibi ibare kullanmamamız gerekiyor . çünkü en ince ayrıntısına kadar bilmeliyiz çoğu şeyi.. Sayılarla işlemde çıkarma String ifadede ascii karşılaştırma mantıklı olandır . Tembellik edik == kullanmamalıymışız .. Bazıları bu görüşü gömüyor adam diyor 1 işlemi neden uzatayım aslında doğru program yavaşlar ama 0 hata için bunu göze almak gerekir @ozgunlu : Hocam sizin dediğiniz equals metodunun bir yararı yok bize denedim çünkü zaten o 2 veriyi karşılaştırıyor gene aynı kapıya çıkıyor yani @unbalanced abimin dediği gibi çıkarma işlemi en sağlı çalışanı bunu öğrendiğim iyi oldu teşekkürler :)
@sLeymN Hocam Long ve long aynı kapıya çıkıyor Long sadece long'un kalıntısı gibi birşey sanırım o yüzden bununla ilgili olacağını sanmıyorum çünkü 2 String değeri de karşılaştırırken düzgün çalışmıyor LeymN
Şimdi şuna bi açıklık getir kafanda, String' ler primitive type değildir JAVA' da. Objedir.
Ve yine java' da "==" kıyaslamasını objeler üzerinde yaparsan adreslerini kıyaslar.
Primitive type' lar arasında değerlerini kıyaslar.
Objelerin değerlerini kıyaslamak için "equals" kullanılır.
örnek verecek olursak ;
double a = 5.0;
int b = 5;
if (a == b) -> TRUE
-----------------------------
long a = 5;
int b = 5;
if (a==b) -> TRUE
------------------------------
String a = "5" -> obje
int b = 5;
if (a == b) -> FALSE
if (a.equals(b)) -> FALSE
if (Integer.parseInt(a) == b) -> TRUE
------------------------------
String a = "5";
String b = "5";
if (a == b) -> FALSE
if (a.equals(b)) -> TRUE
-------------------------------
- İlk örnekte ikisi de primitive type' dır ve "==" operator' ü için ikisi de eşittir.
- İkinci örnekte ikisi de primitive type' dır ve "==" operator' ü için ikisi de eşittir.
- Üçüncü örnekte String değeri objedir ve "==" operator' ünde objelerin adres değerine bakıldığı için eşit değildir.
Ayrıca üçüncü örnekte obje ile primitive type kıyaslayamazsın, equals ile. O yüzden yine false döner. Ama sen String' i parse edersen diğer türe göre (parseInt, parseLong, parseDouble vs.)
sonra "==" operator' ünü kullanabilirsin ve sonuç true döner.
- Son örnekte ikisi de obje olduğu için "==" operatorü çalışmayacaktır, equals ise çalışacaktır.
Son söz fantaziye kaçma, gelen değerlerin tiplerine göre birbirlerine parse edersen her zaman doğru değeri alırsın.
Bu da son örnek;
String a = "5";
int b = 5;
if (String.valueOf(b).equals(a)) -> TRUE
-
MhmdAlmz bunu yazdıwhopper bunu yazdı
Hacı object oriented olayına alışıp kod yazıyorsun ama == ten doğan sıkıntıyla nasıl ilk defa yeni karşılaşıyorsun onu anlamadım :S normalde ilk yapılan hatalardan biridir bu.
Bilmiyorum daha önce hiç karşıma çıkmadı gerçekten :/ genelde Equals ile çözüyordum fakat bu sefer olmadı o yüzden dün Equals da çalışmayınca kafamda birsürü soru işareti oldu .0 gibi gösterse diyeceğim ki .0 olduğu için karşılaştrmada hata oluyor ama öyle bi durumda olmadı çok ileri düzey bi programcı olmadığım için böyle bi durumla ilk defa karşılaştım :/ Yavaş yavaş öğreniyorum böyle basit şeyleri bazen büyüğe oynayınca basitler büyükten daha çok sıkıntı çıkarıyor Şekil A :)
kolay gelsin reyiz her şey hallolur.
-
@whopper daha yeni başladım 5. senem yetişmem lazım :/ Umarım hallolur zevkli iş :D
@ozgunlu hocam verdiklerinizi yapmıştım gene aynı sorunu yaşadım galiba bende bi sıkıntı var kodlarda vardı sıkıntı bunu yaparken sanırım örnekleri 5 dk önce tek tek denedim sizin örnekleri hepsi dediğiniz gibi döndü teşekkür ederim açıklama için Dikkat etmek gerekiyor pür dikkat
-
MhmdAlmz bunu yazdı
Dün bu konu üstünde baya bi araştırma yaptım ne kadar basit bir konu olsa bile bazen if-else yazarken hiçbir şekilde kontrole etmezdim çalışıp çalışmadığını çünkü == ibaresi benim için EŞİT se anlamını ifade ediyordu bu gün anladım ki o kadar kolay değil biryerde String ifade karşılaştırırken 0 hata almak için önce string değeri parçalayıp CHAR dizi yaparak yani tek tek ascii kodlarını karşılarştırmak en iyisi Int-double gibi sayısal değerlerde @unbalanced abimin dediği gibi çıkarma işlemi yapmak en mantıklısı çünkü her zaman WebService/Database vs vs dışardan gelen veriler aynı tipte olmuyor. O yüzden == kullanmak biraz saçma imiş zaten ikisinin eşit olmasının sebepleri var ki olmalı yoksa eşitlik kavramı ortada olmaz biz yazılımcılar eşitse gibi ibare kullanmamamız gerekiyor . çünkü en ince ayrıntısına kadar bilmeliyiz çoğu şeyi.. Sayılarla işlemde çıkarma String ifadede ascii karşılaştırma mantıklı olandır . Tembellik edik == kullanmamalıymışız .. Bazıları bu görüşü gömüyor adam diyor 1 işlemi neden uzatayım aslında doğru program yavaşlar ama 0 hata için bunu göze almak gerekir @ozgunlu : Hocam sizin dediğiniz equals metodunun bir yararı yok bize denedim çünkü zaten o 2 veriyi karşılaştırıyor gene aynı kapıya çıkıyor yani @unbalanced abimin dediği gibi çıkarma işlemi en sağlı çalışanı bunu öğrendiğim iyi oldu teşekkürler :)
@sLeymN Hocam Long ve long aynı kapıya çıkıyor Long sadece long'un kalıntısı gibi birşey sanırım o yüzden bununla ilgili olacağını sanmıyorum çünkü 2 String değeri de karşılaştırırken düzgün çalışmıyor LeymN
aslında aynı şey değil hocam
https://docs.oracle.com/javase/7/docs/api/java/lang/Long.html ---> Class
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html ---> primitive veri tipi
