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