我有以下 Java 代码,它增加十六进制值的值并使用以下格式返回字符串(其中
x
是递增的十六进制值,7
是文字):
xxxx-7xxx-xxxx
该值从左到右递增,由 12 个字符组成:
0000-7000-0001
0000-7000-0002
...
0000-7fff-ffff
0001-7000-0000
代码:
public class GeneratorTemplate {
private static final AtomicLong COUNTER = new AtomicLong(0);
public static String generateTemplate() {
// incrementing the counter
long currentValue = COUNTER.getAndIncrement();
// get 11 character (not 12 because 7 is a literal and appended) hex value represented as string
String rawResult = String.format("%011X", currentValue & 0xFFFFFFFFFFFL);
// append and format values
return (rawResult.substring(0, 4) +
"-7" +
rawResult.substring(4, 7) +
"-" +
rawResult.substring(7)).toLowerCase();
}
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
System.out.println(generateTemplate());
}
}
}
它有效,但我确信这效率不高。
性能问题围绕着我手动附加
7
、连字符和小写字母这一事实。我认为,如果我用 format()
方法执行此操作,我将获得性能提升。另外,代码会更清晰
我试图用一行来完成这一任务,但没有成功。这段代码显然是不正确的,我想知道如何正确使用
format()
方法,这样我就不必手动附加任何内容:
return String.format("%04X-7%03X-%04X", currentValue & 0xFFFFL, currentValue & 0xFFFL, currentValue & 0xFFFFL);
任何人都可以澄清这是否可以使用
format()
方法来实现,以及参数中 F
的数量代表什么(我显然明白这是十六进制,但应该有多少个 F's
)?
谢谢
使用 String.format() 方法,因此您可以直接格式化十六进制值,而无需手动附加段。您需要在 String.format() 中使用正确的位操作和格式化。
import java.util.concurrent.atomic.AtomicLong;
public class GeneratorTemplate {
private static final AtomicLong COUNTER = new AtomicLong(0);
public static String generateTemplate() {
// Increment the counter
long currentValue = COUNTER.getAndIncrement();
// Use bit manipulation and formatting to generate the desired output
return String.format("%04X-7%03X-%04X",
(currentValue >> 40) & 0xFFFF, // Extract the first 4 hex digits
(currentValue >> 28) & 0xFFF, // Extract the next 3 hex digits
(currentValue & 0xFFFFF)); // Extract the last 5 hex digits
}
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
System.out.println(generateTemplate());
}
}
}
位操作:
(>>):将位向右移动,丢弃右侧的位并用零填充左侧以进行无符号移位。
currentValue >> 40 通过向右移动 40 位来提取前 4 个十六进制数字。
currentValue >> 28 通过向右移动 28 位来提取接下来的 3 个十六进制数字。
currentValue & 0xFFFFF 提取最后 5 个十六进制数字。
String.format():
“%04X”将第一个段格式化为 4 个十六进制数字宽。
“%03X”将第二段格式化为 3 个十六进制数字宽。
“%04X”将第三段格式化为 4 个十六进制数字宽。
上述代码的输出是: