RFR: 8368825: Change the DateTimeFormatterBuilder::FIELD_MAP type from Map to Array

Shaojin Wen swen at openjdk.org
Mon Sep 29 01:12:11 UTC 2025


On Tue, 5 Aug 2025 15:30:30 GMT, Chen Liang <liach at openjdk.org> wrote:

> > with key values in the range 'A-Z' and 'a-z'.
> 
> You can use a table of size 64, and access the table with `& 63`.

This will save memory space, but it will also increase the complexity a little bit.


    @Stable
    private static final TemporalField[] FIELD_MAP = new TemporalField[64];
    static {
        // SDF = SimpleDateFormat
        FIELD_MAP['G' & 0x3f] = ChronoField.ERA;                       // SDF, LDML (different to both for 1/2 chars)
        FIELD_MAP['y' & 0x3f] = ChronoField.YEAR_OF_ERA;               // SDF, LDML
        FIELD_MAP['u' & 0x3f] = ChronoField.YEAR;                      // LDML (different in SDF)
        FIELD_MAP['Q' & 0x3f] = IsoFields.QUARTER_OF_YEAR;             // LDML (removed quarter from 310)
        FIELD_MAP['q' & 0x3f] = IsoFields.QUARTER_OF_YEAR;             // LDML (stand-alone)
        FIELD_MAP['M' & 0x3f] = ChronoField.MONTH_OF_YEAR;             // SDF, LDML
        FIELD_MAP['L' & 0x3f] = ChronoField.MONTH_OF_YEAR;             // SDF, LDML (stand-alone)
        FIELD_MAP['D' & 0x3f] = ChronoField.DAY_OF_YEAR;               // SDF, LDML
        FIELD_MAP['d' & 0x3f] = ChronoField.DAY_OF_MONTH;              // SDF, LDML
        FIELD_MAP['F' & 0x3f] = ChronoField.ALIGNED_WEEK_OF_MONTH;     // SDF, LDML
        FIELD_MAP['E' & 0x3f] = ChronoField.DAY_OF_WEEK;               // SDF, LDML (different to both for 1/2 chars)
        FIELD_MAP['c' & 0x3f] = ChronoField.DAY_OF_WEEK;               // LDML (stand-alone)
        FIELD_MAP['e' & 0x3f] = ChronoField.DAY_OF_WEEK;               // LDML (needs localized week number)
        FIELD_MAP['a' & 0x3f] = ChronoField.AMPM_OF_DAY;               // SDF, LDML
        FIELD_MAP['H' & 0x3f] = ChronoField.HOUR_OF_DAY;               // SDF, LDML
        FIELD_MAP['k' & 0x3f] = ChronoField.CLOCK_HOUR_OF_DAY;         // SDF, LDML
        FIELD_MAP['K' & 0x3f] = ChronoField.HOUR_OF_AMPM;              // SDF, LDML
        FIELD_MAP['h' & 0x3f] = ChronoField.CLOCK_HOUR_OF_AMPM;        // SDF, LDML
        FIELD_MAP['m' & 0x3f] = ChronoField.MINUTE_OF_HOUR;            // SDF, LDML
        FIELD_MAP['s' & 0x3f] = ChronoField.SECOND_OF_MINUTE;          // SDF, LDML
        FIELD_MAP['S' & 0x3f] = ChronoField.NANO_OF_SECOND;            // LDML (SDF uses milli-of-second number)
        FIELD_MAP['A' & 0x3f] = ChronoField.MILLI_OF_DAY;              // LDML
        FIELD_MAP['n' & 0x3f] = ChronoField.NANO_OF_SECOND;            // 310 (proposed for LDML)
        FIELD_MAP['N' & 0x3f] = ChronoField.NANO_OF_DAY;               // 310 (proposed for LDML)
        FIELD_MAP['g' & 0x3f] = JulianFields.MODIFIED_JULIAN_DAY;

    private void parsePattern(String pattern) {
        // ...
        TemporalField field = FIELD_MAP[cur & 0x3f];
        // ...
    }

-------------

PR Comment: https://git.openjdk.org/jdk/pull/26634#issuecomment-3157086644


More information about the core-libs-dev mailing list