创建一个ArrayList并填充其插槽:
ArrayList<String> tempTable = new ArrayList<String>();
tempTable.add("1");
tempTable.add("12");
tempTable.add("2");
tempTable.add("11");
tempTable.add("5");
现在,我想替换一些值,因此创建条件:
for (int i = 0; i < tempTable.size(); i++)
{
if (tempTable.get(i) == "11")
{
tempTable.set(i, "1st FBS");
}
else if (tempTable.get(i) == "12")
{
tempTable.set(i, "2nd FBS");
}
else if (tempTable.get(i) == "13")
{
tempTable.set(i, "3rd FBS");
}
else
{
// leave as is
}
}
当我运行它时,我得到原始值不变,因此它打印1,12,2,11,5而不是替换11和12。使用ArrayList进行测试并且它可以工作,但在这种情况下,我无法按照我的意愿使用它。
任何暗示我的代码可能出错的地方?
答案 0 :(得分:4)
使用字符串equals()而不是==进行字符串比较。当equals比较内容时,= =检查引用是否指向相同的内存位置。
以下是您的代码的外观:
for (int i = 0; i < tempTable.size(); i++)
{
if ("11".equals(tempTable.get(i)))
{
tempTable.set(i, "1st FBS");
}
else if ("12".equals(tempTable.get(i)))
{
tempTable.set(i, "2nd FBS");
}
else if ("13".equals(tempTable.get(i)))
{
tempTable.set(i, "3rd FBS");
}
else
{
// leave as is
}
}
答案 1 :(得分:4)
在java中,您必须使用equals()
来测试字符串相等性:
if ("11".equals(tempTable.get(i)))
{
tempTable.set(i, "1st FBS");
}
对象上的==是一个测试引用相等性的运算符 - 即两个引用(“变量”)指向内存中的同一个实例。
==也可能对字符串有效,因为文字字符串是由jvm缓存和预加载的,但是任何动态创建的字符串都是不同的对象,即使文本内容相同也是如此。例如,如果从命令行读取一个字符串,即使您键入两次相同的字符,String
实例也会有所不同。
正如有人在对另一个答案的评论中指出的那样,通常使用文字进行字符串比较的方法如下:
"literal".equals(ref)
那是因为在文字字符串上调用方法永远不会抛出NullPointerException而只返回false
如果ref为null