我有以下情况,我不确定我是否以聪明的方式处理它。
所以我必须创建一个包含一些行的文本文件。
每一行都是由一些其他字符串的串联组成的字符串。
其中一些字符串(我必须连接)取自模型对象(定义为模型对象的字段的值)。
其他一些字符串具有固定值(具有固定长度)。
例如(进入创建连接的方法)我可以这样:
// FINAL BUILDED String:
String outputLine;
// FIELDS TO BE CONCATENATED:
String jobId = " ";
String address = myModelObject.getAddress();
String name = myModelObject.getName();
outputLine = jobId + address + name;
因此,正如您在上一个代码段中所看到的, jobId 字段必须是由 8个空白连续字符组成的固定字符串
我的疑问是:它是正确的还是我可以用更聪明的方式创建一个固定的长度字符串(由所有空白字符组成)?也许使用数组Char ?但我不确定这是一个更智能的解决方案
TNX
答案 0 :(得分:3)
Java Strings
始终是不可变的。它们无法改变。
String jobId = " ";
是 String Literal ,由JVM中的所有类共享。即,双引号""
内的任何内容都会进入字符串常量池,并且只有一个实例与无关。
接下来,outputLine = jobId + address + name;
在内部使用StringBuilder
。所以,这里没有什么可以做的。
使用字符串时必须检查两件事:
永远不要在循环中使用string.concat()
(除非您想向某人表明这是一个坏主意:P)。
永远不要创建new String("someStringLiteral")
(除非您想向某人表明这也是一个坏主意:P)。
PS:如果您确定某些字符串只会使用几次,您可以new String(charArray[])
并将其保留在堆上。
答案 1 :(得分:1)
一种常用方法是使用Arrays.fill
。
public static String makeFilledString(int n, char c) {
char[] ca = new char[n];
Arrays.fill(ca, c);
return new String(ca);
}
不知道这是否比在循环中构建一个更高效或更低效,但至少它允许您配置字段宽度而不是将其长度隐藏在硬编码字符串后面。
请注意,此技术始终会创建新的字符串。这个可能会导致您希望使用更多内存。在Map
中跟踪它们是有益的,这样您就不会重复这些创作。
private static Map<Integer, String> spaces = new HashMap<>();
public static String spaces(int n) {
String s = spaces.get(n);
if (s == null) {
spaces.put(n, s = makeFilledString(n, ' '));
}
return s;
}
注意:以上内容不是线程安全的。
答案 2 :(得分:0)
你可能需要的是格式化输出字符串,如果是这种情况,你可以使用String.format:
outputLine = String.format("%8s%s%s", s1, s2, s3);
如果您需要String具有固定长度,则可以创建实用程序方法:
public static String fillString(String string, char character, int size) {
StringBuilder sb = new StringBuilder(size);
sb.append(string);
while (sb.length() < size) {
sb.insert(0, character);
}
return sb.toString();
}