From 5feb3c0dbc4a918ab892a575cccd620240d839c9 Mon Sep 17 00:00:00 2001 From: Google Java Core Libraries Date: Mon, 3 Aug 2026 11:20:10 -0700 Subject: [PATCH] Optimize InetAddresses.hextetsToIPv6String to avoid unnecessary allocations during hex conversion. RELNOTES=n/a PiperOrigin-RevId: 958480315 --- .../com/google/common/net/InetAddresses.java | 22 ++++++++++++++++++- .../com/google/common/net/InetAddresses.java | 22 ++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/android/guava/src/com/google/common/net/InetAddresses.java b/android/guava/src/com/google/common/net/InetAddresses.java index 864110a32005..5ad8c1c8c9bc 100644 --- a/android/guava/src/com/google/common/net/InetAddresses.java +++ b/android/guava/src/com/google/common/net/InetAddresses.java @@ -532,6 +532,26 @@ private static void compressLongestRunOfZeroes(int[] hextets) { } } + private static final char[] HEX_DIGITS = "0123456789abcdef".toCharArray(); + + private static void appendHex(StringBuilder sb, int val) { + if (val < 16) { + sb.append(HEX_DIGITS[val]); + } else if (val < 256) { + sb.append(HEX_DIGITS[val >> 4]); + sb.append(HEX_DIGITS[val & 0xF]); + } else if (val < 4096) { + sb.append(HEX_DIGITS[val >> 8]); + sb.append(HEX_DIGITS[(val >> 4) & 0xF]); + sb.append(HEX_DIGITS[val & 0xF]); + } else { + sb.append(HEX_DIGITS[val >> 12]); + sb.append(HEX_DIGITS[(val >> 8) & 0xF]); + sb.append(HEX_DIGITS[(val >> 4) & 0xF]); + sb.append(HEX_DIGITS[val & 0xF]); + } + } + /** * Convert a list of hextets into a human-readable IPv6 address. * @@ -553,7 +573,7 @@ private static String hextetsToIPv6String(int[] hextets) { if (lastWasNumber) { buf.append(':'); } - buf.append(Integer.toHexString(hextets[i])); + appendHex(buf, hextets[i]); } else { if (i == 0 || lastWasNumber) { buf.append("::"); diff --git a/guava/src/com/google/common/net/InetAddresses.java b/guava/src/com/google/common/net/InetAddresses.java index 864110a32005..5ad8c1c8c9bc 100644 --- a/guava/src/com/google/common/net/InetAddresses.java +++ b/guava/src/com/google/common/net/InetAddresses.java @@ -532,6 +532,26 @@ private static void compressLongestRunOfZeroes(int[] hextets) { } } + private static final char[] HEX_DIGITS = "0123456789abcdef".toCharArray(); + + private static void appendHex(StringBuilder sb, int val) { + if (val < 16) { + sb.append(HEX_DIGITS[val]); + } else if (val < 256) { + sb.append(HEX_DIGITS[val >> 4]); + sb.append(HEX_DIGITS[val & 0xF]); + } else if (val < 4096) { + sb.append(HEX_DIGITS[val >> 8]); + sb.append(HEX_DIGITS[(val >> 4) & 0xF]); + sb.append(HEX_DIGITS[val & 0xF]); + } else { + sb.append(HEX_DIGITS[val >> 12]); + sb.append(HEX_DIGITS[(val >> 8) & 0xF]); + sb.append(HEX_DIGITS[(val >> 4) & 0xF]); + sb.append(HEX_DIGITS[val & 0xF]); + } + } + /** * Convert a list of hextets into a human-readable IPv6 address. * @@ -553,7 +573,7 @@ private static String hextetsToIPv6String(int[] hextets) { if (lastWasNumber) { buf.append(':'); } - buf.append(Integer.toHexString(hextets[i])); + appendHex(buf, hextets[i]); } else { if (i == 0 || lastWasNumber) { buf.append("::");