当前位置: 首页 > 面试题库 >

equal()和equalsIgnoreCase()对于相等的字符串返回false

师谦
2023-03-14
问题内容

我正在Mac上使用Eclipse IDE(版本:3.4.2),但遇到了以下问题。

使用equal()或equalsIgnoreCase()方法在字符串之间进行比较时,即使字符串相等,我也会收到false。例如,即使values [0]
=“ debug_mode”,以下代码也将以下条件视为false:

if (values[0].equalsIgnoreCase("debug_mode")) 
    debug_mode = true;

这是以下循环的一部分:

String value = dis.readLine();
String values[] = value.trim().split("=");
if (values.length >= 2)
{
    Config.prnt_dbg_msg(values[0] + "\t" + values[1]);
    if (values[0].equalsIgnoreCase("debug_mode")) 
        debug_mode = isTrue(values[1]);
    if (values[0].equalsIgnoreCase("debug_query_parsing")) 
        debug_query_parsing = isTrue(values[1]);
    if (values[0].equalsIgnoreCase("username")) 
        Connection_Manager.alterAccessParameters(values[1], null, null);
    if (values[0].equalsIgnoreCase("password")) 
        Connection_Manager.alterAccessParameters(null, values[1], null);
if (values[0].equalsIgnoreCase("database")) 
        Connection_Manager.alterAccessParameters(null, null, values[1]);
    if (values[0].equalsIgnoreCase("allow_duplicate_entries")) 
        allow_duplicate_entries = isTrue(values[1]);
}

我尝试使用value[0].equal("debug_mode")并获得了相同的结果。有人知道为什么吗?


问题答案:

确实那将是非常奇怪的:)您可以将上面的代码更改为此:

if ("debug_mode".equalsIgnoreCase("debug_mode")) 
    debug_mode = true;

确认它工作正常,然后再次检查为什么您values[0]不是“ debug_mode”。

这就是我现在要检查的事情清单:

  • 检查一下 values[0].length() == "debug_mode".length()
  • 我非常怀疑,但是无论如何我还是要把它放在桌子上-您是否有机会使用Unicode?
  • 您可以打印每个字符并.equals()在该字符和“ debug_mode”字符串的各个字符之间执行操作吗?
  • 如果这是在较大的项目中,则您可以在一个简单的Java项目中执行相同的操作并确认它可以在其中工作吗?

为了澄清,问题实际上是在使用DataInputStream.readLine。从javadoc(http://download.oracle.com/javase/1.6.0/docs/api/java/io/DataInputStream.html):

readLine()
      Deprecated. This method does not properly convert bytes to characters. ...

它实际上以一种微妙的方式与Unicode有关-当writeChar您实际编写两个字节0以及97字母的大端Unicode时a

这是一个独立的片段,显示了行为:

import java.io.*;
import java.util.*;

public class B {
  public static void main(String[] args) throws Exception {
    String os = "abc";

    System.out.println("---- unicode, big-endian");
    for(byte b: os.getBytes("UTF-16BE")) {
      System.out.println(b);
    }

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream dos = new DataOutputStream(baos);

    for(char c: os.toCharArray()) {
      dos.writeChar(c);
    }

    byte[] ba = baos.toByteArray();

    System.out.println("---- ba");
    for(byte b: ba) {
      System.out.println(b);
    }

    ByteArrayInputStream bais = new ByteArrayInputStream(ba);
    DataInputStream dis = new DataInputStream(bais);

    System.out.println("---- dis");
    String s = dis.readLine();
    System.out.println(s);
    System.out.println("String length is " + s.length() 
      + ", but you would expect " + os.length() 
      + ", as that is what you see printed...");
  }
}

故事的寓意-不要使用不推荐使用的API
…而且,空格是无声的杀手:http : //www.codinghorror.com/blog/2009/11/whitespace-the-
silent-killer.html



 类似资料:
  • 标题说明了一切。我的问题是关于不同的字符串等价方法的效率。我经常使用<代码>。equalsIgnoreCase(String str),因为我对它很有兴趣。但我开始怀疑这是否是寻找字符串之间等价性的最有效方法。在我看来,正在调用一种大小写转换方法或,然后在其定义中调用,但我可能错了。那么,以下哪种方法在以下情况或任何情况下更有效?

  • 我正在解析一个文件,其中有城市名和到其他城市的距离,格式如下: 我认为问题在于,当我分割字符串时,它创建了不同的对象,并且由于某种原因,string.equals和/或hashcode()给出了不同的结果。因此,map.get(key)返回空值。但我不知道如何解决这个问题。 }

  • 我正在制作一个应用程序,如果用户已经登录,我希望应用程序自动从文本文件登录。目前,在文本文件中,我有与数据库条目匹配的“alex|ppp”。以下方法首先调用 我已经仔细检查了user和Pass的值,它们是“alex”和“ppp”,这是预期的。下一个初始文件被调用,这是相关代码: 一旦我调用db.tryLogin()就会出现问题,它看起来像这样 我已经检查过了,dbPass从数据库返回的“ppp”与

  • 问题内容: 我试图理解字符串比较与字符串比较的输出。需要明确的是,我拥有使用==和equals比较两个字符串的类。我试图将==和equals()的输出合并为字符串。equals()的输出会连续显示,但==的输出不会 连续显示。使用Java的装箱功能,将与字符串连接的布尔值联系起来。equals和==都返回布尔值。那么为什么会有这种差异呢?有人可以解释吗? 输出 更新:答案 如果不使用s1 == s

  • 问题内容: String[] letters = {“A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “L”}; 为什么是 Fk呀! 输入AL字母之一绝对不会发生? 问题答案: 字符串是对象。所述通过引用,而不是由它们的内部值进行比较的对象。 有两种解决方案: 使用method来比较两个对象的值。 使用代替。这是原始的,因此可以使用。

  • 本文向大家介绍如何返回表示等效Date对象来源的字符串?,包括了如何返回表示等效Date对象来源的字符串?的使用技巧和注意事项,需要的朋友参考一下 要返回表示等效Date对象来源的字符串,请使用JavaScript方法。此方法返回一个表示对象源代码的字符串。 示例 您可以尝试运行以下代码以返回表示等效Date对象来源的字符串-