Saya memiliki kode berikut:
if(!partialHits.get(req_nr).containsKey(z) || partialHits.get(req_nr).get(z) < tmpmap.get(z)){
partialHits.get(z).put(z, tmpmap.get(z));
}
dimana partialHits
ada HashMap.
Apa yang akan terjadi jika pernyataan pertama benar? Apakah Java masih akan memeriksa pernyataan kedua? Karena agar pernyataan pertama menjadi benar, HashMap tidak boleh berisi kunci yang diberikan, jadi jika pernyataan kedua dicentang, saya akan mendapatkannya NullPointerException
.
Jadi dengan kata sederhana, jika kita memiliki kode berikut
if(a && b)
if(a || b)
akankah Java memeriksa b
apakah a
salah dalam kasus pertama dan apakah a
benar dalam kasus kedua?
sumber
*
dan+
sebagai logisand
danor
;((A?1:0) * (B?1:0)) == 1
,((A?1:0) + (B?1:0)) > 0
. Anda bahkan dapat melakukanxor
:((A?1:0) + (B?1:0)) == 1
.boolean
operator (logis). Ini berbeda daribitwise
operator (integer), meskipun memiliki simbol yang sama ...!(str != null && !str.isEmpty())
menjadi:(str !(!=) null !(&&) !(!)str.isEmpty())
dan kemudian:(str == null || str.isEmpty())
karena:!(!=) is ==
!(&&) is ||
!(!) eliminates itself
negasi berguna lainnya adalah:!(<) is >=
!(>) is <=
dan sebaliknyaJava memiliki 5 operator perbandingan boolean yang berbeda: &, &&, |, ||, ^
& dan && adalah operator "dan", | dan || "atau" operator, ^ adalah "xor"
Yang tunggal akan memeriksa setiap parameter, terlepas dari nilainya, sebelum memeriksa nilai parameter. Yang ganda pertama-tama akan memeriksa parameter kiri dan nilainya dan if
true
(||
) ataufalse
(&&
) membiarkan yang kedua tidak tersentuh. Terdengar terkompilasi? Contoh mudah harus menjelaskan:Diberikan untuk semua contoh:
String aString = null;
DAN:
if (aString != null & aString.equals("lala"))
Kedua parameter diperiksa sebelum evaluasi selesai dan NullPointerException akan ditampilkan untuk parameter kedua.
if (aString != null && aString.equals("lala"))
Parameter pertama dicentang dan dikembalikan
false
, jadi parameter kedua tidak akan diperiksa, karenafalse
tetap saja hasilnya .Hal yang sama untuk ATAU:
if (aString == null | !aString.equals("lala"))
Akan meningkatkan NullPointerException juga.
if (aString == null || !aString.equals("lala"))
Parameter pertama dicentang dan dikembalikan
true
, jadi parameter kedua tidak akan diperiksa, karenatrue
tetap saja hasilnya .XOR tidak dapat dioptimalkan, karena bergantung pada kedua parameter tersebut.
sumber
^
(xor).Tidak, itu tidak akan diperiksa. Perilaku ini disebut evaluasi sirkuit pendek dan merupakan fitur dalam banyak bahasa termasuk Java.
sumber
Semua jawaban di sini bagus, tetapi hanya untuk menggambarkan dari mana asalnya, untuk pertanyaan seperti ini, sebaiknya lihat sumbernya: Spesifikasi Bahasa Java.
Bagian 15:23, Operator Bersyarat-Dan (&&) , mengatakan:
Dan serupa, Bagian 15:24, Operator Bersyarat-Atau (||) , mengatakan:
Sedikit berulang, mungkin, tapi konfirmasi terbaik tentang cara kerjanya. Demikian pula operator kondisional (? :) hanya mengevaluasi 'setengah' yang sesuai (setengah kiri jika nilainya benar, setengah kanan jika salah), memungkinkan penggunaan ekspresi seperti:
int x = (y == null) ? 0 : y.getFoo();
tanpa NullPointerException.
sumber
Tidak, jika a benar (dalam
or
pengujian), b tidak akan diuji, karena hasil pengujian akan selalu benar, berapapun nilai ekspresi b.Lakukan tes sederhana:
if (true || ((String) null).equals("foobar")) { ... }
tidak akan melempar
NullPointerException
!sumber
Hubung singkat di sini berarti kondisi kedua tidak akan dievaluasi.
Jika (A && B) akan mengakibatkan korsleting jika A Salah.
Jika (A && B) tidak akan menghasilkan Sirkuit pendek jika A Benar.
Jika (A || B) akan menghasilkan korsleting jika A Benar.
Jika (A || B) tidak akan mengakibatkan korsleting jika A Salah.
sumber
Tidak, Java akan mengalami korsleting dan berhenti mengevaluasi setelah mengetahui hasilnya.
sumber
Ya, evaluasi hubung singkat untuk ekspresi boolean adalah perilaku default di semua keluarga mirip-C.
Fakta menarik adalah bahwa Java juga menggunakan operand logika
&
dan|
sebagai (kelebihan beban, denganint
tipe operasi bitwise yang diharapkan) untuk mengevaluasi semua istilah dalam ekspresi, yang juga berguna saat Anda membutuhkan efek samping.sumber
Ini kembali ke perbedaan mendasar antara & dan &&, | dan ||
BTW Anda melakukan tugas yang sama berkali-kali. Tidak yakin apakah efisiensi menjadi masalah. Anda dapat menghapus beberapa duplikasi.
Z z2 = partialHits.get(req_nr).get(z); // assuming a value cannout be null. Z z3 = tmpmap.get(z); // assuming z3 cannot be null. if(z2 == null || z2 < z3){ partialHits.get(z).put(z, z3); }
sumber