将数组中字符串的值传递给java中的方法?

感谢您抽出时间来阅读。 对不起,如果我的问题是愚蠢的,我尝试搜索,但无法弄清楚为什么我有这个问题。 我试图为另一个应用程序测试一些代码,但我遇到了问题。 也许我只是不理解数组。

我在一个名为Transpose的类中有一个名为halfStepUp的方法,出于测试目的,如果给出“c”,则返回“c#”,如果给出“d”,则返回“d#”。 这是代码:

public class Transpose{ public static String halfStepUp(String note){ String n = null; if (note == "c") n = "c#"; if (note == "d") n = "d"#; return n; } } 

我的main方法中有以下代码:

 String [] scale = new String[2]; scale[0] = "c"; scale[1] = "d"; System.out.println(Transpose.halfStepUp(scale[0])); 

这打印“null”。 我究竟做错了什么? 我知道该方法有效,因为如果我使用

 System.out.println(Transpose.halfStepUp("c")); 

它工作正常。 解决方案可能很容易,但在寻求帮助时我无法找到一个好方法。 再次感谢您的阅读,我们非常感谢您的回答!

试试这个:(根据评论编辑)

 public class Transpose{ public static String halfStepUp(String note){ String n = null; if ("c".equals(note)) n = "c#"; //using .equals as a string comparison if ("d".equals(note)) n = "d#"; //not "d"# return n; } } 

要为您已经获得的答案添加更多信息:

Java有两种类型的存储。 一个是堆栈,包括变量名称及其值。 一个是堆,这只是一个庞大的自由浮动对象集合。

现在,如果你正在处理原始类型(如intbooleanchar ),请指定一个变量
int myInt = 1;
将该变量推送到堆栈上 – 名称为myInt ,值为1

但是,如果你有一个对象(比如字符串),那么分配一个变量就会多一点。
String myString = "Hey!";
现在在堆上的某处创建一个对象( String实例)。 它没有名称,只有一些地址可以在内存中找到它。
除此之外,它还会在堆栈上推送变量。 名称是myString – 值是堆上对象的地址。

那么为什么这与变量比较有关呢? 因为==比较变量的值。 在堆栈上,就是这样。 因此,如果您比较原始类型,一切都按预期工作。 但是如果你要比较对象, ==仍然只比较变量的值 – 在这种情况下,就是对象的地址。 如果地址相同,则返回true。 这意味着,两个变量都指向同一个对象。 如果地址不同, ==返回false。,没有看到堆,对象确实在哪里。

一个例子:

 String a = new String("Hey!"); String b = a; if (a == b) System.out.println("true"); else System.out.println("false"); 

将回显“true” – 因为两个变量都包含相同的对象。

 String a = new String("Hey!"); String b = new String("Hey!"); if (a == b) System.out.println("true"); else System.out.println("false"); 

将回显“假” – 因为你现在在堆上有两个对象,并且指向一个对象,而b指向另一个。 因此,虽然两个对象的内容可能相同,但堆栈上的ab的内容是不同的。

因此,要比较任何对象,如果要比较内容而不是实例相等,请始终使用.equals()

[附录]:使用字符串,这更复杂。 正如你已经发现的那样,

 String a = "Hey!"; // mention the difference to the example above: String b = "Hey!"; // I did NOT use the `String()` cosntructor here! if (a == b) System.out.println("true"); else System.out.println("false"); 

实际上会给你“真实”。 那为什么是这样的? 有人可能会认为我们仍然创造了两个对象。 但实际上,我们不是。

String不可变的 。 这意味着,一旦创建了String,就无法修改它。 永远。 不相信吗? 看一看!

 String myString = "test"; // we create one instance of String here myString += " and more"; // we create another instance of String (" and more") // and append that. Did we modify the instance stored in // myString now? NO! We created a third instance that // contains "test and more". 

因此,不需要创建具有相同内容的String其他实例 – 这会增加性能,因为字符串被广泛使用,因此我们希望尽可能少地使用它们。 为了存档它,JVM维护我们已经创建的字符串对象列表。 每次我们写下一个字符串文字(类似于"Hey!" )时,它会查看该列表并检查我们是否已经创建了具有该值的实例。 如果是这样,它将返回指向该完全相同实例的指针,而不是创建新实例。

这就是,为什么"Hey!" == "Hey!" "Hey!" == "Hey!" 将返回true。

比较字符串时应使用.equals()方法,而不是====运算符比较引用以查看它们是否指向同一个底层对象。 .equals()方法将底层对象相互比较,以查看它们是否在语义上等效。

小故障在这一行:

  if (note == "c") n = "c#"; 

这会按地址比较字符串,而不是按值。 请尝试使用"c".equals(note)

 class Transpose{ public static String halfStepUp(String note){ String n = null; if (note == "c") n = "c#"; if (note == "d") n = "d#"; return n; } } public class TransposeTest { public static void main(String... args) { String [] scale = new String[2]; scale[0] = "c"; scale[1] = "d"; System.out.println(Transpose.halfStepUp(scale[0])); } } 

工作代码