Сравнение Java с == двух строк является ложью? [дубликат]

Если вы используете контурную клавиатуру, как, например, клавиатуру Kinesis Advantage , легче печатать вслепую, так как намного легче чувствовать, где находятся ваши руки на клавиатуре, если она не не плоский Через пару дней я набрал текст значительно быстрее, чем на обычной клавиатуре. И есть также версия, переключаемая на макет Dvorak, хотя я никогда не пытался это попробовать.

О слепой печати: по моему опыту, знание того, где находятся ваши руки, является важной и трудной вещью для слепой печати - и после многих лет использования клавиатуры вы очень хорошо знаете, где находятся общие клавиши. Так что, просто концентрируясь время от времени, чтобы ваши руки находились в правильном положении для слепого набора текста, и чтобы набирать клавиши правым пальцем, вы попадете в слепой набор букв через пару месяцев без каких-либо дополнительных упражнений.

Image of Kinesis Advantage Keyboard
(источник: kinesis-ergo.com )

44
задан poolie 25 November 2013 в 00:23
поделиться

12 ответов

Оператор == сравнивает ссылки на объекты, а не значение String s.

Для сравнения значений of String s, используйте метод String.equals :

"231".equals(parts[0]);

Это верно для любого другого объекта в Java - при сравнении значений всегда используйте равно ] вместо использования оператора == .

Метод equals является частью Object и должен быть переопределен классами, которые будут сравниваться в так или иначе.

77
ответ дан 26 November 2019 в 21:41
поделиться

Если строки не интернированы, то == проверяет идентичность ссылки. Вместо этого используйте:

 "231".equals(parts[0]);

.

15
ответ дан 26 November 2019 в 21:41
поделиться

Используйте метод equals: parts [0] .equals ("231"). Оператор == сравнивает ссылки на объекты.

7
ответ дан 26 November 2019 в 21:41
поделиться

Следующее выводит «истина»;

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 () для сравнения строк (для случаев, подобных этому)

10
ответ дан 26 November 2019 в 21:41
поделиться

== в Java сравнивает адреса объектов (в данном случае строки).

Вы хотите parts [0] .equals ("231" )

13
ответ дан 26 November 2019 в 21:41
поделиться

Я подумал, что было бы полезно выразить ответ в тестовом примере:

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);
    }
}
2
ответ дан 26 November 2019 в 21:41
поделиться

«==» сравнивает ссылки на объекты, в вашем случае «231» - это другой объект, чем parts [0].

Вы хотите использовать String.equals .

parts[0].equals("231")
5
ответ дан 26 November 2019 в 21:41
поделиться

Ответ очень просто: когда вы сравниваете строки с помощью оператора ==, вы фактически сравниваете, ссылаются ли две разные переменные на один объект String. И это не так, строка в массиве и вновь созданный "231" - это разные объекты String с одинаковым содержимым.

Правильнее будет использовать следующее выражение: «231» .equals (parts [0]) или «231» .equalsIgnoreCase (parts [0]) . Это даст вам то, что вам нужно, и вернет true, если эти объекты String содержат одинаковые значения.

4
ответ дан 26 November 2019 в 21:41
поделиться

Используйте метод equals для сравнения объектов:

String[] test = {"231", "CA-California", "Sacramento-155328", "aleee",
                 "Customer Service Clerk", "Alegra Keith.doc.txt"};

System.out.println("231".equals(test[0]));

Сравнение '==' сравнивает ссылки, а не значения.

1
ответ дан 26 November 2019 в 21:41
поделиться

Как уже объясняли многие другие, вы пытаетесь сравнить с оператором равенства, но тогда он будет полагаться на Object.equals () вместо String.equals ().

Итак, вы может выполнить эту работу, явно вызвав String.equals (), но вместо записи

parts[0].equals("blahblah")

я бы предпочел такой:

"blahblah".equals(parts[0])

Поскольку это позволяет избежать проверки потенциальной нулевой значимости частей [0] (но будьте осторожны, чтобы сама переменная частей могла иметь значение null ...)

Другой способ - использовать String.intern ():

if (parts[0].intern() == "blahblah") ...

См. http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String. html # intern () , чтобы узнать об этом подробнее.

0
ответ дан 26 November 2019 в 21:41
поделиться

Вы также можете использовать метод 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;
2
ответ дан 26 November 2019 в 21:41
поделиться

Вот действительно хороший пример. Оператор «==» со строкой может быть действительно сложно в 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
1
ответ дан 26 November 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: