8058779: Faster implementation of String.replace(CharSequence, CharSequence)

Ivan Gerasimov ivan.gerasimov at oracle.com
Sun May 31 15:54:35 UTC 2015


Hi Remi!

On 31.05.2015 11:43, Remi Forax wrote:
> I agree with the others the code is more readable.
>
> There is a slightly difference between the current behavior and the 
> behavior of the proposed code,
>   "foo".replace("bar", null)
> should throw a NPE because replacement is null but the proposed code 
> will return "foo"
> because replacement.toString() is called after the short-circuit test 
> (j < 0).
>
Yes, you're right, thanks for catching it!
And the regression test should have caught that, but I only had 
"a".replace("a", null) there, which passed.

I fixed the code and added the case to the regression test in the new 
webrev.

> so the first part of the code should be:
>   String starget = target.toString();  // implict nullcheck
>   String srepl = replacement.toString();  // implicit nullcheck
>   int j = indexOf(starget);
>   if (j < 0) {
>     return this;
>   }
>   ...
>
> also 'i' can be initialized just before the 'do', there is no point to 
> initialize it before.
>
> To finish, the two 'final' are useless here but i suppose it's a 
> matter of style :)
>
I moved declaration of i just to save a line.  I don't think it 
decreased performance.

Declaring the 'value' variable final was suggested by Martin, and I 
think it is reasonable (see 
http://mail.openjdk.java.net/pipermail/core-libs-dev/2015-March/032601.html).
The other variable is final just for symmetry :)

Sincerely yours,
Ivan


> cheers,
> Rémi
>
>
> On 05/31/2015 04:19 AM, Ivan Gerasimov wrote:
>> Hi everyone!
>>
>> Here's another webrev, in which replace() is implemented with 
>> StringBuilder.
>> On my benchmark it is almost as fast as the version backed with 
>> arrays, but this variant is much shorter.
>>
>> Credits to Sherman for combining the general algorithm with the case 
>> of empty target.
>>
>> Comments, further suggestions are welcome!
>>
>> BUGURL: https://bugs.openjdk.java.net/browse/JDK-8058779
>> WEBREV: http://cr.openjdk.java.net/~igerasim/8058779/04/webrev/
>>
>> Sincerely yours,
>> Ivan
>>
>
>
>




More information about the core-libs-dev mailing list