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

Java 如何比较实际字符串而不是比较备份数组?,java,arrays,string,Java,Arrays,String,Java中的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"));

Java中的
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"));
输出:

假的


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

    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
Kshitiz
equals()
后面有
\u0000
字符,因为这两个字符串不相同

如果您实际打印原始字符串,那么您将看到差异

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
}
O/p:

false
Kshitiz                                X

您可以看到这两个字符串是不同的

Java的字符串不是以null结尾的

如果从字节或字符缓冲区创建字符串,请使用允许指定长度的构造函数

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

您不应该创建不包含它们应该包含的内容的字符串。使用类似于
trim
的技巧处理坏对象是一种糟糕的做法

假设您无法修复给您错误大小的字符数组的API,只需在创建字符串之前对非空字符进行计数即可

    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);
char[]in=新字符[50];
in[0]=“K”;
在[1]中='s';
in[2]=‘h’;
在[3]=“i”;
在[4]=“t”;
在[5]=“i”;
在[6]中,='z';
整数长度=0;

while(很长一段时间内,您不应该这样做,但在将文本获取为char[]时需要这样做)从API中。有很多方法可以从字符创建字符串。如果要传递数组,至少应该使其大小正确。
char
数组就像
char
值一样,它们不方便,应该很少使用。如果API为7个字符的字符串返回一个50长的字符数组,那么API就严重错误*向上。为什么任何理智的API都会这样做?当获取char[]从API方法来看,将其设置为特定大小不在我的控制范围内。@没错。这就是我不编辑标题的原因。其他人按照同样的思路可能会发现这更有用,谷歌搜索类似的术语。不是空格的空字符,而是ASCII 0或null。这仅适用于这种情况。
trim()
是从其他地方获取char[]的方法。trim()也会从开头扔掉内容。从结尾扔掉空格和制表符。如果有人给你原始字节或字符,他们也会给你长度。或者让它以null结尾。然后你可以搜索0字节。