-1

私はこのコードを持っていますが、なぜ bo3= st1 == st2 が true になるのですか?

それらはメモリ内の異なる位置にあるのではなく、== によって位置が同じかどうかを比較します!

また、何かありましたらご指摘ください。君たちありがとう。

public static void main(String[] args) {

    String st1 = "HELLO";
    String st2 = "HELLO";
    String st3 = "hello";


    int comp1 = st1.compareTo(st2);  // equal 0
    int comp2 = st1.compareTo(st3);  // -32

    boolean bo1 = st1.equals(st2); //true
    boolean bo2 = st1.equals(st3); // false , if ignoreCase will be true

    boolean bo3 = st1==st2; //true    ??????????? should not be true
    boolean bo4 = st1 == st3; //false


    int ind1 = st1.indexOf("L"); // 2
    int ind2 = st1.lastIndexOf("L"); // 3

    boolean con = st1.contains("LLO"); //true


    System.out.println(bo3);
}

「Mary」と入力すると別のコードが表示されますが、結果は同じ名前で等しくありません

public static void main(String [] args) {

    Scanner keyboard = new Scanner(System.in);
    System.out.print("What is your name? ");
    String name = keyboard.next();

    if (name.equals("Mary"))
        System.out.print("Same name");
    else
        System.out.print("Different name");

    if (name == "Mary")
        System.out.println("equal");
    else
        System.out.println("not equal");
}
4

2 に答える 2

0

でのこの動作==は、 を使用して文字列を作成したという点で、多少の偶然です"test"。文字列を使用した動作の多くは、==実装固有です。equals()文字列値を比較するためにのみ機能することが保証されています。

文字列を比較するときは、文字列がインターンされることが保証されていないため、可能な場合は常に使用してください。このようなリテラルを使用すると、コンパイラは文字列を文字列プールに入れ、コード内の同じリテラル文字列のすべてが同じ String オブジェクトを指すようにします。equals()

連結またはコンストラクターを使用して文字列を作成する場合、必ずしも同じであるとは限りません。

String test="test";
String test2=new String("test");
String t="te";
String s="st"
String test3=t+s;

test==test2またはの保証はありませんtest2==test3が、equals()それでも true になります。

于 2013-11-09T11:55:49.307 に答える
0

st1==st2 は、どちらも同じ String オブジェクトを参照するため、真です。

この投稿が役に立ちます: http://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html

于 2013-11-09T11:55:50.403 に答える