Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅通过引用进行字符串相等性检查_Java_String - Fatal编程技术网

Java 仅通过引用进行字符串相等性检查

Java 仅通过引用进行字符串相等性检查,java,string,Java,String,正如我们所知道的,如果我们进行如下检查,输出将是相等的 String s1 = "stackoverflow"; String s2 = "stackoverflow"; if(s1==s2){ System.out.println("equal"); } 所以我的问题是,如果我在应用程序中没有使用new操作符来创建String,并且所有的字符串都是文本,那么我可以只使用上面给出的引用等式吗?提前谢谢 N.B:我正在编写一个爬虫程序,因此我需要检查我是否已经访问了当前持有的给定url。

正如我们所知道的,如果我们进行如下检查,输出将是
相等的

String s1 = "stackoverflow";
String s2 = "stackoverflow";
if(s1==s2){
    System.out.println("equal");
}
所以我的问题是,如果我在应用程序中没有使用
new
操作符来创建
String
,并且所有的字符串都是文本,那么我可以只使用上面给出的引用等式吗?提前谢谢

N.B:我正在编写一个爬虫程序,因此我需要检查我是否已经访问了当前持有的给定url。我正在使用它,它为每个url提供了一个
long
,但存在冲突,因此如果url字符串存在哈希冲突,我需要检查内容。因此,为了提高性能,我只考虑比较两个字符串URL的引用相等性。我正在使用
jsoup
进行html解析

如果我没有在应用程序中使用
new
运算符来创建
String
,并且所有的字符串都是文本,那么我可以只使用上面给出的引用等式吗

如果您100%确定所处理的所有字符串都是纯字符串文字或编译时常量表达式,则是。授权

String类型的编译时常量表达式总是“interned”,以便使用
String.intern
方法共享唯一实例

但如果您从其他任何地方获取字符串(例如,从爬虫程序检索的网页读取字符串,或使用非编译时常量的串联表达式构建字符串),则必须使用
.equals
通过值而不是引用或
.intern()
显式比较字符串

表达式是否为编译时常量并不总是很明显:

String s1 = "Stack";
String s2 = s1 + "Overflow"; // not a CTC
但是


不,你不能。VM不保证所描述的行为,它是一种优化。为了保证这种行为,您需要调用String#intern()

只有这样才能保证引用的平等性

但是做一个性能测试,字符串#equals()可能更快:-)

所以我的问题是,如果我在我的应用程序中没有使用new操作符来创建字符串,并且所有的字符串都是文本,那么我可以只使用上面给出的引用等式吗

是的,当然。因为它们是在编译时解决的,所以没有问题

但请记住以下情况

       String s3= s2;
       String s4= s1+"";   //resolved at run time 
      System.out.println(s3==s4);  //false
      System.out.println(s3.equals(s4));//true

因此,除非您确定以后不会更改字符串,否则您可以安全地使用==。

如果您正在编写递归爬虫程序,那么并非所有字符串都是文本。但是,看看interning。如果每个字符串都是一个文本,并且您没有对其执行任何操作(子字符串、使用未知变量连接等),那么您应该能够只使用
==
,是的。请参考。你能提供一个源代码来详细说明为什么编译时已知的字符串不能保证被保留吗?我可能没有正确地阅读这个问题。我的错。其他答案更精确。
s1+”
这也是字符串文字。请检查您的答案。@如果
s1
final
,则尝试该表达式只是一个编译时常量(因此保证是插入的)。@尝试是。对。但s4在运行时释放了该值。@IanRoberts我是这么说的,但OP提到它的方式是错误的。@尝试您的示例完全是另一种情况-两个字符串文本的串联是编译时常量表达式,但一个文本和一个(非常量)变量的串联不是。
       String s3= s2;
       String s4= s1+"";   //resolved at run time 
      System.out.println(s3==s4);  //false
      System.out.println(s3.equals(s4));//true