From 5ff7c57f9ff5428ef3d2aedd7e860bb1e8ff29ea Mon Sep 17 00:00:00 2001 From: Shaojin Wen Date: Fri, 26 Jul 2024 12:10:21 +0000 Subject: [PATCH] 8337168: Optimize LocalDateTime.toString Reviewed-by: liach, naoto --- .../share/classes/java/time/LocalDate.java | 20 +++++++++++++------ .../classes/java/time/LocalDateTime.java | 8 ++++++-- .../share/classes/java/time/LocalTime.java | 12 +++++++++-- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/java.base/share/classes/java/time/LocalDate.java b/src/java.base/share/classes/java/time/LocalDate.java index b0d7ad33c8a..2d71fb1ceca 100644 --- a/src/java.base/share/classes/java/time/LocalDate.java +++ b/src/java.base/share/classes/java/time/LocalDate.java @@ -2147,11 +2147,20 @@ public final class LocalDate */ @Override public String toString() { + var buf = new StringBuilder(10); + formatTo(buf); + return buf.toString(); + } + + /** + * Prints the toString result to the given buf, avoiding extra string allocations. + * Requires extra capacity of 10 to avoid StringBuilder reallocation. + */ + void formatTo(StringBuilder buf) { int yearValue = year; int monthValue = month; int dayValue = day; int absYear = Math.abs(yearValue); - StringBuilder buf = new StringBuilder(10); if (absYear < 1000) { if (yearValue < 0) { buf.append('-'); @@ -2164,11 +2173,10 @@ public final class LocalDate } buf.append(yearValue); } - return buf.append(monthValue < 10 ? "-0" : "-") - .append(monthValue) - .append(dayValue < 10 ? "-0" : "-") - .append(dayValue) - .toString(); + buf.append(monthValue < 10 ? "-0" : "-") + .append(monthValue) + .append(dayValue < 10 ? "-0" : "-") + .append(dayValue); } //----------------------------------------------------------------------- diff --git a/src/java.base/share/classes/java/time/LocalDateTime.java b/src/java.base/share/classes/java/time/LocalDateTime.java index 024aa1dacbe..d14afb7d78f 100644 --- a/src/java.base/share/classes/java/time/LocalDateTime.java +++ b/src/java.base/share/classes/java/time/LocalDateTime.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1965,7 +1965,11 @@ public final class LocalDateTime */ @Override public String toString() { - return date.toString() + 'T' + time.toString(); + var buf = new StringBuilder(29); + date.formatTo(buf); + buf.append('T'); + time.formatTo(buf); + return buf.toString(); } //----------------------------------------------------------------------- diff --git a/src/java.base/share/classes/java/time/LocalTime.java b/src/java.base/share/classes/java/time/LocalTime.java index fd2c5ce4d45..f28f8d3c599 100644 --- a/src/java.base/share/classes/java/time/LocalTime.java +++ b/src/java.base/share/classes/java/time/LocalTime.java @@ -1631,7 +1631,16 @@ public final class LocalTime */ @Override public String toString() { - StringBuilder buf = new StringBuilder(18); + var buf = new StringBuilder(18); + formatTo(buf); + return buf.toString(); + } + + /** + * Prints the toString result to the given buf, avoiding extra string allocations. + * Requires extra capacity of 18 to avoid StringBuilder reallocation. + */ + void formatTo(StringBuilder buf) { int hourValue = hour; int minuteValue = minute; int secondValue = second; @@ -1657,7 +1666,6 @@ public final class LocalTime buf.append(digits); } } - return buf.toString(); } //-----------------------------------------------------------------------