class CompareModeDefault extends CompareMode {

    private final Collator collator;
    private final SmallLRUCache<String, CollationKey> collationKeys;

    protected CompareModeDefault(String name, int strength, boolean binaryUnsigned) {
        super(name, strength, binaryUnsigned);
        collator = CompareMode.getCollator(name);
        if (collator == null) {
            throw DbException.getInternalError(name);
        }
        collator.setStrength(strength);
        int cacheSize = SysProperties.COLLATOR_CACHE_SIZE;
        if (cacheSize != 0) {
            collationKeys = SmallLRUCache.newInstance(cacheSize);
        } else {
            collationKeys = null;
        }
    }

    @Override
    public int compareString(String a, String b, boolean ignoreCase) {<FILL_FUNCTION_BODY>}

    @Override
    public boolean equalsChars(String a, int ai, String b, int bi, boolean ignoreCase) {
        return compareString(a.substring(ai, ai + 1), b.substring(bi, bi + 1), ignoreCase) == 0;
    }

    private CollationKey getKey(String a) {
        synchronized (collationKeys) {
            CollationKey key = collationKeys.get(a);
            if (key == null) {
                key = collator.getCollationKey(a);
                collationKeys.put(a, key);
            }
            return key;
        }
    }
}

        if (ignoreCase) {
            // this is locale sensitive
            a = a.toUpperCase();
            b = b.toUpperCase();
        }
        int comp;
        if (collationKeys != null) {
            CollationKey aKey = getKey(a);
            CollationKey bKey = getKey(b);
            comp = aKey.compareTo(bKey);
        } else {
            comp = collator.compare(a, b);
        }
        return comp;
    
<methods>public int compareString(java.lang.String, java.lang.String, boolean) ,public boolean equalsChars(java.lang.String, int, java.lang.String, int, boolean) ,public static java.text.Collator getCollator(java.lang.String) ,public static synchronized com.lealone.db.value.CompareMode getInstance(java.lang.String, int, boolean) ,public static java.lang.String getName(java.util.Locale) ,public java.lang.String getName() ,public int getStrength() ,public boolean isBinaryUnsigned() <variables>private static final non-sealed boolean CAN_USE_ICU4J,public static final java.lang.String DEFAULT,public static final java.lang.String ICU4J,public static final java.lang.String OFF,public static final java.lang.String SIGNED,public static final java.lang.String UNSIGNED,private final non-sealed boolean binaryUnsigned,private static com.lealone.db.value.CompareMode lastUsed,private final non-sealed java.lang.String name,private final non-sealed int strength