Java 新字符串();在爪哇

Java 新字符串();在爪哇,java,string,assert,Java,String,Assert,我有一个assert语句来检查类中的equal方法。以下是两项声明 Assert.assertTrue(a.equals(new VideoObj(title, year, director))); Assert.assertTrue(a.equals(new VideoObj(new String(title), year, director))); 这两种说法有什么不同?为什么第二个assert语句有新字符串(title),有人能告诉我这样做的区别吗 另外,您能为我提供一个教程来学习为Ja

我有一个assert语句来检查类中的equal方法。以下是两项声明

Assert.assertTrue(a.equals(new VideoObj(title, year, director)));
Assert.assertTrue(a.equals(new VideoObj(new String(title), year, director)));
这两种说法有什么不同?为什么第二个assert语句有
新字符串(title)
,有人能告诉我这样做的区别吗

另外,您能为我提供一个教程来学习为Java编写测试类吗


谢谢

如果
title
不是
字符串
,那么第二条assert语句可能调用了不同的
VideoObj
构造函数。如果没有更多关于
title
VideoObj
类的信息,很难说得更多

对junit教程进行web搜索,以获取学习如何编写测试类的大量资源

EDIT从您对@BrianRoach答案的评论中,我推断您的
VideoObj.equals(Object)
方法实现如下:

public boolean equals(Object thatObject) {
    if (!(thatObject instanceof VideoObj)) return false;
    VideoObj that = (VideoObj) thatObject;
    return ((_title.equals(that.title()))
        || (_director.equals(that.director()))
        || (_year == that.year()));
}

如果这是正确的,那么问题在于
return
语句应该使用
&&
而不是
|
运算符。这可以解释为什么断言没有抱怨。

如果
title
不是
字符串
,那么第二个断言语句可能调用了不同的
VideoObj
构造函数。如果没有更多关于
title
VideoObj
类的信息,很难说得更多

对junit教程进行web搜索,以获取学习如何编写测试类的大量资源

EDIT从您对@BrianRoach答案的评论中,我推断您的
VideoObj.equals(Object)
方法实现如下:

public boolean equals(Object thatObject) {
    if (!(thatObject instanceof VideoObj)) return false;
    VideoObj that = (VideoObj) thatObject;
    return ((_title.equals(that.title()))
        || (_director.equals(that.director()))
        || (_year == that.year()));
}

如果这是正确的,那么问题在于
return
语句应该使用
&&
而不是
|
运算符。这可以解释为什么您的断言没有抱怨。

Java进行了一些优化。如果有两个值相同的字符串,则很可能是同一个对象。这是可以做到的,因为字符串是不可变的。但是,如果使用构造函数调用显式创建一个新字符串,则会创建一个新对象。

Java会进行一些优化。如果有两个值相同的字符串,则很可能是同一个对象。这是可以做到的,因为字符串是不可变的。但是,如果使用构造函数调用显式创建一个新字符串,则会创建一个新对象。

如果“title”是字符串,则这两条语句之间应该没有区别。

如果“title”是字符串,则这两条语句之间应该没有区别。

new String()显式创建一个新的字符串对象。 以及:

重用现有的字符串对象(根据
VideoObj
中的equals方法实现,可能会得到不同的结果),或者使用其他对象,如
byte[]
,因为有一个新字符串(byte[])的构造函数。当然还有很多其他的(参见JavaAPI)

…编辑 看看这个:

String s1=new String("abcxyz");
String s2=new String("abc"+"xyz");
String s3=s1+s2;
String s4="abcxyz";    // string literal will go to string pool
String s5="abc"+"xyz"; // string literal will go to string pool

System.out.println(s1==s2);
System.out.println(s2==s3);
System.out.println(s3==s4);
System.out.println(s4==s5); // TRUE (the rest are false)
System.out.println(s2==s4);
System.out.println(s2==s5);
System.out.println(s3==s1);
System.out.println(s3==s5);
new String()显式创建字符串的新对象。 以及:

重用现有的字符串对象(根据
VideoObj
中的equals方法实现,可能会得到不同的结果),或者使用其他对象,如
byte[]
,因为有一个新字符串(byte[])的构造函数。当然还有很多其他的(参见JavaAPI)

…编辑 看看这个:

String s1=new String("abcxyz");
String s2=new String("abc"+"xyz");
String s3=s1+s2;
String s4="abcxyz";    // string literal will go to string pool
String s5="abc"+"xyz"; // string literal will go to string pool

System.out.println(s1==s2);
System.out.println(s2==s3);
System.out.println(s3==s4);
System.out.println(s4==s5); // TRUE (the rest are false)
System.out.println(s2==s4);
System.out.println(s2==s5);
System.out.println(s3==s1);
System.out.println(s3==s5);
new String()语句使用原始字符串的内容创建一个新的字符串对象。这将提供两个字符串对象(原始对象和使用新字符串(originalString)语句新创建的对象),它们具有相同的内容,但是两个不同的Java对象。如果使用==运算符比较这两个对象,此比较将返回false,因为它是两个不同的对象。而与字符串的equals()方法的比较仍将返回true,因为这两个字符串中存储了相同的文本

因此,我假设测试中这个断言的目的是确保“a”的equals()方法确实使用标题字符串的equals()方法来检查相等性,而不仅仅是对两个标题字符串进行简单的==比较。如果没有该断言,a的equals()方法的这种无效实现可能不会被注意到,因为比较对象中的两个标题字符串可能是对同一字符串对象的引用,这也会在使用(错误的)==运算符测试它们的相等性时给出预期结果。

新字符串()语句使用原始字符串的内容创建一个新的字符串对象。这将提供两个字符串对象(原始对象和使用新字符串(originalString)语句新创建的对象),它们具有相同的内容,但是两个不同的Java对象。如果使用==运算符比较这两个对象,此比较将返回false,因为它是两个不同的对象。而与字符串的equals()方法的比较仍将返回true,因为这两个字符串中存储了相同的文本


因此,我假设测试中这个断言的目的是确保“a”的equals()方法确实使用标题字符串的equals()方法来检查相等性,而不仅仅是对两个标题字符串进行简单的==比较。如果没有该断言,a的equals()方法的这种无效实现可能会被忽略,因为比较对象中的两个标题字符串可能是对同一字符串对象的引用,这也会在使用(错误)时给出预期结果==运算符来测试它们是否相等。

标题可以是
字符串
字符串缓冲区
字符串生成器
字符[]
字节[]
。如果它是一个字符串,它将运行与另一个调用相同的构造函数,但在所有其他情况下,它可能运行完全不同的overloa
String a = "This is a string";
String b = "This is a string";
// a and b will both be the same reference
String c = new String("This is a string");
// c will *not* be the same reference