FULL PRODUCT VERSION :
jdk-7-ea-bin-b15-windows-i586-05_jul_2007
A DESCRIPTION OF THE PROBLEM :
See comment on the bug 6355654.
In String.contentEquals(CharSquence), if the charsequence is not an AbstractStringBuilder, has the same length and has a different content, the contents are compared twice.
public boolean contentEquals(CharSequence cs) {
if (count != cs.length())
return false;
// Argument is a StringBuffer, StringBuilder
if (cs instanceof AbstractStringBuilder) {
char v1[] = value;
char v2[] = ((AbstractStringBuilder)cs).getValue();
int i = offset;
int j = 0;
int n = count;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
// Argument is a String
if (cs.equals(this))
return true;
/*==================================================
Here cs could a string with a different content so there would be no
need to compare the chars again
==================================================*/
// Argument is a generic CharSequence
char v1[] = value;
int i = offset;
int j = 0;
int n = count;
while (n-- != 0) {
if (v1[i++] != cs.charAt(j++))
return false;
}
return true;
}
For instance if cs is a String "foo" and this = "bar", cs.equal(this) return false after comparing the two contents but the characters are compared again.
Why don't you just keep it simple? You don't need instanceof, just compare the contents using charAt and it's gonna be fine. You can still add a contentEquals(AbstractStringBuilder) if you want. Plus a method stringEquals(String) would be appreciated because we compare a string to another string most of time and without needing compareTo specification.
REPRODUCIBILITY :
This bug can be reproduced always.
jdk-7-ea-bin-b15-windows-i586-05_jul_2007
A DESCRIPTION OF THE PROBLEM :
See comment on the bug 6355654.
In String.contentEquals(CharSquence), if the charsequence is not an AbstractStringBuilder, has the same length and has a different content, the contents are compared twice.
public boolean contentEquals(CharSequence cs) {
if (count != cs.length())
return false;
// Argument is a StringBuffer, StringBuilder
if (cs instanceof AbstractStringBuilder) {
char v1[] = value;
char v2[] = ((AbstractStringBuilder)cs).getValue();
int i = offset;
int j = 0;
int n = count;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
// Argument is a String
if (cs.equals(this))
return true;
/*==================================================
Here cs could a string with a different content so there would be no
need to compare the chars again
==================================================*/
// Argument is a generic CharSequence
char v1[] = value;
int i = offset;
int j = 0;
int n = count;
while (n-- != 0) {
if (v1[i++] != cs.charAt(j++))
return false;
}
return true;
}
For instance if cs is a String "foo" and this = "bar", cs.equal(this) return false after comparing the two contents but the characters are compared again.
Why don't you just keep it simple? You don't need instanceof, just compare the contents using charAt and it's gonna be fine. You can still add a contentEquals(AbstractStringBuilder) if you want. Plus a method stringEquals(String) would be appreciated because we compare a string to another string most of time and without needing compareTo specification.
REPRODUCIBILITY :
This bug can be reproduced always.
- relates to
-
JDK-6355654 (str) String.contentEquals(CharSequence) calculates twice for AbstractStringBuilder
- Closed