1

私はJAVAが初めてで、等値演算子を使用していました。オペランドのいくつかの組み合わせを試した後、Java の等価演算子 (==) の互換オペランドの正確な定義について少し混乱しています。

int x = 23;
if (x == 23.3f) {   // compiler accepts it. (may be because both are primitives)

int x = 23;     
Double d = new Double(23.3); 
if (x == d) {    // compiler accepts it. (may be compatible pair of primitive and object reference)

int x = 23;
String s = "hello";
if (x == s)   // compiler throws error  - incompatible operands for == operator.

したがって、等値演算子の互換オペランドの正式な定義が必要です。この疑問を明確にするのを手伝ってください。

4

4 に答える 4

1

為に

int x = 23;
if (x == 23.3f) 

を使用してバイトコードを見るとjavap -vintは に変換されますfloat。つまり、i2fが呼び出され、 を使用して 2 つの float 値として比較されますfcmpl

public static void main(java.lang.String[]);
  Code:
   Stack=2, Locals=2, Args_size=1
   0:   bipush  23
   2:   istore_1
   3:   iload_1
   4:   i2f       // The line of interest. Converts int to float.
   5:   ldc     #16; //float 23.3f
   7:   fcmpl     // compare two floats
   8:   ifne    11
   11:  return

3 番目のケースでは、プリミティブをオブジェクト (文字列) と比較していますが、これは不可能です。

于 2014-09-03T08:31:55.743 に答える
0

文字列はオブジェクトです。は==、内部値ではなく、参照によってオブジェクトを比較します。他のすべてはオブジェクト参照によって(int, double)比較さ==れるため、文字列の場合は一致しないため、文字列の.equals場合は演算子も必要です。Javaは大文字と小文字を区別するため、文字列の比較中に注意する必要がありますCase's of strings

于 2014-09-03T08:35:34.300 に答える
0
  1. x23.3fはプリミティブな数値型を持っているため、コンパイラはそれを受け入れます。そして比較は を返しfalseます。

  2. Javaは比較時にオブジェクトをプリミティブにボックス化解除 するため、コンパイラはそれを受け入れます。Doubledouble

  3. xはプリミティブな数値型であり、クラス インスタンスsへの参照であるため、コンパイラはそれを受け入れることができません。String数値プリミティブとオブジェクトへの参照を比較することはできません。

于 2014-09-03T08:32:14.753 に答える