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

标签 java arrays string

感谢您花时间阅读本文。抱歉,如果我的问题很愚蠢,我尝试搜索但无法完全弄清楚为什么我会遇到这个问题。我试图测试另一个应用程序的一些代码,但遇到了问题。也许我只是没有正确理解数组。

我在名为 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;
    }   
}

我的主要方法中有以下代码:

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"));

效果很好。该解决方案可能非常简单,但在寻求帮助时我找不到一个好的表达方式。 再次感谢您的阅读,非常感谢您的回答!

最佳答案

要向您已有的答案添加更多信息:

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

现在,如果您正在使用基本类型(例如 intbooleanchar),请分配一个变量,例如
int myInt = 1;
将该变量压入堆栈 - 名称为 myInt,值为 1

但是,如果您有一个对象(如字符串),则分配变量的作用会多一些。
String myString = "嘿!";
现在在堆上的某个位置创建一个对象(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");

将回显“false” - 因为现在堆上有两个对象,并且a指向一个,而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");

实际上会给你“true”。为什么会这样呢?人们可能会认为我们仍然创建两个对象。但实际上,我们不是。

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 维护了我们已经创建的字符串对象的列表。每次我们写下一个字符串文字(类似于“嘿!”)时,它都会在该列表中查找并检查我们是否已经创建了具有该值的实例。如果是这样,它会返回一个指向完全相同实例的指针,而不是创建一个新实例。

这就是为什么“嘿!” ==“嘿!” 将返回 true。

关于java - 将数组中的字符串值传递给java中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19965895/

相关文章:

java - tomcat的性能极限是多少?

java - Java 中的软件自动更新程序

javascript - 通过数组执行 foreach 如何在 JavaScript 中获取元素索引?

c# - 在代码隐藏中将模型数组绑定(bind)到 View 模型

c - 在 C 中解压缩 .gz 字符串?

java - 在 REST 资源中接收空值

java - java中运算符的定义

c - 动态数组的重新分配?

swift - 如何枚举 String 类型的枚举?

Java编码/解码一个字符串到/从一个长