Подтвердить что ты не робот

Сравнение Java с == двух строк является ложным?

Строковые части - это строка [6]:

["231", "CA-California", "Sacramento-155328", "aleee", "Customer Service Clerk", "Alegra Keith.doc.txt"]

Но когда я сравниваю parts[0] с "231":

"231" == parts[0]

приведенный результат неверен,

Я в замешательстве, так может кто-нибудь сказать мне, почему?

4b9b3361

Ответ 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().