如何比较实际字符串而不是比较后备数组?

r9f1avp5  于 2021-07-13  发布在  Java
关注(0)|答案(4)|浏览(119)

String.equals() 方法比较两个字符串的后备数组。因此,如果数组的大小不同,则相同的字符串将不相等。
例子:

char[] in = new char[50];
in[0] = 'K';
in[1] = 's';
in[2] = 'h';
in[3] = 'i';
in[4] = 't';
in[5] = 'i';
in[6] = 'z';
String s = new String(in);
System.out.println(s.equals("Kshitiz"));

输出:

i1icjdpr

i1icjdpr1#

您不应该创建不包含它们应该包含的内容的字符串。使用类似于 trim 对付坏东西是一种坏习惯。
假设您无法修复api给您的字符数组太大,只需在创建字符串之前计算not null字符。

char[] in = new char[50];
    in[0] = 'K';
    in[1] = 's';
    in[2] = 'h';
    in[3] = 'i';
    in[4] = 't';
    in[5] = 'i';
    in[6] = 'z';
    int length = 0;
    while (length<in.length && in[length]!=(char)0) length++;
    String s = new String(in, 0, length);
1cosmwyk

1cosmwyk2#

equals() 退货 false 因为这两个字符串不一样。
如果您实际打印原始字符串,那么您将看到不同之处。

public static void main(String[] args) {
    char[] in = new char[50];
    in[0] = 'K';
    in[1] = 's';
    in[2] = 'h';
    in[3] = 'i';
    in[4] = 't';
    in[5] = 'i';
    in[6] = 'z';
    String s = new String(in);
    System.out.println(s.equals("Kshitiz"));
    System.out.println(s+ "X"); // new line
}

订单号:

false
Kshitiz                                X

你可以看到这两个字符串是不一样的。

cnh2zyt3

cnh2zyt33#

java的字符串不是以null结尾的。
如果从字节或字符缓冲区创建字符串,请使用允许指定长度的构造函数。

new String(bytes, 0, 7, "ASCII");
new String(characters, 0, 7);
4zcjmb1e

4zcjmb1e4#

我在你的代码中添加了一行代码来显示这里发生了什么。

char[] in = new char[50];
    in[0] = 'K';
    in[1] = 's';
    in[2] = 'h';
    in[3] = 'i';
    in[4] = 't';
    in[5] = 'i';
    in[6] = 'z';
    String s = new String(in);
    System.out.println(s.equals("Kshitiz"));
    //just use following
    System.out.println(s);

现在运行这个代码。你可以看到 s\u0000 恰尔就在后面 Kshitiz

相关问题