Сравнение Java с == двух строк является ложным?
Строковые части - это строка [6]:
["231", "CA-California", "Sacramento-155328", "aleee", "Customer Service Clerk", "Alegra Keith.doc.txt"]
Но когда я сравниваю parts[0]
с "231"
:
"231" == parts[0]
приведенный результат неверен,
Я в замешательстве, так может кто-нибудь сказать мне, почему?
Ответы
Ответ 1
Оператор ==
сравнивает ссылки на объекты, а не значение String
s.
Чтобы сравнить значения String
s, используйте метод String.equals
:
"231".equals(parts[0]);
Это справедливо для любого другого объекта в Java - при сравнении значений всегда используйте метод equals
вместо использования оператора ==
.
Метод equals
является частью Object
и должен быть переопределен классами, которые будут сравниваться так или иначе.
Ответ 2
Если строки не интернированы, то == проверяет ссылочный идентификатор. Использование:
"231".equals(parts[0]);
вместо.
Ответ 3
==
в Java сравнивает адрес объектов (строки в этом случае).
Вы хотите parts[0].equals("231")
Ответ 4
Следующее выводит "true",
String s = "231";
if(s == "231")
{
System.out.println("true");
}
else
{
System.out.println("false");
}
Это связано с тем, что строки не изменяются, и java будет пытаться сохранить как можно больше места, поэтому он указывает на одну и ту же ссылку на память.
Однако следующее выдает "false":
String s = new String("231");
if(s == "231")
{
System.out.println("true");
}
else
{
System.out.println("false");
}
new
заставит его сохранить строку в новой ячейке памяти.
Кстати, вы должны ВСЕГДА использовать .equals()
для сравнения строк (для случаев, подобных этому)
Ответ 5
Использовать метод equals: parts [0].equals( "231" ). == оператор сравнивает ссылки на объекты.
Ответ 6
"==" сравнивает ссылки на объекты, в вашем случае "231" - это другой объект, чем части [0].
Вы хотите использовать String.equals.
parts[0].equals("231")
Ответ 7
Ответ очень прост: при сравнении строк с помощью оператора == вы фактически сравниваете, если две разные переменные относятся к одному объекту String. И они этого не делают, строка в массиве и вновь созданная "231" - это разные объекты String с тем же содержимым.
Правильная вещь - использовать следующее выражение: "231".equals(parts[0])
или "231".equalsIgnoreCase(parts[0])
. Это даст вам то, что вам нужно, и вернет true, если эти объекты String содержат одинаковые значения.
Ответ 8
Я подумал, что было бы полезно выразить ответ в тестовом примере:
public class String231Test extends TestCase {
private String a;
private String b;
protected void setUp() throws Exception {
a = "231";
StringBuffer sb = new StringBuffer();
sb.append("231");
b = sb.toString();
}
public void testEquals() throws Exception {
assertTrue(a.equals(b));
}
public void testIdentity() throws Exception {
assertFalse(a == b);
}
}
Ответ 9
Вы также можете использовать метод compareTo (String):
String str = "test";
if( str.compareTo("test") == 0)
//the argument string is equal to str;
else
//the argument string is not equal to str;
Ответ 10
Используйте метод equals для сравнения объектов:
String[] test = {"231", "CA-California", "Sacramento-155328", "aleee",
"Customer Service Clerk", "Alegra Keith.doc.txt"};
System.out.println("231".equals(test[0]));
Сравнение '==' сравнивает ссылки, а не значения.
Ответ 11
Вот действительно хороший пример. Оператор '==' со строкой может быть действительно сложным в Java.
class Foo {
public static void main(String[] args) {
String a = "hello";
String b = "hello";
String c = "h";
c = c + "ello";
String operator = null;
if(a == b) {
operator = " == ";
} else {
operator = " != ";
}
System.out.println(a + operator + b);
if(a == c) {
operator = " == ";
} else {
operator = " != ";
}
System.out.println(a + operator + c);
if(a == "hello") {
operator = " == ";
} else {
operator = " != ";
}
System.out.println(a + operator + "hello");
if(c == "hello") {
operator = " == ";
} else {
operator = " != ";
}
System.out.println(c + operator + "hello");
}
}
Что будет производить следующий вывод:
hello == hello
hello != hello
hello == hello
hello != hello
Ответ 12
Как уже многие другие объяснили, вы пытаетесь сравнить с оператором равенства, но тогда он будет полагаться на Object.equals() вместо String.equals().
Итак, вы можете выполнить задание, явно вызвав String.equals(), но вместо записи
parts[0].equals("blahblah")
Я бы предпочел:
"blahblah".equals(parts[0])
Так как он избегает тестирования потенциальной недействительности частей [0] (но будьте осторожны, чтобы сама переменная части могла быть нулевой...)
Другой способ - использовать String.intern():
if (parts[0].intern() == "blahblah") ...
Подробнее см. http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#intern().