Java 用于大型循环每次迭代的临时变量,字符串是不可变的,那么我应该使用什么呢?
我有一个像这样的循环:Java 用于大型循环每次迭代的临时变量,字符串是不可变的,那么我应该使用什么呢?,java,Java,我有一个像这样的循环: String tmp; for(int x = 0; x < 1000000; x++) { // use temp temp = ""; // reset } 字符串tmp; 对于(int x=0;x
String tmp;
for(int x = 0; x < 1000000; x++) {
// use temp
temp = ""; // reset
}
字符串tmp;
对于(int x=0;x<1000000;x++){
//使用温度
temp=”“;//重置
}
此字符串最多可容纳10个字符
为这个用例创建变量最有效的方法是什么
我应该使用固定大小的数组吗?还是一个字符串缓冲区
我不想在不需要的时候创建一百万个变量,这对这个方法(性能)很重要
编辑
我简化了我的场景,实际上我需要这个变量位于类级别的作用域,因为有一些事件发生,即它不能在循环中声明。使用固定数组有什么问题?我想数组就可以了。这是我发现的类似问题 嗯,
stringbuffer
或StringBuilder
也可以。但是比stringBuffer快
如果它基于性能级别,我认为您可能需要检查提供更好性能的循环类型。您希望使用
tmp
(或temp
)做什么
老实说,如果以后不需要变量,我会尝试在循环中声明它们,并对其进行分析。由于编译器和Hotspot JVM中的优化和其他改进,许多过去用于帮助解决循环内性能问题的晦涩之处在最新版本的Java中不再需要了。为什么不简单地在循环内声明temp
:
for(int x = 0; x < 1000000; x++) {
String temp;
// use temp
}
for(int x=0;x<1000000;x++){
字符串温度;
//使用温度
}
您甚至可以获得非常(非常、非常)轻微的性能提升,因为您不必浪费时间将temp
的值重置为“
”。
关于您的更新,它仍然取决于您对
temp
所做的操作,但StringBuffer可能是最容易使用的。特别是如果你需要将一个Sting连接在一起,它会非常快。答案实际上取决于你在循环中如何使用temp
实例根据定义是不可变的。如果您的处理包括字符串操作,那么您不应该使用字符串,因为您最终将创建许多不必要的非常短暂的不可变实例。在这种情况下,请使用(或如果需要螺纹安全)
如果您只是在每次迭代中创建一个新字符串(或从外部源获取),并且使用它时没有任何创建新字符串对象的字符串操作,那么您可以使用字符串。请注意,每次迭代都创建一个新的字符串实例通常非常快,除非您的探查器明确指出这是一个问题,否则您不应该尝试过早地对此进行优化
另外,请注意,除非您在每次迭代中特别依赖于引用空字符串的temp
初始值,否则无需执行temp=“”
尝试此操作
公共类Robal{
public void looping()
{
for(int x = 0; x < 1000000; x++) {
String temp=x+"";
System.out.println(temp);
temp = ""; // reset
}
}
public void循环()
{
对于(int x=0;x<1000000;x++){
字符串温度=x+“”;
系统输出打印项次(温度);
temp=”“;//重置
}
}
好吧,如果您与以前的值有关,我想您不能只在循环中声明变量。@在循环开始并重置为之前立即声明所有的temp
“”
在上一次迭代中,所以我怀疑它的值是在循环之前设置的,还是在循环之后使用的。它必须在对象级别范围内,很抱歉没有这样说。对于每个循环,我只是设置值,然后一路上与它进行比较。现在我甚至可以使用枚举。@code完成如果可以使用枚举,我会试试看。比较枚举中的两个值要比比较两个字符串快得多。(在确定两个字符串是否相等之前,您必须比较两个字符串中的每个字符,而不是比较两个枚举常量的值。)