7

それで私は「JavaforDummies」第4版を購入しました、そしてそれはおそらく私がこれまでに本に費やした中で最高の30ドルであると言わなければなりません。私はコーディングに不慣れではありません。私がそう言うなら、実際にはかなりまともです。

しかし、私は少し混乱しているコードの行に出くわしました:

public void setName(String n)
{
     if(!n.equals(""))
     {
          name = n;
     }
}

私の質問は3行目のif(!n.equals( ""))の部分に出てきます...ループがどのように機能するかは知っています(つまり、if(this == that){do stuff})が、私は以前に設定された!n.equals( "")を見たことがありません。誰か説明してもらえますか?

PS:推測を投げかけるだけです。それは次と同じですか:

public void setName(String n)
{
     if(n != "")
     {
          name = n
     }
}

ユーザーが名前を入力しない場合(つまり、myAccount.setName = "";)、エラーが発生せず、通常どおりに実行されることを確認するための方法だと思いますが、確信が持てませんでした。 。

助けてくれてありがとう!

編集:私の "myAccount.name="";"を変更しました "myAccount.setName =" ";"に、混乱してすみません。

ありがとう:アサフに行きます、答えに感謝します!Lucas Aardvarkと同じように、彼も答えましたが、Asaphは、みんなのおかげで、最初に彼自身の答えで私の検証コメントに答えました!

4

5 に答える 5

9

Javaでは、文字列は不変ですが、インターンされていないため、if( "" == n)は、 ""。equals(n)がtrueである別の文字列に対してtrueである場合とそうでない場合があります。

さらに混乱させるために、これは悪いコードです。引数としてnullを指定して呼び出すと、NullPointerExceptionが発生します。"" .equals(n)と書く必要があります

于 2009-10-01T03:27:02.207 に答える
5
if(!n.equals(""))
{
     name = n;
}

nが空の文字列でない場合は、その値をnameに割り当てます。

Javaでは、すべてのオブジェクトに、別のオブジェクトとの同等性をテストするためのequals(Object o)メソッドがあります。==演算子は通常、プリミティブを比較するために使用されます。また、オブジェクトの「同一性」を比較するためにも使用できます。すなわち。2つのオブジェクトは実際には同じインスタンスです。これは、Stringsなどの不変型や、IntegerやLongなどのプリミティブ型のすべてのObjectラッパーに役立ちます。

于 2009-10-01T03:24:15.440 に答える
3

equals()メソッドは、2つの文字列の内容を比較します。==および!=演算子は、2つのStringオブジェクトが同じオブジェクトであるかどうかを示します。同じ内容の2つの異なる文字列、つまり互いにequals()は、依然として互いに!=である可能性があります。文字列は変更可能ではありませんが、文字列が変更可能であると想像することで違いを理解するのに役立ちます。equals()は「現在同じ」を意味し、==は「常に同じ」を意味します。

安全なルールは、両方の文字列がインターンされていることが確実でない限り、常にequals()を使用することです。引用:

したがって、任意の2つの文字列sおよびtについて、s.equals(t)が真である場合に限り、s.intern()== t.intern()が真になります。

すべてのリテラル文字列と文字列値の定数式がインターンされます。

于 2009-10-01T05:22:38.490 に答える
1

このことを考慮:

String a="";
String b="";

aとbはどちらも文字列オブジェクトであり、それぞれに独自のメモリ割り当てがあり、したがって一意のアドレスがあります。aとbは異なるアドレスにあります。ブール式をコーディングするとき

a == b

オブジェクトの内容ではなく、オブジェクトのアドレスを比較しています。内容を比較するには、Stringオブジェクトのequals()メソッドを使用する必要があります。

オブジェクトには、メモリ内の物理的な場所があります。これは、オブジェクトごとに一意であり、2つの異なるオブジェクトが同じメモリアドレスを持つことはできません。また、その内容または値もあります。==演算子は、オブジェクトのアドレスを比較します。a == bをコーディングすると、aとbが同じオブジェクトのエイリアス名であるかどうかを尋ねられます。aとbは同じ物理的な場所を参照します。a.equals(b)は、2つのオブジェクトがどこにあっても、同じ値を持っているかどうかを尋ねます。

これは、コンパイラの「インターン」によって多少複雑になります。コンパイラは、コンパイル時に2つの定数が同じ値を持ち、同じオブジェクトを再利用することを検出する場合がありますが、実行時に作成される値には当てはまりません。

于 2009-10-01T03:26:15.313 に答える
0

このメソッドは、渡されるオブジェクトが呼び出しを行うオブジェクトと「等しい」ことを示す値をequals()返します。booleanこの'equalsto'メソッドは、クラスでオーバーライドして独自のテストを行うことができます。の場合String、テストは、元の文字列の値が、渡されるオブジェクトの文字列表現の値と同じであるかどうかです。

ブール値を返す!ので、値を。で否定できます。したがって、テストは「メソッド引数は空の文字列ではありませんか?」です。はい?name次に、それを変数 に割り当てます。

==参照を比較するときに、左側のオブジェクトが右側のオブジェクトと同じであるかどうかを常にテストします。

于 2009-10-01T03:27:15.047 に答える