一个好的方法创建1MB的字符串是什么?

8
我想创建一个1MB的字符串以进行基准测试,所以我写了以下代码:

public final static long KB     = 1024;
public final static long MB     = 1024 * KB;
public static void main(String[] args){
    String text_1MB=createString(1*MB);
}
static String createString(long size){
    StringBuffer o=new StringBuffer();
    for(int i=0;i<size;i++){
        o.append("f");
    }
    return o.toString();
}

我认为这个createString方法不太好且愚蠢。

有什么优化createString方法的想法吗?


请注意,该字符串的大小为2 MiB。 - Joey
嗨@Joey,"2 MiB in size"是什么意思? - Koerr
1
这是一个由1048576个字符组成的字符串,每个字符都是UTF-16代码单元。因此,您的字符串不是1 MiB而是2 MiB。 - Joey
7个回答

18

那么这样怎么样:

char[] chars = new char[size];
// Optional step - unnecessary if you're happy with the array being full of \0
Arrays.fill(chars, 'f');
return new String(chars);

2
我认为使用Arrays类很聪明,因为它只调用一次方法,而另一个类的Append方法必须调用多次。 - The Original Android

10

你可以简单地创建一个大字符数组。

char[] data = new char[1000000];

如果您需要创建一个真正的 String 对象,您可以:

String str = new String(data);

OP在循环中已经没有使用+=了 - 问题中的代码使用了StringBuffer。 - Jon Skeet

4
char[] s = new char[1024 * 1000];
String str = String.copyValueOf(s);

2
创建一个字符数组并使用 new String(char[]) 构造函数。

0
使用 StringBuilder 并设置容量:
static String createString(long size){
    StringBuilder o=new StringBuilder(size);
    for(int i=0;i<size;i++){
        o.append("f");
    }
    return o.toString();
}

0
new String(ByteBuffer.allocate(1024).array());

分配一个1024字节的ByteBuffer,然后用其支持数组构造新的String。


0

使用类StringBuilder而不是StringBuffer怎么样?StringBuilder应该更快,因为它不像StringBuffer一样需要同步。

也许您可以通过设置编译器标志来增加堆内存和虚拟内存的大小来提高性能。这肯定不会有坏处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接