Class AsciiStringInterner

java.lang.Object
org.postgresql.core.AsciiStringInterner

final class AsciiStringInterner extends Object
Provides the canonicalization/interning of String instances which contain only ascii characters, keyed by the byte[] representation (in ascii).

The values are stored in SoftReferences, allowing them to be garbage collected if not in use and there is memory pressure.

NOTE: Instances are safe for concurrent use.

  • Field Details

  • Constructor Details

    • AsciiStringInterner

      AsciiStringInterner()
  • Method Details

    • putString

      public boolean putString(String val)
      Preemptively populates a value into the cache. This is intended to be used with String constants which are frequently used. While this can work with other String values, if val is ever garbage collected, it will not be actively removed from this instance.
      Parameters:
      val - The value to intern. Must not be null.
      Returns:
      Indication if val is an ascii String and placed into cache.
    • getString

      public String getString(byte[] bytes, int offset, int length, Encoding encoding) throws IOException
      Produces a String instance for the given bytes. If all are valid ascii (i.e. >= 0) either an existing value will be returned, or the newly created String 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 be null.
      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 a String instance for the given bytes.

      If all are valid ascii (i.e. >= 0) and a corresponding String value exists, it will be returned. If no value exists, a String 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 be null.
      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()
      Process any entries in refQueue to purge from the cache.
      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 in Arrays is optimized for longer byte[] instances than is expected to be seen here.

    • toString

      public String toString()
      Overrides:
      toString in class Object