' P '

whatever I will forget

Java == と equalsの違い +equalsIgnoreCase()

これハマってしまった。。

結論

String型はequalsを使おう

  • 値型はスタック領域を比較するから==でOK
  • 参照型はヒープ領域を比較しないといけないからequals()を使うべき(arrayもこっちに入るよ)

問題

やってしまってたのは下記のようなコード
inputは"1 + 2"みたいなのがくると想定

import java.util.Scanner;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        String[] array = input.split(" ");
        int num1 = Integer.parseInt(array[0]);
        System.out.println(num1);

        int num2 = Integer.parseInt(array[2]);
        System.out.println(num2);
        System.out.println(array[1]);
        System.out.println(Arrays.toString(array));

        if(array[1] == "+")) {    //間違い
//正解        if(array[1].equals("+")) {
            System.out.println(num1+num2);
        } else if(array[1] == "-")) {    //間違い
//正解        } else if(array[1].equals("-")) {
            System.out.println(num1-num2);
        }
    }
}

Arrays.toString()してもちゃんとsplitはできているような。。
なんでif/else ifに入らんねん!と思ったらString型は値型ではなく参照型、とゆーか基本String型はちょっと特殊なの忘れてた。
(たぶんCから派生しているからですよね?pyhtonだと気にしなくてよかった気がする)

下記記事、非常に助かりました!

freelance-jak.com

freelance-jak.com

追記 6/10

固定文字列を比較したい場合で、equal()だけでうまく動かない場合がある。
大文字小文字が乱立している場合とか。
そんな場合は、equalsIgnoreCase()を使いましょう。

逆に==が使えちゃう場合

char型(1文字)の比較であれば、==でも大丈夫

import java.util.Scanner;
public class Main8 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String data = scanner.nextLine();
        int posA = 0;
        int posZ = 0;
        boolean foundPosA = false;
        for(int i=0; i<data.length(); i++) {
            if(data.charAt(i) == 'A' && !foundPosA) {
                posA = i;
                foundPosA = true;
            }else if(data.charAt(i) == 'Z'){
                posZ = i;
            }
        }

        String output = data.substring(posA,posZ+1);
        System.out.println(output.length());
    }
}

engineer-club.jp