Java、reflectionCompare和String

Java、reflectionCompare和String,java,string,reflection,compareto,Java,String,Reflection,Compareto,我编写了一个Java类来练习反射。这是一个解决问题的简短版本: import org.apache.commons.lang3.builder.CompareToBuilder; public class StringExample { public StringExample(){ String[] persons = {"John","Paul","George","Ringo"}; Syste

我编写了一个Java类来练习反射。这是一个解决问题的简短版本:

import org.apache.commons.lang3.builder.CompareToBuilder;

public class StringExample {
public StringExample(){
    String[] persons = {"John","Paul","George","Ringo"};
    System.out.println("Person 1\tPerson2\t->\tString.compareTo\tReflection\t\tDifferent?\n");
    for (int i=0;i<persons.length;i++)
        for (int j=0;j<persons.length;j++) {

// Here the problem arises

            int sct = signum(persons[i].compareTo(persons[j])),
                    rct = signum(CompareToBuilder.reflectionCompare(persons[i], persons[j]));
            System.out.println(persons[i]+"\t:\t"+persons[j]+"\t->\t"+sct+"\t\t|\t"+rct+"\t\t->\t"+(sct==rct?"ok":"fault"));
        }
}

private int signum(int x) {
    if (x<0)
        return -1;
    if (x>0)
        return 1;
    return 0;
}

public static void main(String[] a){
    new StringExample();
}
}
import org.apache.commons.lang3.builder.CompareToBuilder;
公共类示例{
公共示例(){
String[]persons={“John”、“Paul”、“George”、“Ringo”};
System.out.println(“Person 1\tperson 2\t->\t字符串比较\t反射\t\t差异?\n”);
对于(int i=0;i String.compare)反射是否不同

约翰:约翰->0 | 0->好的

约翰:保罗->好的

约翰:乔治->错误

约翰:林戈->-1 |-1->好的

保罗:约翰->1 | 1->好的

保罗:保罗->0 | 0->好的

保罗:乔治->1 |-1->错误

保罗:林戈->-1 |-1->好的

乔治:约翰->-1 | 1->过错

乔治:保罗->-1 | 1->过错

乔治:乔治->0 | 0->好的

乔治:林戈->-1 | 1->故障

林戈:约翰->1 | 1->好的

林戈:保罗->1 | 1->好的

林戈:乔治->1 |-1->故障

Ringo:Ringo->0 | 0->ok

“fault”表示CompareToBuilder.reflectionCompare返回的符号与String自己的compareTo方法不同。我只在String中发现了这一点(既不是Integer,也不是int,也不是Double,也不是Double,也不是自己实现Comparable的类)


请帮助我:为什么会发生这种情况?

CompareToBuilder和字符串的问题是,在比较两个对象时,CompareToBuilder会反射性地考虑所有字段。除了包含字符串的字符数组外,字符串还会显式地在内部存储其大小。反射性比较会将此考虑在内也会导致这种奇怪的行为


事实上,您可以在调试器中看到所有Sting字段。Integer、Double等只将其值作为字段,因此,它在那里工作。

您能解释一下为什么需要此变通方法吗?如果不使用此变通方法会发生什么情况?是否有异常?如果是,消息和堆栈跟踪是什么?如果不是,问题是什么?请澄清一下y您还想做些什么?这个问题我不太清楚。可能您可以先展示一下您是如何使用
Integer
执行此操作的,然后使用
String
尝试相同的方法时会发生什么?