From 4a8492d428be5c659acc007e3b6f1462ff9fe645 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 5 May 2020 18:32:50 -0700 Subject: [PATCH] Further optimize StringSequence.startsWith See gh-21259 --- .../boot/loader/jar/StringSequence.java | 12 +----------- .../boot/loader/jar/StringSequenceTests.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/StringSequence.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/StringSequence.java index 82d5812557..25822d0fcd 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/StringSequence.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/jar/StringSequence.java @@ -108,17 +108,7 @@ final class StringSequence implements CharSequence { if (length - prefixLength - offset < 0) { return false; } - if (length == this.source.length()) { - return this.source.startsWith(prefix, offset); - } - int prefixOffset = 0; - int sourceOffset = offset; - while (prefixLength-- != 0) { - if (charAt(sourceOffset++) != prefix.charAt(prefixOffset++)) { - return false; - } - } - return true; + return this.source.startsWith(prefix, this.start + offset); } @Override diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/StringSequenceTests.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/StringSequenceTests.java index fddd5ee72a..a9194bbd34 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/StringSequenceTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/jar/StringSequenceTests.java @@ -203,4 +203,18 @@ class StringSequenceTests { assertThat(new StringSequence("xab").startsWith("c", 1)).isFalse(); } + @Test + void startsWithOnSubstringTailWhenMatch() { + StringSequence subSequence = new StringSequence("xabc").subSequence(1); + assertThat(subSequence.startsWith("abc")).isTrue(); + assertThat(subSequence.startsWith("abcd")).isFalse(); + } + + @Test + void startsWithOnSubstringMiddleWhenMatch() { + StringSequence subSequence = new StringSequence("xabc").subSequence(1, 3); + assertThat(subSequence.startsWith("ab")).isTrue(); + assertThat(subSequence.startsWith("abc")).isFalse(); + } + }