Class AsciiStringInterner
String
instances which contain only ascii characters,
keyed by the byte[]
representation (in ascii).
The values are stored in SoftReference
s, allowing them to be garbage collected if not in use and there is
memory pressure.
NOTE: Instances are safe for concurrent use.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate static class
private static final class
Instance used for inserting values into the cache.private final class
CustomSoftReference
implementation which maintains a reference to the key in the cache, which allows aggressive cleaning when garbage collector collects theString
instance.private static class
Only used for lookups, never to actually store entries. -
Field Summary
FieldsModifier and TypeFieldDescription(package private) final ConcurrentMap
<AsciiStringInterner.BaseKey, SoftReference<String>> Contains the canonicalized values, keyed by the asciibyte[]
.(package private) final ReferenceQueue
<String> Used forReference
as values incache
. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescription(package private) static boolean
arrayEquals
(byte[] a, int aOffset, int aLength, byte[] b, int bOffset, int bLength) Performs equality check between a and b (with corresponding offset/length values).private void
Produces aString
instance for the given bytes.getStringIfPresent
(byte[] bytes, int offset, int length, Encoding encoding) Produces aString
instance for the given bytes.private static int
hashKey
(byte[] bytes, int offset, int length) Generates a hash value for the relevant entries in bytes as long as all values are ascii (>= 0
).boolean
Preemptively populates a value into the cache.toString()
-
Field Details
-
cache
Contains the canonicalized values, keyed by the asciibyte[]
. -
refQueue
Used forReference
as values incache
.
-
-
Constructor Details
-
AsciiStringInterner
AsciiStringInterner()
-
-
Method Details
-
putString
Preemptively populates a value into the cache. This is intended to be used withString
constants which are frequently used. While this can work with otherString
values, if val is ever garbage collected, it will not be actively removed from this instance.- Parameters:
val
- The value to intern. Must not benull
.- Returns:
- Indication if val is an ascii String and placed into cache.
-
getString
Produces aString
instance for the given bytes. If all are valid ascii (i.e.>= 0
) either an existing value will be returned, or the newly createdString
will be stored before being returned.If non-ascii bytes are discovered, the encoding will be used to
decode
and that value will be returned (but not stored).- Parameters:
bytes
- The bytes of the String. Must not benull
.offset
- Offset into bytes to start.length
- The number of bytes in bytes which are relevant.encoding
- To use if non-ascii bytes seen.- Returns:
- Decoded
String
from bytes. - Throws:
IOException
- If error decoding from Encoding.
-
getStringIfPresent
public String getStringIfPresent(byte[] bytes, int offset, int length, Encoding encoding) throws IOException Produces aString
instance for the given bytes.If all are valid ascii (i.e.
>= 0
) and a correspondingString
value exists, it will be returned. If no value exists, aString
will be created, but not stored.If non-ascii bytes are discovered, the encoding will be used to
decode
and that value will be returned (but not stored).- Parameters:
bytes
- The bytes of the String. Must not benull
.offset
- Offset into bytes to start.length
- The number of bytes in bytes which are relevant.encoding
- To use if non-ascii bytes seen.- Returns:
- Decoded
String
from bytes. - Throws:
IOException
- If error decoding from Encoding.
-
cleanQueue
private void cleanQueue()- See Also:
-
hashKey
private static int hashKey(byte[] bytes, int offset, int length) Generates a hash value for the relevant entries in bytes as long as all values are ascii (>= 0
).- Returns:
- hash code for relevant bytes, or
0
if non-ascii bytes present.
-
arrayEquals
static boolean arrayEquals(byte[] a, int aOffset, int aLength, byte[] b, int bOffset, int bLength) Performs equality check between a and b (with corresponding offset/length values).The
static boolean equals(byte[].class, int, int, byte[], int, int
method inArrays
is optimized for longerbyte[]
instances than is expected to be seen here. -
toString
-