2012-01-23 15 views
29

なぜ以下のコードはを返しますlong3 == long2の比較ではリテラルでも、を返します。java長いデータ型の比較

public class Strings { 

    public static void main(String[] args) { 
     Long long1 = 256L + 256L; 
     Long long2 = 512L; 
     Long long3 = 512L; 
     System.out.println(long3 == long2); 
     System.out.println(long1.equals(long2)); 
    } 
} 

答えて

58

Longオブジェクトではなく、原始的です。 ==を使用することによって、あなたは基準値を比較しています。あなたは2回目の比較でそうであるように

if(str.equals(str2)) 

あなたが行う必要があります。

編集:私はそれを得る...あなたは他のオブジェクトがStringリテラルのように動作すると考えています。彼らは*ではありません。そしてその後も、あなたはどちらか==Stringリテラルを使用することはありません。

(* AutoBoxのタイプだけの値-128のため、Flyweightパターンを実装するのです - あなたは50へのごLongを等しくした場合、あなたが実際に同じフライ級オブジェクトへの2つの参照を持っているでしょうそして再び、を使用することはありません> 127。 ==それらを比較するために)

編集追加する:。これは、特にJava言語仕様に記載され、Section 5.1.7を:

ボックス化された値pがfalse、trueの場合、バイト、または範囲の\ u007fに\ U0000、または-128と127の間の整​​数または短い数(包括的)、次いで、R1及びR2は、Pのいずれか2つのボクシング変換の結果であるとします。常にr1 == r2の場合です。

(1.6および1.7)、決して使用==

Long l = 5L; 
Long l2 = 5L; 
System.out.println(l == l2); 
l = 5000L; 
l2 = 5000L; 
System.out.println(l == l2); 

出力にさらに別の理由であるlongは特に言及ないですが、現在のOracleとOpenJDKの実装がそうすることに注意してください。


+0

こんにちはブライアン中の内部実装です!答えをありがとう、しかし、あなたはこの範囲(-128 - > 127)についてのこの説明をどこで見つけることができますか教えてください。 –

+1

@RenatoLochetti [Java言語仕様(JLS)セクション5.1.7 - 最後の段落](http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls)で説明されています。 -5.1.7)。 [Flyweight pattern](http://en.wikipedia.org/wiki/Flyweight_pattern)の実装です。 –

+1

@RenatoLochetti編集された質問を件名に展開しました。 –

3

また、使用したLongオブジェクトのうちのプリミティブな値を得ることができる:あなたがしたい場合は

str.longValue() 
3

 str3==str2 

は次のように行う。..

 str3.longValue()==str2.longValue() 
をあなたは2つの基本TYを比較しているので、これははるかに高速あなたの目的を果たすと

pe値はオブジェクトではありません。下の行は、基準ではない内容を比較しますので

0

ここでロングはラッパークラスです。

long3 == long2

その常に良いと比較するために** .longValue()**

long3.longValue() == long2.longValue()

我々は、構築も同じことをするでしょう等しい()メソッドを使用している場合は、以下の

のようなヌルチェック付きのもの。

long3.equals(long2)

は以下のequals() javaの

public boolean equals(Object obj) { 
    if (obj instanceof Long) { 
     return value == ((Long)obj).longValue(); 
    } 
    return false; 
}