诡异的字符串问题

theoffspring 2012-02-14 05:14:01
看了http://www.blogjava.net/nokiaguy/archive/2008/05/10/199647.html这个帖子,我模拟着也做了一个,但怎么也不对。如下:


public void list2(String usedIndex, String result) {
for (int idx = 0; idx < arr.length; idx++) {
if (usedIndex.indexOf(idx + 48) > -1) continue;
result = result + String.valueOf(arr[idx]);

if (result.length() == arr.length) {
if (isValid(result)) {
System.out.println(result);
lastResult = result;
cnt++;
}

break;
}

String newUsedIndex = usedIndex + String.valueOf(idx);
list2(newUsedIndex, result);

}

}

只能打印出:123345
如果不修改result,另外定义一个字符串变量str来保存临时结果,如下,则没有问题:
public void list(String usedIndex, String result) {
for (int idx = 0; idx < arr.length; idx++) {
if (usedIndex.indexOf(idx + 48) > -1) continue;
String str = result + String.valueOf(arr[idx]);


if (str.length() == arr.length) {
if (isValid(str)) {
System.out.println(str);
lastResult = str;
cnt++;
}

break;
}

String newUsedIndex = usedIndex + String.valueOf(idx);
list(newUsedIndex, str);

}

}


完整如下:


package align;

public class Test2 {
private String lastResult = "";
public int cnt;
private int arr[];

public Test2(int[] arr) {
this.arr = arr;
}

private boolean isValid(String s) {
if (s.compareTo(lastResult) <= 0)
return false;
if (s.indexOf("4") == 2)
return false;
if (s.indexOf("35") >= 0 || s.indexOf("53") >= 0)
return false;
return true;
}

public void list(String usedIndex, String result) {
for (int idx = 0; idx < arr.length; idx++) {
if (usedIndex.indexOf(idx + 48) > -1) continue;
String str = result + String.valueOf(arr[idx]);


if (str.length() == arr.length) {
if (isValid(str)) {
System.out.println(str);
lastResult = str;
cnt++;
}

break;
}

String newUsedIndex = usedIndex + String.valueOf(idx);
list(newUsedIndex, str);

}

}

public void list2(String usedIndex, String result) {
for (int idx = 0; idx < arr.length; idx++) {
if (usedIndex.indexOf(idx + 48) > -1) continue;
result = result + String.valueOf(arr[idx]);

if (result.length() == arr.length) {
if (isValid(result)) {
System.out.println(result);
lastResult = result;
cnt++;
}

break;
}

String newUsedIndex = usedIndex + String.valueOf(idx);
list2(newUsedIndex, result);

}

}

public static void main(String[] args) {
int[] arr =
{1, 2, 3, 3, 4, 5};
// {1, 2};
Test2 test2 = new Test2(arr);
test2.list2("", "");
System.out.println("count: " + test2.cnt);
}
}


list(正确的)和list2(不正确的)唯一的区别就在于是否定义一个新字符串来保存临时的结果,但为什么list2不对呢,百思不得其解。
...全文
129 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
theoffspring 2012-02-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 abstruct 的回复:]

原因是这样的,result就是一个引用,你可以看做他是内存里面的一个地址。那么当你把result放入list当中的时候,其实是指向了这个地址,然后你就在不停的修改result的内存指向,你觉得list里面会有多个对象吗?好比:你手上拿着一个苹果,然后你又想要个梨子,但是你只能用一只手拿一个,那么你只有把苹果丢下去拿个梨子,无论你怎么换,你到最后只有你最后拿上来的东西。
[/Quote]
String是不可变的,如果重新赋值,是重新指向了一个新的字符串对象的,不存在引用的问题。
安特矮油 2012-02-15
  • 打赏
  • 举报
回复
原因是这样的,result就是一个引用,你可以看做他是内存里面的一个地址。那么当你把result放入list当中的时候,其实是指向了这个地址,然后你就在不停的修改result的内存指向,你觉得list里面会有多个对象吗?好比:你手上拿着一个苹果,然后你又想要个梨子,但是你只能用一只手拿一个,那么你只有把苹果丢下去拿个梨子,无论你怎么换,你到最后只有你最后拿上来的东西。
zhuyouyong 2012-02-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zyus1987 的回复:]

“list(正确的)和list2(不正确的)”
list2('XX','XX')中result是形参,而且是简单变量,所以每次被调用的时候都是新new一个!具体在分析吧
[/Quote]帮顶
theoffspring 2012-02-14
  • 打赏
  • 举报
回复
LS的,我知道是这么回事,所以才不解啊。
zyus1987 2012-02-14
  • 打赏
  • 举报
回复
“list(正确的)和list2(不正确的)”
list2('XX','XX')中result是形参,而且是简单变量,所以每次被调用的时候都是新new一个!具体在分析吧

62,614

社区成员

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

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