Java 使用2000“创建字符串的方法有哪些;空格“;

Java 使用2000“创建字符串的方法有哪些;空格“;,java,oracle,Java,Oracle,出于各种原因,我试图将字符串设置为2000个空格。目前我正在使用: String s = String.format("%1$-2000s"," "); 这对于Java5来说非常好,但是,我们部门的一些开发人员正在使用1.4,这不起作用 我想知道,还有其他方法可以达到同样的效果吗?我知道我可以做一些事情,比如一次添加一个空间的for循环,但是我正在寻找一些简单的东西,比如format选项 对于那些可能对我为什么需要它感兴趣的人来说,这是因为我们在数据对象上有一个XML类型,在插入到DB中时它是

出于各种原因,我试图将字符串设置为2000个空格。目前我正在使用:

String s = String.format("%1$-2000s"," ");
这对于Java5来说非常好,但是,我们部门的一些开发人员正在使用1.4,这不起作用

我想知道,还有其他方法可以达到同样的效果吗?我知道我可以做一些事情,比如一次添加一个空间的for循环,但是我正在寻找一些简单的东西,比如format选项

对于那些可能对我为什么需要它感兴趣的人来说,这是因为我们在数据对象上有一个XML类型,在插入到DB中时它是空的。然后用XML字符串进行更新,通常大小约为2000个字符。在Oracle中,预先保留此空间可以防止行迁移,从而提高性能


谢谢

StringBuffer,然后在循环中添加2000次空格,然后添加toString()。我不认为有任何“更简单”的方法可以做到这一点,但最终不会在幕后进行

如果您经常这样做,它将成为一个很好的库函数。

(来自commons lang)

char[] spacesArray = new char[2000];
Arrays.fill(spacesArray, ' ');
String spaces = new String(spacesArray);

然而,我不确定这样的微优化是否应该以代码的成本进行,而代码需要5行注释来解释为什么需要这样做。如果你这样做了-请务必添加大量注释,否则请想象那些阅读你的代码的人的反应。

我在我的个人库中找到了一个随机函数:

public static String whiteSpace2(int l) {
    if (l==0) return "";
    String half=whiteSpace2(l/2);
    if ((l&1)!=0) {
        return half+" "+half;
    } else {
        return half+half;
    }
}
不声称这是生成空白的最快方法,但它是有效的:-)

如果没有其他方法有效:

StringBuilder sb = new StringBuilder();
for(int i = 0; i < 2000; ++i)
   sb.append(" ");
String str = new String(sb);
StringBuilder sb=新建StringBuilder();
对于(int i=0;i<2000;++i)
某人加上(“”);
String str=新字符串(sb);
您可以在insert语句中直接使用
lpad('',2000'')
,告诉Oracle创建所需的值

事实上,您可以将相关字段设置为默认值,这可以防止您需要在多个位置对其进行更改(如果您的代码显式发送null作为字段的值,这将覆盖默认值)。

最简单的答案是:(滚动查看所有代码)


请看另一个问题


Apache Commons StringUtils和Google Guava库都有对字符串进行乘法(重复)的命令。

在数据库的char(2000)字段中插入一个空格,然后将其选中。这真的保留了整个2000块吗?您使用的是哪种Oracle版本的XMLTYPE,如果是这样的话,XMLTYPE的存储条款是什么?Oracle 10g和我目前正在使用CLOB。这是解决传统问题的非常规解决方案。与其用伪值填充字段,处理此问题的首选方法是将表的PCTFREE设置为允许每行预期增长的级别。ya,我的函数对此有很好的文档记录reason@downvoter-你能解释一下否决票的原因吗?你不喜欢commons lang或我的注释?你可以使用StringBuilder来代替,以避免小的同步开销,您还可以使用目标大小初始化构建器,这样就不会发生重新定位。StringBuilder在Java 1.4中是不可用的,正如原始海报所要求的。您真的不应该像这样用
+
构建字符串。使用
StringBuilder
。不过,
O(logn)
这一步很好。刚刚修正了我的递归公式:F(N)=F(N/2)+N。是的,这是线性的,我错了。你知道,对于使用“l”作为变量名的开发人员来说,地狱里有一个特殊的地方。我相信tostring()的数量淹没了logn对N的讨论。是的,这是一个“笑话”在这方面,编写一个完全没有性能的关键实用程序函数是一种有点滑稽的方式:-)为什么不干脆
sb.toString()
+1我喜欢这个解决方案。如果我们在编译时知道字符串是什么,为什么不硬编码呢。(然而,可能另一个涉及数据库本身的解决方案更好。)我调整了这个解决方案,使它稍微好一点,并回答了Pascal的问题。在启用断言的情况下运行它。字符串s=。。。2000个空间;断言s.length()==2000:“常量字符串的长度错误。”;
String s = "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        "; // 2000 spaces