问一个字符串的问题,谢谢大家

yifuzhiming 2008-09-19 09:58:13
我有个字符串,需要放很多空格,比如
String str=new String(" ");

甚至比以上的还要多,总感觉不太好,请教大家有没有更好的办法放这些空格呢,谢谢
...全文
1011 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
wifewifewife 2009-11-02
  • 打赏
  • 举报
回复
mark...
yifuzhiming 2008-09-22
  • 打赏
  • 举报
回复
谢谢大家了,没想到一个小问题有这么多人关注
qianxf2008 2008-09-20
  • 打赏
  • 举报
回复
楼上太强了!!!
ZangXT 2008-09-20
  • 打赏
  • 举报
回复
楼上太强了,学习测试方法。
  • 打赏
  • 举报
回复
看来这个问题讨论的人挺多的,呵呵,做了个小实验以供进行性能比较:

                        性能测试报告
(单位:纳秒)
+-----------+---------------+---------------+---------------+
| | char[] | StringBuilder | StringBuffer |
+-----+-----+---------------+---------------+---------------+
| | C | 164934 | 217095 | 449021 |
| A +-----+---------------+---------------+---------------+
| | S | -- | 488630 | 670028 |
+-----+-----+---------------+---------------+---------------+
| | C | -- | 454022 | 616225 |
| B +-----+---------------+---------------+---------------+
| | S | -- | 703524 | 862583 |
+-----+-----+---------------+---------------+---------------+

A -- 对容量进行初始化
B -- 未对容量进行初始化
C -- 采用 char 空格填充
S -- 采用 String 空格填充



测试代码

循环 10000 次(用于对 JVM 进行预热)生成 10000 个字符长度的空格,求其平均数。
每种测试执行 5 次,取最小的输出时间。

public class Test {

public static void main(String[] args) {
long t0, t1;
String str = null;
final int COUNT = 10000;
t0 = System.nanoTime();
for(int i = 0; i < COUNT; i++) {
str = generateSpace(10000);
}
t1 = System.nanoTime();
System.out.println((t1 - t0) / (float)COUNT);
System.out.println(str.length());
}
}



char[] A-C 组代码
public static String generateSpace(int count) {
if(count < 0) {
throw new IllegalArgumentException("count must be greater than or equal 0.");
}
char[] chs = new char[count];
for(int i = 0; i < count; i++) {
chs[i] = ' ';
}
return new String(chs);
}



StringBuilder A-C 组代码
StringBuilder 与 StringBuffer 的代码一致,A 代码与 B 代码一致,
只是 A 对其容量进行了初始化,而 B 代码没有进行初始。

public static String generateSpace(int count) {
if(count < 0) {
throw new IllegalArgumentException("count must be greater than or equal 0.");
}
// A 组初始化时给定 count,B 组初始化时不给定 count
StringBuilder sb = new StringBuilder(count);
for(int i = 0; i < count; i++) {
sb.append(' '); // C 组使用字符空格,S 组使用字符串空格
}
return sb.toString();
}



结论

从上面的测试结果可以看出,使有不同的方法生成空格的效率有很大的差别,以 char[] 的
执行速度最快。

● StringBuilder 和 StringBuffer 两者由于同步的原因也有不小的差别。
● 由于生成的空格数量是已知的,对于 StringBuilder 和 StringBuffer 的影响是非常大的。
执行速度相差在 50% 以上。
● append 添加空格时,对于空格的选择也很有讲究。空格属于单字符,采用 char 类型和 String
执行速度相差也在 50% 以上。

对于生成固定长度空格的方法选择来说,使用 char[], StringBuffer, StringBuilder 哪一种,
如选择后两者,如果容量是已经知的我们得选择对其容量进行初始化,如果是单字符时应采用 char
进行 append。

当然了,对于 StringBuffer, StingBuilder 来说,算法还可以再进行优化,比如:添加 10000 个
长度的空格的话,可以先添加 100 个生成一个字符串,然后再添加 100 次这个字符串,这时的效率会
有大幅度地提升(经实验 StringBuilder A-C 测试时间为 186928,比原来 217095 提升了 13% 的
速度)。由于生成的空格数量是不定的,在倍数选择以及非整数倍时需要精心地进行处理。
酒浪子 2008-09-20
  • 打赏
  • 举报
回复
顶6楼的!
abc130314 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bao110908 的回复:]
用这个方法吧,这个要比用 StringBuffer 快一点

Java code
public class Test1 {

public static void main(String[] args) {
System.out.println("|" + generateSpace(5) + "|");
}

public static String generateSpace(int count) {
if(count < 0) {
throw new IllegalArgumentException("count must be great equal than 0.");
}
char[] chs = new cha…
[/Quote]
String(byte[] bytes)
liuzhengkang 2008-09-20
  • 打赏
  • 举报
回复
顶,6楼的
lwyx2000 2008-09-20
  • 打赏
  • 举报
回复
6楼提醒了我`
junjun1984 2008-09-19
  • 打赏
  • 举报
回复
楼上米看清人家的问题哦。你那是去头尾空格,人家要的是放空格。
henry_fuzr 2008-09-19
  • 打赏
  • 举报
回复
看错了。。。 郁闷

写一个比较多空格的String ,然后加起来 ,在加起来。
string str = new String(" ");
String a = new String ();
for(int i = 0 ; i<100;i++){
a += str;
}

看起来很可笑,不知道干什么啊。汗!!~~
henry_fuzr 2008-09-19
  • 打赏
  • 举报
回复
String.trim(str);

用这个函数,细节再看看API
jsjlw 2008-09-19
  • 打赏
  • 举报
回复

byte[] b = new byte[len];
System.arraycopy(str.getBytes(), 0, b, 0, str.getBytes().length);
return new String(b);
良言相告 2008-09-19
  • 打赏
  • 举报
回复
或者
final static String SPACES = " ";

想要几个,直接SPACES.subString().
pauliuyou 2008-09-19
  • 打赏
  • 举报
回复
写个类来处理
class SpaceString
{
int size;
String orgString = null;

public SpaceString(String org,int size)
{
if (org == null)
{
orgString = "";
}
else
{
orgString = org;
}
this.size = size;
}

public String toString()
{
StringBuffer sb = new StringBuffer(orgString);
for (int i = 0; i < size; i++)
{
sb.append(' ');
}
return sb.toString();
}
}
newtypebao 2008-09-19
  • 打赏
  • 举报
回复
用循环
想放几个就放几个
因为要不断的加
所以用StringBuffer
henry_fuzr 2008-09-19
  • 打赏
  • 举报
回复
支持6楼,没注意这个问题。
kwinerly 2008-09-19
  • 打赏
  • 举报
回复
思路都差不多哈~~呵呵 学习
ouyangxiaokang6 2008-09-19
  • 打赏
  • 举报
回复
使用StringBuffer循环插入,需要多少就添多少
  • 打赏
  • 举报
回复
用这个方法吧,这个要比用 StringBuffer 快一点

public class Test1 {  

public static void main(String[] args) {
System.out.println("|" + generateSpace(5) + "|");
}

public static String generateSpace(int count) {
if(count < 0) {
throw new IllegalArgumentException("count must be great equal than 0.");
}
char[] chs = new char[count];
for(int i = 0; i < count; i++) {
chs[i] = ' ';
}
return new String(chs);
}
}
加载更多回复(7)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