equalsと==について

このQ&Aのポイント
  • equalsと==の違いを知りたい
  • 文字列の比較におけるequalsと==の使い方を教えてほしい
  • どちらが良いか、equalsと==の違いを教えてほしい
回答を見る
  • ベストアンサー

equalsと==について

今まで、equalsは主に文字列の比較、==はプリミティブ型の比較と言うことで仕事で使っておりました。 しかし、文字列も==が使えることがわかりました。 String a = "aaa"; String b = "aaa"; という変数がある場合、今までは if(a.equals(b))とやっておりました。(と教わりました) が、if(a==b)でも同一の結果が得られることがわかりました。 実際、Stringクラスのソースを見ると、最初に==かどうかをif文を使って判定してます。 具体的にどう違うのか、ご存知の方教えてください。 また、どちらが良いのかも教えてください。 宜しくお願いします。

  • Java
  • 回答数4
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
  • dayowl
  • ベストアンサー率56% (84/148)
回答No.2

a.put("c","1"); b.put("c","1"); これですと、a.get("c")でb.get("c")で得られるものは、結局同じオブジェクトなんではないでしょうか? HashMapをnewしても比較しているものは同じオブジェクトですよね? HashMap a = new HashMap(); HashMap b = new HashMap(); String value1 = new String("1"); String value2 = new String("1"); a.put("c",value1); b.put("c",value2); この場合 a.get("c") == b.get("c") がどういう結果になるかお試しください。

ratsbane
質問者

お礼

またあまたありがとうございます。 そうですよね、HashMapに入っているオブジェクトは同じですよね。 これから、dayowlさんのヤツを試そうと思いますが、 異なるオブジェクトなので、falseが返ると思います。 ありがとうございました。

その他の回答 (3)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.4

この問題はJava学習者を悩ますナンバーワンです(たぶん)。 StringリテラルがJavaの中で特殊な扱いをされているところに、 ややこしさの原因があります。 Stringは参照型なので、メモリ上にオブジェクトがあります。 参照型の比較において、==は「同じオブジェクトであるかどうか」を調べます。 普通の参照型なら、 ClassX a, b; a = new ClassX(); b = new ClassX(); としたとき、a == bはfalseを返します。 「別のところで作ったオブジェクトは別のものである」 というのが、通常の場合です。 ところがStringだけは、 「内容が同じものは、できるだけ同じものにしよう」 となってます。 (メモリを節約するために)JavaコンパイラとJava実行環境が、 同じものを実体としてまとめているのです。 だから String a = "abc"; String b = "abc"; としたときの実際の動作は、 実行環境がひとつのStringオブジェクト"abc"を生成して、 変数aとbはそれを参照しているのです。 しかしこの、同じ文字列をまとめる作用は、、 コンパイル時と実行開始時にしか働きません。 実行中に作られた文字列には適用されません。 たとえば、文字列 String a="Puppet"; String b="Muppet"; をa + bによってくっつけて新しい文字列を作ると、"PuppetMuppet"という文字列になりますが、 System.out.println((a + b) == "PuppetMuppet"); はfalseを表示します。 要するに、 「同じ内容の文字列は、コンパイラやJVMが、可能な限りまとめてくれる。 しかし実行時に生成される文字列はそうならない。」 ということです。 結論として、文字列比較はequals()を使うのが正しいやりかたです。

ratsbane
質問者

お礼

ありがとうございます。 わかりやすい回答で助かりました。 equalsを使うようにします。 というか、equalsを使うようにしてましたが、 「なぜ?」という疑問がありましたので、質問させていただきました。 協力してくださった皆様、本当にありがとうございました。

  • jun-1
  • ベストアンサー率29% (18/61)
回答No.3

==はオブジェクトの参照(メモリアドレスへのポインタ)が同じで あるかどうかの演算子です。 また、#1さんが String a = "aaa"; String b = "aaa"; は同一のオブジェクト、と言われていますが、 確かにWindowsのJDKではその通りだと思いますが、 別プラットフォーム(組込み系など)のVMではそのような動きを しない場合があります。 ですので、文字列が同じであるかどうかの判定は equalsメソドを使うのが正しいと思います。

ratsbane
質問者

お礼

ありがとうございます。 使用してるのはWindowsです。 文字列はequalsを使った方が無難?ということですね?わかりました!

  • dayowl
  • ベストアンサー率56% (84/148)
回答No.1

String a = "aaa"; String b = "aaa"; この記法を用いる場合では、「==」が使えます。 というのは、上記の記法の場合は、aもbも同一のオブジェクトに対する参照になります。 つまり"aaa"というオブジェクトへの参照がaとbにコピーされるわけです。 そして「==」は「同じオブジェクトかどうか」の評価を行いますからtrueが返ります。 しかしそれは、同じオブジェクトかどうかの比較結果であって、文字列の評価結果ではないです。 試しに、 String a = new String("aaa"); String b = new String("aaa"); とやると a==bはtrueになりません。 これは、a,bそれぞれに別なオブジェクトが生成されているためです。 equalsの場合は文字列を比較しますので、 上記どちらの定義の場合でも、trueが返されます。 ということで、文字列の比較にはequalsを用いたほうがよろしいかと思います。

