2016-12-06 7 views
0

Stringクラスオーバーライドメソッドequalではcount,valueおよびoffsetを使用してください。何であるかなぜ我々はcountのように単純ではないのですか?length()関数、値は配列toCharArray();を使用できます。オフセットの場合はlength() - 1をとります。私は、これらのキーワードを数える検索しようとした値とJavaドキュメント内のオフセットが、見つからなかった....Stringクラスでオーバーライドされたequalメソッドを説明してください

public boolean equals(Object anObject) { 
    if (this == anObject) { 
     return true; 
    } 
    if (anObject instanceof String) { 
     String anotherString = (String)anObject; 
     int n = count; 
     if (n == anotherString.count) { 
     char v1[] = value; 
     char v2[] = anotherString.value; 
     int i = offset; 
     int j = anotherString.offset; 
     while (n-- != 0) { 
      if (v1[i++] != v2[j++]) 
      return false; 
     } 
     return true; 
     } 
    } 
    return false; 
    } 
+0

lengthあなたは私のopinon値では、Stringクラス内の他のコードplacesesを見なかったがchar配列であります文字列をchar arrとして格納します。offsetはこのchar arrのインデックスであり、文字列を反復して等しいかどうかを調べる文字列です。countは文字列の長さを意味します。 lenght()メソッド –

+2

を使用して "toCharArray()"を使用することができます*本当に* wあなたが文字列を比較するたびに新しい配列を作成する必要がありますか?それは本当に私にとっては本当に悪い考えです。 –

+0

探している実装にリンクできますか?それはJava 7 update 6、IIRCを中心に大きく変化しました。 'length() - 1'を使うことのあなたの期待は間違っていますが、私は疑いがあります...あなたが見ている実装を知らないと確かに言うのは難しいです –

答えて

3

は定義は以下のとおりです。たとえば

value -> array of char holding the chars present in the String 
count -> number of chars in the String 
offset -> offset of first character to be considered in the value array 

、配列

char[] chars = new char[]{'a', 'b', 'c', 'd', 'e'}; 
String str = new String(chars, 1, 2); 
System.out.println(str); // Prints bc 

char[] chars2 = new char[]{'b', 'c'}; 
String str2 = new String(chars2, 0, 2); 
System.out.println(str2); // Prints bc 

System.out.println(str.equals(str2)); // Prints true 

を考えるあなたは、その値がStringstr2ためStringstr['b', 'c']ため['a', 'b', 'c', 'd', 'e']で想像することができます。

これは当てはまりません。どちらの文字列も内部的にはサイズ2の文字配列['b', 'c']を使用します。

しかし、あなたはsubstringを求める際には、offsetcountの同じvalueと異なる値で、新しいStringを作成します。比較Stringが別Stringのストリングとすることができるので、ここで


いくつかの例にvalueoffsetcountの説明

command        value   count offset toString 
--------------------------------------------------------------------------- 
String str = new String("ABC");  ['A', 'B', 'C'] 3  0  ABC 
str.substring(2);     ['A', 'B', 'C'] 1  2  C  
str.substring(1, 2);    ['A', 'B', 'C'] 2  1  BC 
+0

良い説明のおかげで、私の質問が正しい場合plz upvote .... – Guest

1

JDK 1.8.0_65から - >java.langパッケージ - >String.javaクラス:

valueが定義されている
/** 
* Compares this string to the specified object. The result is {@code 
* true} if and only if the argument is not {@code null} and is a {@code 
* String} object that represents the same sequence of characters as this 
* object. 
* 
* @param anObject 
*   The object to compare this {@code String} against 
* 
* @return {@code true} if the given object represents a {@code String} 
*   equivalent to this string, {@code false} otherwise 
* 
* @see #compareTo(String) 
* @see #equalsIgnoreCase(String) 
*/ 
public boolean equals(Object anObject) { 
    if (this == anObject) { 
     return true; 
    } 
    if (anObject instanceof String) { 
     String anotherString = (String)anObject; 
     int n = value.length; 
     if (n == anotherString.value.length) { 
      char v1[] = value; 
      char v2[] = anotherString.value; 
      int i = 0; 
      while (n-- != 0) { 
       if (v1[i] != v2[i]) 
        return false; 
       i++; 
      } 
      return true; 
     } 
    } 
    return false; 
} 

/** The value is used for character storage. */ 
private final char value[]; 

ように私はかなりあなたの疑問に答えることを願っています。ここで

+0

この答えが何を理解するのに役立つのか分かりませんカウントとオフセットです。 –

+0

@DavideLorenzoMARINOドキュメント自体はStringクラスの*のオーバーライドされたメソッドを説明しています* 'count'と' offset'はそれぞれ 'value.length'と' 0'です。 – nullpointer

+1

ここでの混乱はOPがJavaバージョンを指定していないことが原因です。具体的には、 'String'の内部実装が変更されました.OPには古いバージョンがありました。この答えは新しいものを参照しています。 – biziclop

0

offsetcountフィールドは、使用されています。この場合、新しいStringオブジェクトは作成されませんが、文字列は別のString内の場所を指しています。なぜcountoffsetフィールドが存在するのですか?

例:この場合

String s1 = "DoTheHuzzle"; 
String s2 = s1.subString(2, 5); // "The" 

s2が2のoffsetを持っており、3

+0

少なくとも、それは真実であった。私はそれが最近であるとは思わないので、OPに仕様バージョンを参照するように依頼したのです。 –

関連する問題