Need reviewer for forward port of 6815768 (File.getXXXSpace) and 6815768 (String.hashCode)

Ulf Zibis Ulf.Zibis at gmx.de
Sat Feb 27 18:31:00 UTC 2010


Am 26.02.2010 16:27, schrieb Dmitry Nadezhin:
>
>
> On Fri, Feb 26, 2010 at 6:19 PM, Ulf Zibis <Ulf.Zibis at gmx.de 
> <mailto:Ulf.Zibis at gmx.de>> wrote:
>
>     Am 26.02.2010 12:52, schrieb Dmitry Nadezhin:
>
>         I found two alternatives in the link
>         http://mail.openjdk.java.net/pipermail/coin-dev/2009-December/002618.html
>           The first alternative
>         int equalByHashThreshold = 2;
>
>         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&&
>                 (equalByHashThreshold == 0 || --equalByHashThreshold
>         == 0)&&
>                 (anotherString.equalByHashThreshold == 0 ||
>         --anotherString.equalByHashThreshold == 0)&&
>
>
>                 hash() == anotherString.hash()) {
>         [snipped]
>             }
>           }
>           return false;
>         }
>
>         will say that
>         "A".equals("A") == false
>         because body of if statement will not be executed
>
>
>     I don't understand your problem.
>     1. String literals are always interned, so "A" is always identical
>     to "A". Therefore the body of the 1st if will return true.
>     2. If the strings are not identical, body of 2nd if will be
>     executed, if anObject is instance of String.
>
>
> I'm sorry. The example should be
> new String("A").equals("A") == false .
> In this case Strings are not identical. The first if wil not return.
> The second if will be executed.
> The third if will not be executed because
> (equalByHashThreshold == 0 || --equalByHashThreshhold == 0) <=> (2 == 
> 0 || 1 == 0) <=> false .
>

Thanks for your patience.
As I think, adding a new member variable to String is a bad idea, even 
if it's transient, I didn't try to fix your claim.

But I've added a new equals4() method, which too follows the idea of 
incrementing a counter against a threshold, double-using the hash value, 
but without possibility to adjust the threshold against the string's length.

See new revision:
https://java-nio-charset-enhanced.dev.java.net/source/browse/java-nio-charset-enhanced/branches/j7_EUC_TW/src/java/lang/String.java?rev=959&view=markup 


-Ulf

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/core-libs-dev/attachments/20100227/38bc8fa6/attachment.html>


More information about the core-libs-dev mailing list