1

Java と C# の両方で記述された単純な再帰メソッドがあります。

ジャワ

public static String reverse(String letter) {
    if (letter == "")
        return "";
    else
        return letter.substring(letter.length() - 1)
                + reverse(letter.substring(0, letter.length() - 1));
}

C#

public static string reverse(string letter)
{
    if (letter == "")
        return "";
    else
        return letter[letter.Length - 1]
                + reverse(letter.Substring(0, letter.Length - 1));
}

しかし、Java バージョンは で失敗しletter == ""、文字が空であっても false を返します。Java バージョンが失敗するのに C# バージョンが機能するのはなぜですか?

4

9 に答える 9

6

C# と Java の両方で、演算子はデフォルト==で参照の等価性をチェックします。

ただし、.NET では、代わりに値の等価性をチェックするため==に型の演算子がオーバーロードされます。string

public static bool operator ==(string a, string b)
{
    return string.Equals(a, b);
}

両方の言語を使用する際に考慮する必要があるもう 1 つの要因は、文字列のインターンです。MSDNから(C# の場合):

共通言語ランタイムは、インターン プールと呼ばれるテーブルを維持することにより、文字列ストレージを節約します。このテーブルには、プログラムでプログラムによって宣言または作成された一意の各リテラル文字列への単一の参照が含まれています。したがって、特定の値を持つリテラル文字列のインスタンスは、システム内に 1 回だけ存在します。

たとえば、同じリテラル文字列を複数の変数に割り当てると、ランタイムはインターン プールからリテラル文字列への同じ参照を取得し、それを各変数に割り当てます。

文字列のインターンは Java と C# の両方に適用され、通常は一貫した結果が得られます。たとえば、どちらの言語もコンパイル時に文字列連結を評価します。つまり、次のよう"a" + "b"に格納され"ab"ます。

"ab" == "a" + "b"                                      // Java: Gives true
object.ReferenceEquals("ab", "a" + "b")                // C#:   Gives true

ただし、長さ 0 の部分文字列を取得する場合、C# のみがインターンされた空の文字列を返します。

"" == "abc".substring(0, 0)                            // Java: Gives false
object.ReferenceEquals("", "abc".Substring(0, 0))      // C#:   Gives true
于 2012-06-16T15:53:42.727 に答える
5

オブジェクトの場合、演算子 ==は参照の同等性をテストするためです。常に使用する必要がありますequals

于 2012-06-16T15:42:52.930 に答える
4

文字列はオブジェクトです。

を使用する==と、同一性の比較が行われます。これは、がとが同じオブジェクトであるa == bかどうかを尋ねていることを意味します。ab

変数letterと定数オブジェクト""は同じオブジェクトではないため、false になります。

代わりに、次を使用する必要があります。

letter.equal("")

これは、letterオブジェクトが と等しい値を持っている""かどうかを尋ねています。これは、あなたが尋ねようとしていることです。

于 2012-06-16T15:44:21.527 に答える
3

これを行うにはいくつかの方法があります:

  1. Java で文字列を比較するには、.equals()or.equalsIgnoreCase()メソッドを使用する必要があります。... if (letter.equals("")) { ...
  2. 長さを確認すると、この文字列の長さが 0 かどうかがわかります。... if (letter.length() == 0) { ...
  3. (letter.length() == 0)Javaには相当するものがあります。それが.isEmpty()メソッドです。

ところで:
忘れないでくださいif (letter == null)

于 2012-06-16T15:42:05.037 に答える
2

Java では==、2 つの変数に同じオブジェクトが含まれているかどうかを比較します。""両方のインスタンスに同じ文字列値が含まれている場合でも、定数はおそらく常に String の異なるインスタンスになります。

オブジェクトの内容を比較したい場合は、String の場合、次のように実行できます。

文字.等しい("")

于 2012-06-16T15:50:12.290 に答える
1

Javaでは、

演算子は==変数の値を比較します。

したがって、プリミティブ型の変数の場合、変数の値はプリミティブの実際の値であるため、機能します。

例えば

 int a = 1;
 int b = 2;

 if(a == b) { 

上記では、それはあなたがしていると思うことをしている。


ただし、参照型変数の場合、変数の値は、それらが指しているオブジェクトへの参照です。

したがって、IDチェックを実行する場合(つまり、2つの異なる変数が同じオブジェクトを指しているかどうかを確認する場合)は、を使用する必要があります==。変数が2つの異なるオブジェクトを参照している場合、これはfalseを返します(同じオブジェクトの内容は関係ありません)。

ただし、campareしようとしているのがオブジェクトのコンテンツである場合は、equalsメソッドを使用する必要があります(ただし、equalsメソッドが適切に実装されていることを確認する必要があります)。

例えば

String a = "a";
String b = new String("a");

if(a == b) { //... identity check (returns false)

//...

if(a.equals(b)) { //... comparing the contents (returns true)
于 2012-06-16T16:03:59.093 に答える
0

等値演算子 ( ) は最終的に値ではなくオブジェクトの参照を比較するため、次のequalsようなメソッドを使用する必要があります。letter.equals("")==

また、C#より良い練習のために、string.Empty代わりに次""のように使用することです

if (letter == string.Empty)
于 2012-06-16T15:48:09.343 に答える
0

参照を比較しているため、String.equalsまたはString.equalsIgnoreCaseを使用してください

于 2012-06-16T15:46:14.350 に答える
-1

== は String オブジェクトに対して機能します ((google で string プール Java を探します) が、.equals() を実際に使用する必要があります (使用する必要があります)。

于 2012-06-16T15:42:53.837 に答える