0

私はかなり新しいプログラマーで、私が行っているいくつかのプロジェクトの一部として、部分文字列を使用しています。これらすべてで、if ステートメントに関する問題に遭遇しました。2 つの変数があるとします。1 つは他の文字列の部分文字列であり、もう 1 つはその最初の部分文字列と同等である必要があります。if ステートメントで等しいかどうかを確認しようとすると (等しいはずです)、 and == check に対して false が返されます。デモ用のコードを次に示します。

public class Substringproblem{

    static void method(){

                String random="somestring";

                String randomsubstring=random.substring(0,3);

                String should_be_randomsubstring="som";

               if(randomsubstring==should_be_randomsubstring){
                     System.out.println("Success");
               }else{
                     System.out.println("Failure");
                             System.out.println(randomsubstring);
               }
               }
               public static void main(String[] args) {
                         method();
               }

}

本当に明らかな何かが欠けているような気がしますが、少し探してみましたが、このようなものは見つかりませんでした。助けていただければ幸いです。

4

6 に答える 6

2
randomsubstring.equals(should_be_randomsubstring)

String オブジェクト参照を比較しています。

于 2013-03-14T05:48:49.127 に答える
2
randomsubstring.equals(should_be_randomsubstring)

また

randomsubstring.equalsIgnoreCase(should_be_randomsubstring)(If you want to ignore cae use this)

それ以外の

randomsubstring==should_be_randomsubstring)

文字列の使用を比較するときはいつでも、.equals()または.equalsIgnoreClas()

于 2013-03-14T05:50:40.180 に答える
2

2つの文字列を比較するためのJavaでは、常にequals()メソッドを使用します。コードは次のようになります。

if(randomsubstring.equals(should_be_randomsubstring)){
             System.out.println("Success");
       }else{
             System.out.println("Failure");
                     System.out.println(randomsubstring);
  • 「==」演算子は、String オブジェクトに存在するテキストの内容を比較しません。2 つの文字列が指している参照、つまりオブジェクト参照のみを比較します。したがって、あなたの場合はfalseを返します。
  • このequals()メソッドは、String オブジェクトに存在するテキストの内容を比較する必要がある場合に使用されます。このメソッドは、2 つの String オブジェクトが同じコンテンツを保持している場合に true を返します。
于 2013-03-14T05:50:47.280 に答える
2

== 演算子ではなく、関数を使用しString.equals(String anotherString)て文字列を比較します。関数は文字列の実際の内容をチェックし、== 演算子はオブジェクトへの参照が等しいかどうかをチェックします。

public class SubstringProblem {


    public static void main(String[] args) {
        method();
    }

     static void method() {
         String random = "somestring";
         String randomsubstring = random.substring(0,3);
         String should_be_randomsubstring = "som";

         if (randomsubstring.equals(should_be_randomsubstring)) {
             System.out.println("Success");
         } else {
             System.out.println("Failure");
             System.out.println(randomsubstring);
       }
     }
}
于 2013-03-14T05:53:18.217 に答える
0

ヒープメモリに単一の String オブジェクトがあると考えてください。同じオブジェクトを指す複数の参照変数を持つことができます。

Ex. String ref1 = "Test"; 
    String ref2 = ref1;
    String ref3 = ref1;

したがって、 String ref1、ref2、および ref3 は同じ String を指してい"Test"ます。したがって、これらの参照が等しいかどうかを確認するには、==演算子を使用する必要があります。対応する値を返します。
(equals も返さtrueれますが、その目的は異なります)

String の Equals メソッドは、String オブジェクトの実際の内容をチェックします。上記の場合、私が作成した場合

String ref4= new String("Test");

ref1 は ref と等しくありません。== 演算子は false を返します。これは、両方のオブジェクトがヒープ メモリ内に異なる存在を持っているためです。

両方のオブジェクトをequalsメソッドで比較するとtrue、内容が真であるため返されます。

部分文字列のメモリ リークに関する Imp の注意

memory leakまた、慎重に使用しないと発生する部分文字列メソッドについても掘り下げます。String の部分文字列メソッドは、古い文字列のvalue[]配列オブジェクトを使用して部分文字列を格納します。
元。たとえば、1 GB の文字列があり、その部分文字列を 500 MB で作成すると、1 GB のvalue[]配列オブジェクトで 500 MB の文字セットが返されます。これは、500 MB のデータを含む 1 GB の value[] 配列オブジェクトがまだあることを意味します。そのため、メモリリークが発生します。
回避する方法は?

String some1 = new String(some2.substring(5)); // use such call 
String someStr = some2.substring(5); //don't use this way
于 2013-03-14T07:06:12.333 に答える