これハマってしまった。。
結論
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だと気にしなくてよかった気がする)
下記記事、非常に助かりました!
追記 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()); } }