Java ArrayList问题(涉及valueOf())

Java ArrayList问题(涉及valueOf()),java,Java,我有一个函数,combinations,它将字符串的所有排列添加到arraylist中 public static void combinations(String prefix, String s, ArrayList PermAttr) { if (s.length() > 0) { PermAttr.add(prefix + s.valueOf(s.charAt(0))); combinations(prefix +

我有一个函数,combinations,它将字符串的所有排列添加到arraylist中

 public static void combinations(String prefix, String s, ArrayList PermAttr) {
        if (s.length() > 0) {
            PermAttr.add(prefix + s.valueOf(s.charAt(0)));
            combinations(prefix + s.valueOf(s.charAt(0)), s.substring(1), PermAttr);
            combinations(prefix,               s.substring(1), PermAttr);
        }
 }  
现在,我有一个数组列表tryCK,让我们说是{“A”,“B”}

我有另一个数组列表CK,也是{“A”,“B”},但它是从上面的组合函数派生的

当我做tryCK.equals(CK)时,它返回true

但是当我把它通过另一个函数时,我在tryCK和CK上都有,对于tryCK,它返回true,CK返回false,即使它们是完全相同的列表

所以,我的问题是,使用.valueOf(s.charAt())会改变一些内部类型吗


这很难解释,但我不想发布完整的代码。

第一个问题:您使用的是
String.valueOf
,就好像它是一个实例方法,而实际上是一个静态方法。这导致了非常误导的代码

第二个问题:您没有一致的命名约定。参数通常应采用驼峰式-命名参数
PermAttr
会导致方法调用,例如:

PermAttr.add(prefix + s.valueOf(s.charAt(0)));
这看起来像一个名为
PermAttr
的类中的静态方法调用

第三个问题:您无缘无故地使用了
String.valueOf
——您已经在使用字符串连接,所以只使用了:

prefix + s.charAt(0)
好的

这些人实际上都不对任何错误负责(如果没有一个简短但完整的示例来演示问题,我们很难判断),但他们使代码更难理解


我建议您解决上述问题,并将其放在一个简短但完整的程序中,该程序确实演示了问题。然后,找出错误应该相当容易。

第一个问题:您使用的是
String.valueOf
,就像它是一个实例方法一样,而实际上它是一个静态方法。这导致了非常误导的代码

第二个问题:您没有一致的命名约定。参数通常应采用驼峰式-命名参数
PermAttr
会导致方法调用,例如:

PermAttr.add(prefix + s.valueOf(s.charAt(0)));
这看起来像一个名为
PermAttr
的类中的静态方法调用

第三个问题:您无缘无故地使用了
String.valueOf
——您已经在使用字符串连接,所以只使用了:

prefix + s.charAt(0)
好的

这些人实际上都不对任何错误负责(如果没有一个简短但完整的示例来演示问题,我们很难判断),但他们使代码更难理解


我建议您解决上述问题,并将其放在一个简短但完整的程序中,该程序确实演示了问题。然后,找出错误应该是相当容易的。

首先,您甚至不需要使用valueOf,因为通常情况下,Java只需将字符与字符串结尾进行关联即可

 PermAttr.add(prefix + s.charAt(0));
其次,如果要使用valueOf,至少要从类String中引用它,而不是从String对象的实例中引用它

PermAttr.add(prefix + String.valueOf(s.charAt(0)));
第三,更好的命名约定会有所帮助:

permAttr.add(prefix + s.valueOf(s.charAt(0)));
第四,有很多方法可以检查ArrayList的内容,请尝试确保它们实际上包含相同的值,而不是假设它们包含相同的值:

for(String s : CK)
 System.out.println(s);
第五,您总结为“那么,我的问题是,使用.valueOf(s.charAt())是否会改变某些内部类型?”答案是:

valueOf(s.charAt(int))将返回字符串对象。如果您没有预料到字符串,那么是的,这会更改对象的类型。此字符串通常与所有其他字符串一起工作(如您正在使用的字符串),并且应该执行字符串可以执行的任何操作。因此,如果您希望使用字符串类型,那么不,它不会更改任何类型

第六,确保您正在比较字符串以使用equals()方法

不要使用:

if(s1 == s2)
这将检查引用是否在内存中的相同位置

使用

这将检查字符串的值是否相同


我想我只有这些了。祝你好运

首先,您甚至不需要使用valueOf,因为通常情况下,Java只需将字符合并到字符串末尾即可

 PermAttr.add(prefix + s.charAt(0));
其次,如果要使用valueOf,至少要从类String中引用它,而不是从String对象的实例中引用它

PermAttr.add(prefix + String.valueOf(s.charAt(0)));
第三,更好的命名约定会有所帮助:

permAttr.add(prefix + s.valueOf(s.charAt(0)));
第四,有很多方法可以检查ArrayList的内容,请尝试确保它们实际上包含相同的值,而不是假设它们包含相同的值:

for(String s : CK)
 System.out.println(s);
第五,您总结为“那么,我的问题是,使用.valueOf(s.charAt())是否会改变某些内部类型?”答案是:

valueOf(s.charAt(int))将返回字符串对象。如果您没有预料到字符串,那么是的,这会更改对象的类型。此字符串通常与所有其他字符串一起工作(如您正在使用的字符串),并且应该执行字符串可以执行的任何操作。因此,如果您希望使用字符串类型,那么不,它不会更改任何类型

第六,确保您正在比较字符串以使用equals()方法

不要使用:

if(s1 == s2)
这将检查引用是否在内存中的相同位置

使用

这将检查字符串的值是否相同

我想我只有这些了。祝你好运