出力を入力へ

プログラミングに関する基本的な事を中心にまとめます

オブジェクトの比較に'=='演算子は使ってはいけないというあたりまえの話

Javaのようなオブジェクト指向言語を学べば1〜2日で習うであろう事に
オブジェクトの比較に==は使ってはいけないということ。

あろうことか、Javaを5年以上使っていながら
このミスを犯してしまったので、そのミスをまとめておく。

したかった事

  • int配列が昇順でソートされたものが与えられる
  • これを2つのスタックに順次pushしていく
  • ただし、同一のスタックに同じ値は入れてはいけない
  • どちらのスタックにも既に同じ値をpushしているのなら、それ以降の同一の値は破棄する。
  • すべての値をpushし終わったら、2つのスタックトップを比較し、同一の値であれば一方を破棄する。

この実装が以下のコード

もちろんバグがあるのは13行目の

stackRight.peek() == stackLeft.peek()

の部分。
StackはInteger型(=オブジェクト)を格納するので
これをpeek(pop)すると、オブジェクトが戻る。
このため、戻り値を'=='で比較するとオブジェクトの比較なので意図した動作をしない。

対策

intにキャストするだけ。
13行目を

(int)stackRight.peek() == (int)stackLeft.peek()

とすればいい。

もちろん、2つのスタックを利用して、あれこれしているのが
そもそも見通しが悪いといえばそれまでなのだが。

反省点はIntegerなどのラッパークラスを軽視していたこと。
何も考えずにintとIntegerが変換されるので、
Stack操作がオブジェクトを対象としていることを意識していなかった。

Stackに限らず、Javaのライブラリは基本オブジェクトを対象としているので
同様のミスを犯さないように気をつける。