How do I compare strings in Java?
==
tests for reference equality (whether they are the same object).
.equals()
tests for value equality (whether they contain the same data).
Objects.equals() checks for null
before calling .equals()
so you don't have to (available as of JDK7, also available in Guava).
Consequently, if you want to test whether two strings have the same value you will probably want to use Objects.equals()
.
// These two have the same value
new String("test").equals("test") // --> true
// ... but they are not the same object
new String("test") == "test" // --> false
// ... neither are these
new String("test") == new String("test") // --> false
// ... but these are because literals are interned by
// the compiler and thus refer to the same object
"test" == "test" // --> true
// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true
// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true
You almost always want to use Objects.equals()
. In the rare situation where you know you're dealing with interned strings, you can use ==
.
From JLS 3.10.5. String Literals:
Moreover, a string literal always refers to the same instance of class
String
. This is because string literals - or, more generally, strings that are the values of constant expressions (§15.28) - are "interned" so as to share unique instances, using the methodString.intern
.
Similar examples can also be found in JLS 3.10.5-1.
Other Methods To Consider
String.equalsIgnoreCase() value equality that ignores case. Beware, however, that this method can have unexpected results in various locale-related cases, see this question.
String.contentEquals() compares the content of the String
with the content of any CharSequence
(available since Java 1.5). Saves you from having to turn your StringBuffer, etc into a String before doing the equality comparison, but leaves the null checking to you.
Compare two strings with '' and '' operators in JavaScript
As said above, the formal specification is in the standard: http://www.ecma-international.org/ecma-262/7.0/#sec-abstract-relational-comparison , in layman's terms the logic is like this:
1) String vs String
Split both strings into 16-bit code units and compare them numerically. Note that code units != characters, e.g. "cafè" < "cafè"
is true
(really).
2) String vs other primitive
Convert both to numbers. If one of them is NaN
, return false
, otherwise compare numerically. +0
and -0
are considered equal, +/-Infinity
is bigger/smaller than anything else.
3) String vs Object
Try to convert the object to a primitive, attempting, in order, [Symbol.toPrimitive]("number")
, valueOf
and toString
. If we've got string, proceed to 1), otherwise proceed to 2). For arrays specifically, this will invoke toString
which is the same as join
.
How to compare strings in an if statement?
You're looking for the function strcmp
, or strncmp
from string.h
.
Since strings are just arrays, you need to compare each character, so this function will do that for you:
if (strcmp(favoriteDairyProduct, "cheese") == 0)
{
printf("You like cheese too!");
}
else
{
printf("I like cheese more.");
}
Further reading: strcmp at cplusplus.com
Dart String Comparator
Yes, ==
is the way to test if two Strings are equal (contain exclusively the same sequence of characters). The last line of your code evaluates to true
.
String.equals versus ==
Use the string.equals(Object other)
function to compare strings, not the ==
operator.
The function checks the actual contents of the string, the ==
operator checks whether the references to the objects are equal. Note that string constants are usually "interned" such that two constants with the same value can actually be compared with ==
, but it's better not to rely on that.
if (usuario.equals(datos[0])) {
...
}
NB: the compare is done on 'usuario' because that's guaranteed non-null in your code, although you should still check that you've actually got some tokens in the datos
array otherwise you'll get an array-out-of-bounds exception.
Related Topics
Two Classes That Refer to Each Other
Efficient Multiply/Divide of Two 128-Bit Integers on X86 (No 64-Bit)
Skip Some Arguments in a C++ Function
Opencv on MAC Is Not Opening Usb Web Camera
How to Set Up Unit Testing for Visual Studio C++
Difference Between Std::Function<> and a Standard Function Pointer
How Copy from One Stringstream Object to Another in C++
Why Doesn't the C++11 'Auto' Keyword Work for Static Members
How to Link Google Protobuf Libraries via Cmake on Linux
Preferred Cmake Project Structure
Pointer Array and Sizeof Confusion
Using Bind1St for a Method That Takes Argument by Reference
Why Does Sizeof(Int) Vary Across Different Operating Systems