Java 新字符串();在爪哇
我有一个assert语句来检查类中的equal方法。以下是两项声明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.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