ratsbane
質問者

お礼

ありがとうござます。 Stringをnewすると別のオブジェクトを参照するため、==ではfalseを返すことはわかりました。 続いて更に質問なんですが、 HashMap a; HashMap b;を共にnewして、 a.put("c","1"); b.put("c","1"); としたとき、 if(a.get("c") == b.get("c"))はtrueを 返しました。equalsもtrueでした。 これはa,bは違うオブジェクトなのに、なぜtrueを返すのでしょうか? 違うオブジェクトでもgetしたものは同じところを参照してるということなのでしょうか? 教えてください、お願いします。

関連するQ&A

  • equalsの逆

    javaで、文字列の場合は比較演算子の「==」は用いずに if ((str1.getText()).equals(str2)){ (※…str1,2は文字列) と書きますよね? この逆で、文字列str1とstr2は等しくないとき、にはif以下の条件文をどのように書けばよいでしょうか?

    • ベストアンサー
    • Java
  • (Java) == と equals について

    Javaで、 「もしtestという参照型変数がnullだったら○○する」 というIF文を書きたい場合は、 下記ABどちらの方法が正しいのでしょうか? (判定したい内容によっても異なるかも知れませんが。) ■パターンA Test test = null; if (test.equals(null)) { //TODO } ■パターンB Test test = null; if (test == null) { //TODO } よろしくお願いします。

    • ベストアンサー
    • Java
  • java equalsメソッドについて

    こんにちは。 java初心者ですがandroidを触ることになりました。 不可解なコードで大変恐縮ですが、ご教授願えれば幸いです。 スピナーでセレクトされた文字列と変数(A,B,C,D)の値を比較して条件分岐させたいのですが、 うまくいかず悩んでいます。 下記コード ■■■の部分になります。 1) スピナーに表示される文字列を取得し、変数itemqに代入。 2) 変数A(SONY)と変数itemq(?)を比較し、同じ文字列か比較する。 3) 同一の値であればitemqの値をテキストビューに値をセットする。 というようなものです。 equalsメソッドで比較しているのですが、この部分がどうやら間違っているようなのですが、 原因が全く分かりません。 無知な質問になりますが、どうぞ皆様宜しくお願いいたします。 またコードについての指摘や助言もおねがいします。 public class SampleActivity extends Activity { String path = "/sdcard/PriceSearch/topitems.csv"; static List<String> items = new ArrayList<String>(); static ArrayAdapter<String> adapter; private ListView listview; public String itemq; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Spinner spinner = (Spinner)findViewById(R.id.spinner1); // read csv file readCsvFile(spinner); spinner.setOnItemSelectedListener(new OnItemSelectedListener(){ public void onItemSelected(AdapterView<?> parent, View viw, int arg2, long arg3) { Spinner spinner = (Spinner)parent; String item = (String)spinner.getSelectedItem(); //トースト表示 Toast.makeText(Price_SearchActivity.this, item, Toast.LENGTH_LONG).show(); itemq = item; listread(); } //Spinnerのドロップダウンアイテムが選択されなかった時 public void onNothingSelected(AdapterView<?> parent) { }}); Button button1 = (Button)findViewById(R.id.btnend); button1.setOnClickListener(new View.OnClickListener() { //@Override public void onClick(View v) { //Activity終了 finish(); return; } }); } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ String A = "SONY"; String B = "TOSHIBA"; String C = "MITSUBISHI"; String D = "FUJITSU"; private void listread() { TextView tv = (TextView)findViewById(R.id.textView2); if (A.equals(itemq) ) { tv.setText(itemq); }else if (B.equals(itemq) ) { tv.setText("itemq"); }else if (C.equals(itemq) ){ tv.setText("itemq"); }else if (D.equals(itemq) ){ tv.setText("itemq"); }else { tv.setText("該当なし"); } } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ private void readCsvFile(Spinner spinner) { try { // create reader InputStream input = new FileInputStream(path); InputStreamReader ireader=new InputStreamReader(input, "UTF-8"); CSVReader reader = new CSVReader(ireader,',','"',0); String[] csv; //スピナー用 ArrayAdapterを作成 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner); while ((csv = reader.readNext()) != null) { //ドロップダウンアイテムの追加 adapter.add(csv[0]); } //スピナーにadapterを設定 spinner.setAdapter(adapter); reader.close(); ireader.close(); input.close(); } catch (FileNotFoundException e) { Log.e("ERROR", e.toString()); } catch (UnsupportedEncodingException e) { Log.e("ERROR", e.toString()); } catch (IOException e) { Log.e("ERROR", e.toString()); } } }

    • ベストアンサー
    • Java
  • strcmp関数などでの複数の文字列の比較

    以下の例はランダムなiの値で文字列にアクセスして その文字列がどの文字列であるかを判定しているプログラムです。 char *string[] = {   "aaa",   "bbb",   "ccc", } ; int i = rand() % 3; if ( strcmp( string[ i ], "aaa" ) == 0 ) {   printf("aaaです"); } if ( strcmp( string[ i ], "bbb" ) == 0 ) {   printf("bbbです"); } if ( strcmp( string[ i ], "ccc" ) == 0 ) {   printf("cccです"); } するとこのようにif文の羅列になってしまいます。 (strstr関数を使う場合などでも同じような感じです。) 複数の文字列を判定する場合などにもっと良い手法は無いでしょうか?

  • バイナリ文字列の比較について

    テキストをバイナリで読み込んで文字列を比較する際に 下記のロジックだと2バイトずつ読み込んで比較していくのですが 比較したい文字列が"He"だと合致するのですが1バイトずれの "el"だと合致しません。 ストリーム内の任意の文字列を判定したいときはどのように修正すればよいでしょうか? ----sample.txt--- Hello World!! ---------------- byte[] buf = new byte[2]; FileInputStream in = new FileInputStream("sample.txt"); int b; while ((b = in.read(buf)) != -1) { if ("He".equals(new String(buf))) { System.out.println("HelloのHeはOK"); } if ("el".equals(new String(buf))) { System.out.println("HelloのelはNG"); } }

    • ベストアンサー
    • Java
  • JAVAのequalsメゾットに関して

    public class Sample{ private int num; public Sample(int num){ this.num=num; public boolean equals(Sample obj){ if(obj==null){ return false; } return this.num==obj.num; } } ここでのequalsメゾットは、object同一性を比較するものか、それともobejectの同値性を比較するものでしょうか? また、オブジェクトクラスの中のequalsメゾットをみたら return(this==obj); と書かれていますが、これを見る限り同一性を比較するものだと思いますが、「objectクラスのequalsメゾットは同値性を比較するメゾット」と書かれているサイトも多くて、一体どっちが正しいでしょうか? ご回答いただければ幸いです。よろしくお願いいたします。 ※OKWAVEより補足:「Webシステム開発」についての質問です。

    • ベストアンサー
    • Java
  • javaの比較一致(equals)について

    javaの基礎的なことについて質問させていただきます。 まず byte配列を空にして、 new String(byteStream.toByteArray(), "UTF-8"); でString変数に代入した後に split関数で分割します。 分割した後に equals関数を使って比較をしてみたのですが TRUEにならず compareTo関数を使用してみたところかなり数値がずれていました。 文字コードで取得した場合はズレが生じるのでしょうか? できればご教授おねがいします。

    • ベストアンサー
    • Java
  • perlのif文で・・・・・

    こんにちは。 お聞きしたいのですが、perlのif(A eq B)文で、crypt関数で暗号化した文字列の比較をしているのですが、画面に双方の変数をテスト表示をしてみて、AとBは一致しているにもかかわらず、このif文を飛ばしてしまいます。 暗号化した変数を使うのは初めてなんですが、何か可能性として考えられることはありますか? 自分でも考えられるチェックはしたつもりなんでが・・・

  • Equalsはどこから呼出してるのでしょうか?

    wpfの次のpublic override int GetHashCode()とpublic override bool Equals(object obj)とpublic override string ToString()にブレークポイントを設定し「開始」をすると起動時にEqualsで中断、コンボボックスをクリックするとToStringやGetHashCodeで中断しますが、これらの呼び出し元はどこなのでしょうか? 何卒、ご教授よろしくお願いします。 mainwindow.xaml <Grid> <ComboBox x:Name="comboBox" HorizontalAlignment="Left" Margin="200,138,0,0" VerticalAlignment="Top" Width="120" ItemsSource="{x:Static local:classA.comblist}"/> </Grid> mainwindow.xaml.cs public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } class classA { public static classB[] comblist { get { classB[] List = new classB[3]; classB a1 = new classB(); a1.listb = "AAA"; List[0] = a1; classB a2 = new classB(); a2.listb = "BBB"; List[1] = a2; classB a3 = new classB(); a3.listb = "CCC"; List[2] = a3; return List; } } } class classB { private string _listb; public string listb { get { return _listb; } set { _listb = value; } } public override int GetHashCode() { return 1; } public override bool Equals(object obj) { return false; } public override string ToString() { return listb; } } ※長々と書き込みすいません、コード自体に意味はございません

  • equals()について

    public class Test1 { public static void main(String[] args) { Long A = new Long(7); Long L = new Long(7); if(A.equals(L))System.out.println("Equal"); else System.out.println("Not Equal"); } } のようなプログラムではAとLは別で宣言されるため "別オブジェクト”に成ると思い込んでいました。 しかし結果はequalでした・・・ たとえばABCというクラスがあったとして、 ABC c = new ABC(); ABC d = new ABC(); ABC e = c; とすれば、 c、dはnot equal で c,eはequal に成りますよね。 これはすごくわかるんです。 で、なぜ上のプログラムでAとLがequalになってしまうのかわかりません・・・・ 誰か教えてください・・・

    • ベストアンサー
    • Java

専門家に質問してみよう