String#equals
メソッドとメソッドの違いは何String#contentEquals
ですか?
String#equals
メソッドとメソッドの違いは何String#contentEquals
ですか?
回答:
String#equals()
他のオブジェクトものインスタンスである場合は、文字列の内容が、また、小切手を比較していないだけString
。String#contentEquals()
コンテンツのみを(文字列)を比較してんではない他のオブジェクトものインスタンスであるかどうかを確認String
。それは長い、それはの実装である限り何もすることができCharSequence
AOを覆うString
、StringBuilder
、StringBuffer
、CharBuffer
など、
==
演算子は2つのオブジェクトの内容ではなく参照の比較のみを許可します。
==
言及されているのはJavaScriptのみです。Javaについては言及されていません。
==
JavaScriptはに比べてはるかに緩やかでcontentEquals
、数値に影響を与えません)がequals
、完全に一致するStrings
型があるかどうかをチェックすることは正しいです(他のクラスは、equals
メソッドの型が緩い場合があります)。 。
簡単に言うと、は実装より自由になるためString.contentEquals()
、の賢い兄弟です。String.equals()
String.equals()
別のString.contentEquals()
方法がある理由はいくつかあります。私が考える最も重要な理由は:
equals
方法は再帰的でなければなりません。つまり:x.equals(y) == y.equals(x)
。これaString.equals(aStringBuffer)
は、と同じでなければならないことを意味しaStringBuffer.equals(aString)
ます。これには、Java API開発者equals()
がStringBuffer、StringBuilder、およびCharSequenceのメソッドでStringの特別な実装を行う必要があります。これは混乱するでしょう。これはどこでString.contentEquals
でてくる。これは、スタンドアロン方式んではないしなければならない厳格な要件や規則に従うためにObject.equals
。このようにして、「同等のコンテンツ」の感覚をより自由に実装できます。これにより、たとえば、StringBufferとStringをインテリジェントに比較できます。
そして、正確な違いは何ですか?
String.contentEquals()
a String
、a StringBuilder
、a StringBuffer
、a、CharSequence
およびこれらのすべての派生クラスの内容を比較できます。パラメータがString型の場合、String.equals()
実行されます。
String.equals()
Stringオブジェクトのみを比較します。他のすべてのオブジェクトタイプは等しくないと見なされます。
String.contentEquals()
比較することができStringBuffer
かつStringBuilder
インテリジェントな方法インチ コンテンツ全体を新しいStringオブジェクトにコピーする重いメソッドを呼び出しませんtoString()
。代わりに、基になるchar[]
配列と比較します。
この回答はすでにdbwによって投稿されましたが、彼はそれを削除しましたが、実行時間の比較、例外のスロー、
ソースコードString#equalsとString#contentEqualsを見ると、String#contentEquals
take StringBuilder
とotherの2つのオーバーライドされたメソッドがあることがわかりCharSequence
ます。
それらの違いは、
String#contentEquals
指定された引数がある場合はNPEをスローしますがnull
、String#equals
戻りますfalse
String#equals
指定された引数がinstance of String
それ以外の場合に返される場合にのみコンテンツを比較しますfalse
が、一方で、String#contentEquals
インターフェイスを実装するすべてのオブジェクトのコンテンツをチェックしますCharSequence
。以下に示すように渡された引数のメソッドをString#contentEquals
オーバーライドequals
することにより、誤った結果または必要な結果を返すようにコードを微調整することもできますが、でこれらの微調整を行うことはできませんString#equals
。
以下のコードtrue
は、3文字の長さのコードがs
含まれている限り、常に生成されますstring
String s= new String("abc");// "abc";
System.out.println(s.contentEquals(new CharSequence()
{
@Override
public CharSequence subSequence(int arg0, int arg1) {
// TODO Auto-generated method stub
return null;
}
@Override
public int length() {
// TODO Auto-generated method stub
return 0;
}
@Override
public char charAt(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean equals(Object obj)
{
return true;
}
}));
String#contentEquals
String#Equals
引数が指定されていinstance of String
て、両方の長さString
が同じでも内容が等しくない場合よりも遅くなります。
例文字列がある場合String s = "madam"
やString argPassed = "madan"
、その後s.contentEquals(argPassed)
に比べて、この場合にはほぼ倍増実行時間がかかりますs.equals(argPassed)
コンテンツの長さが両方の文字列で同じでない場合、関数String#contentEquals
はString#Equals
、ほとんどすべての場合よりもパフォーマンスが向上します。
彼の答えに追加するもう1つのポイント
String#contentEquals
String
オブジェクトも比較するStringBuilder
内容としながら、適切な結果を提供するString#Equals
意志のリターンfalse
String
クラスequals(Object o)
メソッドはString
比較のみを行います。しかし、contentEquals(CharSequence cs)
クラスのためのチェックが拡張AbstractStringBuilder
すなわち StringBuffer
、StringBuilder
およびString
クラスも(彼らはすべてのタイプですCharSequence
)。
String str = "stackoverflow";
StringBuilder builder = new StringBuilder(str);
System.out.println(str.equals(builder));
System.out.println(str.contentEquals(builder));
出力:
false
true
第STMTの出力があるfalse
ので、builder
型ではないString
ので、equals()
リターンfalse
が、contentEquals()
のようなすべてのタイプのコンテンツをチェックしStringBuilder
、StringBuffer
、String
およびコンテンツは、従って同じであるようにtrue
。
contentEquals
スローされますNullPointerException
指定された引数がある場合null
が、equals()
falseを返しますので、等号()のinstanceofをチェック(if (anObject instance of String)
引数がある場合はfalseを返します)null
。contentEquals(CharSequence cs)
:
java.lang.CharacterSequence
(例えば、CharBuffer
、Segment
、String
、StringBuffer
、StringBuilder
)equals(Object anObject)
:
java.lang.String
RTFC :)
ソースを読むことがそれを理解する最良の方法なので、両方の方法の実装を共有しています(jdk 1.7.0_45以降)。
public boolean contentEquals(CharSequence cs) {
if (value.length != cs.length())
return false;
// Argument is a StringBuffer, StringBuilder
if (cs instanceof AbstractStringBuilder) {
char v1[] = value;
char v2[] = ((AbstractStringBuilder) cs).getValue();
int i = 0;
int n = value.length;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
// Argument is a String
if (cs.equals(this))
return true;
// Argument is a generic CharSequence
char v1[] = value;
int i = 0;
int n = value.length;
while (n-- != 0) {
if (v1[i] != cs.charAt(i))
return false;
i++;
}
return true;
}
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;
}
String#contentEquals()には別のメソッドがあります:
public boolean contentEquals(StringBuffer sb) {
synchronized(sb) {
return contentEquals((CharSequence)sb);
}
}
equals()
そして、contentEquals()
で2つの方法ですString
2比較するためのクラスstrings
とstring
ではStringBuffer
。
パラメータがcontentEquals()
あるStringBuffer
とString(charSequence)
。equals()
2を比較するために使用されたstrings
とcontentEquals()
の内容を比較するために使用されるString
とStringBuffer
。
メソッドcontentEquals
と equals
は
public boolean contentEquals(java.lang.StringBuffer);
public boolean contentEquals(java.lang.CharSequence);
public boolean equals(Object o)
これは両方の方法を説明するコードです
public class compareString {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
StringBuffer sb1 = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("world");
boolean result1 = str1.equals(str2); // works nice and returns true
System.out.println(" str1.equals(str2) - "+ result1);
boolean result2 = str1.equals(sb1); // works nice and returns false
System.out.println(" str1.equals(sb1) - "+ result2);
boolean result3 = str1.contentEquals(sb1); // works nice and returns true
System.out.println(" str1.contentEquals(sb1) - "+ result3);
boolean result4 = str1.contentEquals(sb2); // works nice and returns false
System.out.println(" str1.contentEquals(sb2) - "+ result4);
boolean result5 = str1.contentEquals(str2); // works nice and returns true
System.out.println(" str1.contentEquals(str2) - "+ result5);
}
}
出力:
str1.equals(str2) - true
str1.equals(sb1) - false
str1.contentEquals(sb1) - true
str1.contentEquals(sb2) - false
str1.contentEquals(str2) - true
String#equalsはObjectを引数として取り、それがStringオブジェクトのインスタンスかどうかをチェックします。引数オブジェクトが文字列オブジェクトの場合、コンテンツを文字ごとに比較します。両方の文字列オブジェクトの内容が同じ場合はtrueを返します。
String#contentEqualsは、引数としてCharSequenceインターフェースを取ります。CharSequenceは、i)Stringクラスまたは(ii)AbstractStringBuilder(StringBufferの親クラス、StringBuilder)の2つの方法で実装できます。
contentEquals() の長さは、任意のオブジェクトのインスタンスのチェックの前に比較されます。長さが同じ場合、引数オブジェクトがAbstractStringBuilderのインスタンスかどうかをチェックします。そうである場合(つまり、StringBufferまたはStringBuilder)、コンテンツは文字ごとにチェックされます。引数がStringオブジェクトのインスタンスの場合、String#equalsはString#contentEqualsから呼び出されます。
要するに、
引数がStringオブジェクトの場合も、String#equalsはコンテンツを文字ごとに比較します。そして、String#contentEqualsは、引数オブジェクトがCharSequenceインターフェースを実装する場合のコンテンツを比較します。
String#contentEqualsが内部的にStringオブジェクトのString#equalsを呼び出すので、2つの同じ長さの文字列コンテンツを比較する場合、String#contentEqualsは遅くなります。
コンテンツの長さが異なるオブジェクト(たとえば、「abc」と「abcd」)を比較しようとする場合、String#contentEqualsはString#equalsより高速です。オブジェクトインスタンスのチェック前に長さが比較されるためです。
contentEquals()
方法チェックは内容が間で同一であるString
、StringBuffer
など、その文字列のいくつかの種類。
ところで、違いの歴史的な理由は、Stringには元々スーパークラスがなかったため、String.equals()はStringを引数として取るということです。CharSequenceがStringのスーパークラスとして導入されたとき、すべてのCharSequence実装全体で機能する独自の等価テストが必要でした。これは、Stringですでに使用されているequals()と衝突しないため、CharSequence.contentEquals( )、Stringによって継承されます。
CharSequenceがJava 1.0に存在する場合、ProbalbyにはCharSequence.equals()のみがあり、Stringはそれを実装するだけです。
ああ、進化する言語の喜び...
==
(contentEquals)と===
(equals)のようですか?