Use ConfigurationPropertyName#adapt method to create two ConfigurationPropertyName, a equals to b but b not equals to a

boolean c1 = adapt("demo", '.').equals(adapt("demo$$", '.'));  // true
boolean c2 = adapt("demo$$", '.').equals(adapt("demo", '.'));  // false

The problems is in defaultElementEquals method, see below

private boolean defaultElementEquals(Elements e1, Elements e2, int i) {
        int l1 = e1.getLength(i);
        int l2 = e2.getLength(i);
        boolean indexed1 = e1.getType(i).isIndexed();
        boolean indexed2 = e2.getType(i).isIndexed();
        int i1 = 0;
        int i2 = 0;
        while (i1 < l1) {
                        // at this point, e1 has extra invalid chars, but e2 is end, returned false without cheking
                        // left chars of e1
            if (i2 >= l2) {
                return false;
            }
            char ch1 = indexed1 ? e1.charAt(i, i1) : Character.toLowerCase(e1.charAt(i, i1));
            char ch2 = indexed2 ? e2.charAt(i, i2) : Character.toLowerCase(e2.charAt(i, i2));
            if (!indexed1 && !ElementsParser.isAlphaNumeric(ch1)) {
                i1++;
            }
            else if (!indexed2 && !ElementsParser.isAlphaNumeric(ch2)) {
                i2++;
            }
            else if (ch1 != ch2) {
                return false;
            }
            else {
                i1++;
                i2++;
            }
        }
        if (i2 < l2) {
            if (indexed2) {
                return false;
            }
            do {
                char ch2 = Character.toLowerCase(e2.charAt(i, i2++));
                if (ElementsParser.isAlphaNumeric(ch2)) {
                    return false;
                }
            }
            while (i2 < l2);
        }
        return true;
    }