Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

String equality check by only reference

Tags:

java

string

As we know if we do a check like below the output will be equal.

String s1 = "stackoverflow";
String s2 = "stackoverflow";
if(s1==s2){
    System.out.println("equal");
}

So my question is if i am not using new operator in my application to create String and all are strings are literals so can i use only reference equality as given above? Thanks in advance.

N.B: i am writing a crawler so i need to check whether i have already visited the given url that i am currently holding. I am using murmur hash which gives me a long for every url but there are collision so i need to check for the content if the url string if there is a hash collision. Hence for performance i am thinking of just comparing the reference equality of two string urls. And i am using jsoup for html parsing.

like image 625
Trying Avatar asked Jan 11 '23 14:01

Trying


1 Answers

if i am not using new operator in my application to create String and all are strings are literals so can i use only reference equality as given above?

If you are 100% sure that all the strings you are dealing with are plain string literals or compile-time constant expressions then yes. The Java Language Specification §15.28 mandates that

Compile-time constant expressions of type String are always "interned" so as to share unique instances, using the method String.intern.

But if you get strings from anywhere else (e.g. reading them from a web page retrieved by your crawler, or building them using concatenation expressions that are not compile-time constants) then you must use .equals to compare them by value rather than by reference or .intern() them explicitly.

It's not always obvious whether an expression is a compile-time constant or not:

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

but

final String s1 = "Stack";
String s2 = s1 + "Overflow"; // _is_ a CTC, because s1 is a "constant variable"
                             // (final, with an initializer that is itself a CTC)
like image 72
Ian Roberts Avatar answered Jan 18 '23 23:01

Ian Roberts