Java:字符串文字的行为与字符串变量不同(不能来自内部)

Java:字符串文字的行为与字符串变量不同(不能来自内部),java,string,string-literals,Java,String,String Literals,我有以下代码: public RecordList searchDatabase(String key, String value) { String newKey; newKey = key; // no results //newKey = "name_of_person"; // finds results //newKey = new String("name"); // no results //newKey = new String(key)

我有以下代码:

public RecordList searchDatabase(String key, String value)
{
    String newKey;

    newKey = key; // no results
    //newKey = "name_of_person"; // finds results
    //newKey = new String("name"); // no results
    //newKey = new String(key); // no results
    //newKey = new String(key.getBytes().clone()); // no results

    System.out.println(newKey.equals("name_of_person"));

    return database.search(newKey, value);
}
它应该用一个键和一个值搜索一个数据库,但什么也找不到。但是,如果我在第一个注释行中将键更改为字符串文字,它会找到正确的结果。我尝试了一些其他的事情,其他的评论行,但没有起作用。println总是打印为真

我搜索了类似的问题,似乎实习是字符串比较问题的常见原因。但在本例中,唯一有效的情况是当我传递一个字符串文本时,因此如果存在内部调用问题,那么数据库必须在其源代码中将该字段作为字符串文本。 我进行了搜索,但在源代码的其他地方并没有显示\u person的字面名称\u,它是从JSON动态创建的


如果有问题,database.search函数是.createJoinQuery,问题在于它的第二个参数toField。

有两种合理的解释:

数据库对象的类的搜索方法是使用==将关键参数与名称\u of_person进行比较,而不是使用equals。 键值具有尾随空格字符,如尾随空格 试试这个:

key = key.trim();

数据库搜索功能不会因为实习而中断-据我所知,字符串上唯一对引用敏感的操作是检查标识,而不是相等==vs.equals。我想我对数据库对象的功能很好奇。我个人认为key是表的字符串值。。。如果数据库对象是大数据存储。。。然后是边的值。似乎值name of_person是表列、表、节点或边的名称。我假设要执行的查找名为person。这是一个错误的假设吗?我不确定我是否理解你的假设。实际的数据库是Lucene,它有一个所谓文档的集合,每个文档都有一个键值对的集合,database.searchname\u of_person,Bill应该返回包含\u person,Bill的键值对名称的所有文档。这有帮助吗?确定您没有简化并且实际工作是newKey=Constants.NAME\u OF_PERSON;-一些输入常数?这些可能会过时。调试似乎是唯一的方法。我搜索了数据库的源代码,但那里没有显示\u person的名称。它可以是其他文本的串联。只要编译器能够确定一个字符串值,它就会被截取。调试这个应用程序,你会发现问题的。我想这在理论上是可能的,但没有意义。数据库与字段名无关-您可以使用任何可以想到的名称创建字段。因此,在源代码中硬编码字段名是没有意义的。无论如何,我只是尝试将\u person的名称\u更改为foryubslfhsdaf,同样的问题仍然发生。我非常确定数据库不包含等于foryubslfhsdaf的编译器可确定字符串值。编辑:我在我的代码中做了更改,并且没有重新编译数据库,所以更改不可能影响数据库的编译。我想不出你为什么会看到你所看到的,除非你的键中有一些空白字符,比如尾随空格。参见编辑