我认为这将是一种结构化选择器方法的简洁方法,但输出不是前两个if语句而只输出最后一个
public int myPickerMethod(){
System.out.println("please select from the options ");
System.out.println("please select 1 for option 1 ");
System.out.println("please select 2 please select 2 for option 2");
String input = keyboard.readLine();
System.out.println("input = " + input);
if(input=="1"){
return 1;
}
else if(input=="2"){
return 2;
}
else{
return 42;
}
}
以下是终端的结果:
please select from the options
please select 1 for option 1
please select 2 please select 2 for option 2
1
input = 1
response = 42
如果我输入2,则相同。“response”print语句是主类中print语句的方法输出。
我以前没试过这种方式,但我认为它应该有效。我真的不明白为什么不是。有人能清除这个吗?感谢
答案 0 :(得分:9)
在Java中,您需要使用equals方法比较字符串:
if ( input.equals("1") ) {
// do something...
}
从Java 7开始,您也可以在switch语句中使用字符串:
switch ( input ) {
case "1":
// do something...
break;
case "2":
// do something...
break;
}
编辑:补充我的答案,这是一个使用带字符串的开关和类的反汇编代码(使用javap -c)的类及其工作原理的示例(标签8和11) )。
<强> Foo.java 强>
public class Foo {
public static void main( String[] args ) {
String str = "foo";
switch ( str ) {
case "foo":
System.out.println( "Foo!!!" );
break;
case "bar":
System.out.println( "Bar!!!" );
break;
default:
System.out.println( "Neither Foo nor Bar :(" );
break;
}
}
}
反汇编的Foo.class代码:
Compiled from "Foo.java"
public class Foo {
public Foo();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String foo
2: astore_1
3: aload_1
4: astore_2
5: iconst_m1
6: istore_3
7: aload_2
8: invokevirtual #3 // Method java/lang/String.hashCode:()I << hashCode here! (I wrote this!)
11: lookupswitch { // 2
97299: 50 // 97299: hashCode of "bar" (I wrote this!)
101574: 36 // 101574: hashCode of "foo" (I wrote this!) (yep, they where swaped. the lesser hashCode first)
default: 61
}
36: aload_2
37: ldc #2 // String foo
39: invokevirtual #4 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
42: ifeq 61
45: iconst_0
46: istore_3
47: goto 61
50: aload_2
51: ldc #5 // String bar
53: invokevirtual #4 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
56: ifeq 61
59: iconst_1
60: istore_3
61: iload_3
62: lookupswitch { // 2
0: 88
1: 99
default: 110
}
88: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;
91: ldc #7 // String Foo!!!
93: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
96: goto 118
99: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;
102: ldc #9 // String Bar!!!
104: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
107: goto 118
110: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;
113: ldc #10 // String Neither Foo nor Bar :(
115: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
118: return
}
有一件有趣的事情是,用整数创建了另一个开关(标签62),它是“真正的工作”。
答案 1 :(得分:5)
1。使用.equals
来比较java中的Objects
,String
是 Java中的对象。
<强>例如强>
if(input.equals("1"))
2。这是可选,但如果您尝试使用Scanner类,它也会很好。
<强>例如强>
Scanner scan = new Scanner(System.in);
String input = scan.nextLine();
3。如果使用{{1}使用切换,建议使用switch
语句代替 if-else
梯形图然后你必须 String
,如果你使用的jdk版本低于 jdk 1.7 or above
,那么你可以将字符串转换为字符然后在切换中使用它。
答案 2 :(得分:5)
要测试Object(非基本类型)相等性,请使用Object.equals()
。
if(input.equals("1")) {
return 1;
}
==
运算符检查对象的引用是否相等。参考相等性测试在String.equals() method
内完成,以及其他检查。以下是String.equals()
方法的Java源代码:
public boolean equals(Object anObject) {
if (this == anObject) { // Reference equality
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) { // Are the strings the same size?
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++]) // Compare each character
return false;
}
return true;
}
}
return false;
}
答案 3 :(得分:3)
请勿按==
比较字符串(或任何对象)的值。使用equals
之类的if(input.equals("1"))
方法。
==
用于检查引用是否包含相同的对象,例如
Integer i1=new Integer(1);
Integer i2=new Integer(1);
Integer i3=i1;
//checking references
System.out.println(i1==i2);//false
System.out.println(i1==i3);//true
//checking values
System.out.println(i1.equals(i2));//true
System.out.println(i1.equals(i3));//true
答案 4 :(得分:3)
对象比较应为.equals
而不是==
,而String
是对象。
input ==“1”应为input.equals(“1”)
编辑即使使用==
,以下内容始终有效,因为它们是文字,而java则分配相同的内存位置。
String s ="Hi";
String s1= "Hi";
if(s==s1)
{
System.out.println("Yes they are same");
}
但是,当我们读取两个单独的字符串(new String())
时,除非您覆盖equals
和hashcode
,否则可能无法满足相等条件。请阅读以上链接了解更多详情。
答案 5 :(得分:1)
使用equals
方法......
public int myPickerMethod(){
System.out.println("please select from the options ");
System.out.println("please select 1 for option 1 ");
System.out.println("please select 2 please select 2 for option 2");
String input = keyboard.readLine();
System.out.println("input = " + input);
if(input.equals("1")){
return 1;
}
else if(input.equals("2")){
return 2;
}
else{
return 42;
}
}