From afac0df426b33189617dace7ebfe60f877d3b030 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 2 Jul 2015 12:33:07 +0300 Subject: [PATCH] speed optimisation: store computed hashCode --- .../util/text/ByteArrayCharSequence.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/platform/util/src/com/intellij/util/text/ByteArrayCharSequence.java b/platform/util/src/com/intellij/util/text/ByteArrayCharSequence.java index fcf7ea4f1dbf..c417c3628075 100644 --- a/platform/util/src/com/intellij/util/text/ByteArrayCharSequence.java +++ b/platform/util/src/com/intellij/util/text/ByteArrayCharSequence.java @@ -15,15 +15,36 @@ */ package com.intellij.util.text; +import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NotNull; public class ByteArrayCharSequence implements CharSequence { + private int hash; private final byte[] myChars; - public ByteArrayCharSequence(@NotNull byte... chars) { + private ByteArrayCharSequence(@NotNull byte[] chars) { myChars = chars; } + @Override + public int hashCode() { + int h = hash; + if (h == 0) { + byte[] chars = myChars; + + for (byte aChar : chars) { + h = 31 * h + aChar; + } + hash = h; + } + return h; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof CharSequence && StringUtil.equals(this, (CharSequence)obj); + } + @Override public final int length() { return myChars.length; @@ -63,6 +84,7 @@ public class ByteArrayCharSequence implements CharSequence { //noinspection RedundantStringConstructorCall return new String(name.toString()); // So we don't hold whole char[] buffer of a lengthy path on JDK 6 } + bytes[i] = (byte)c; } return new ByteArrayCharSequence(bytes);