Some months ago, I remember being in an interview and being asked for three different ways to compare strings in Java for their values. Out of curiosity, I'm going to ask it here for my own reference. I thought of two:
str1.equals(str2) or using compareTo, both counting as one in total
comparing character by character
Any idea? "==", equalsTo, compareTo, and any variations of them are not it I was told.
Edit: Fixed question a bit.
Since there was such a huge objection to using == I couldn't resist the temptation of posting an answer that does use it (and which is perfectly valid!) :)))
String s1 = new String("abc"); // create string object 1
String s2 = new String("abc"); // create a different string object 2
s1 = s1.intern();
s2 = s2.intern();
System.out.println(s1 == s2); // true!
So if we make sure to intern the strings we can count on ==.
Other than that, as I suggested in the comments above:
it sounds like the interviewer was looking for a "wiseass" solution, for example:
s1.contains(s2) && s2.contains(s1)
or
s1.matches(s2) && s2.matches(s1)
or
s1.replace(s2, "").isEmpty() && s2.replace(s1, "").isEmpty()
and etc.
I can think of a few of ways besides looking at each character yourself or using equals() or compareTo():
s1.startsWith(s2) && s2.startsWith(s1)
s1.contains(s2) && s2.contains(s1)
s1.indexOf(s2) == 0 && s2.indexOf(s1) == 0
Arrays.equals(s1.toCharArray(), s2.toCharArray())
s1.intern() == s2.intern()
To be frank, though, I don't really see the value of this as an interview question. (If the interviewer had the last one in mind, a better question in my opinion would be to identify all the cases when it was safe to use == to compare string values.)
I am guessing
1) using '==' operator' which compare strings reference
2) equals() method of String which compare exact string content
3) equalsIgnoreCase() method which compare string content in case incensitive manner
If I eliminate the ones that take into account casing, there are still plenty of ways, and I'm sure I'm missing some:
s1.equals(s2)
s1.compareTo(s2)
s1.contentEquals(s2)
Objects.equals(s1, s2)
Objects.deepEquals(s1, s2)
EDIT
Technically, this is also a way, but I think it's bad practice:
s1.intern() == s2.intern()
Some other options may be (look here for details)-
1. String comparison using equals method
2. String comparison using equalsIgnoreCase method
3. String comparison using compareTo method
4. String comparison using compareToIgnoreCase method
There are four ways:
==
.equals()
compareTo()
compare()
Read more
Related
This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
If statement using == gives unexpected result
Hi I'm using this code to add elements to my ComboBox, and I do not want to add empty elements, here's the code:
public void elrendezesBetoltes(ArrayList<Elrendezes> ElrLista){
int i;
Elrendezes tmp;
model.removeAllElements();
model = new DefaultComboBoxModel(comboBoxItems);
for(i=0; i<ElrLista.size(); i++){
tmp = ElrLista.get(i);
if(tmp.getName()!="")comboBoxItems.add(tmp.getName()); //not working
addButton2(tmp.getSeatnum(),tmp.getCoord(),tmp.getFoglalt());
}
}
My problem is that the if statement is not working, it still adds empty names to my combobox. What am I doing wrong?
Always use equals method to compare Strings: -
if (tmp.getName()!="")
should be: -
if (!tmp.getName().equals(""))
or simply use this, if you want to check for empty string: -
if (!tmp.getName().isEmpty()) {
comboBoxItems.add(tmp.getName());
}
Use equals method to compare string. By using != operator, you are comparing the string instances, which is always going the be true as they(tmp.getName() and "") are not same string instances.
Change
tmp.getName()!=""
to
!"".equals(tmp.getName())
Putting "" as first string in comparison will take care of your null scenario as well i.e. it will not break if tmp.getName() is null.
Use equals():
if (!tmp.getName().equals(""))
Using == or != compares string references, not string contents. This is almost never what you want.
you have to compare Strings with "equals", then it will work
if(!tmp.getName().equals(""))comboBoxItems.add(tmp.getName())
you are comparing for identity (==, !=) but each String instance has its own identity, even when they are equal.
So you need to do !tmp.getName().equals("").
Generally it is considered best practice to start with the constant string first, because it will never be null: !"".equals(tmp.getName())
However, I would recommend to use apache commons lang StringUtils. It has a notEmpty() and notBlank() method that take care of null handling and also trimming.
PS: sometimes identity will work for Strings. but it should not be relied upon as it is caused by compiler or jvm optimization due to String immutability.
Use String#isEmpty()
if(!tmp.getName().isEmpty())
OR:
if(!tmp.getName().equals(""))
Always, check String equality with equals method. == operator only checks if two references point to the same String object.
Another alternative if not on Java 6 and isEmpty is unavailable is this:
if (tmp.getName.length()>0)
Checking for the length is supposed to be quicker than using .equals although tbh the potential gain is so small its not worth worrying too much about.
This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
Java String.equals versus ==
I know it' a dumb question but why this code doesn't work.
boolean correct = "SampleText" == ((EditText)findViewById(R.id.editText1)).getText().toString();
if(correct) ((TextView)findViewById(R.id.textView1)).setText("correct!");
else ((TextView)findViewById(R.id.textView1)).setText("uncorrect!");
The point is to check if content of "editText1" is equal to "Sample Text"
In Java, two strings (and in general, two objects) must be compared using equals(), not ==. The == operator tests for identity (meaning: testing if two objects are exactly the same in memory), whereas the method equals() tests two objects for equality (meaning: testing if two objects have the same value), no matter if they're two different objects. Almost always you're interested in equality, not in identity.
To fix your code, do this:
String str = ((EditText)findViewById(R.id.editText1)).getText().toString();
boolean correct = "SampleText".equals(str);
Also notice that it's a good practice to put the string literal first in the call to equals(), in this way you're safe in case the second string is null, avoiding a possible NullPointerException.
In Java Strings have to be compared with their equals() method:
String foo = "foo";
String bar = "bar";
if (foo.equals(bar)) System.out.println("correct");
else System.out.println("incorrect");
to compare the values for two strings (for equality), you need to use equals, not == (or use equalsIgnoreCase if you do not care about case sensitivity).
Using equals will check the contents/values of the strings (as opposed to "==" which will only check if the two variables point to the same object - not the same value).
The correct way to compare 2 objects in java is using equals() method of Object class
And as String is an object in java, it should be compared in same way.
The correct way to compare a String is with,
s1.equals(s2)
So you can use this,
boolean correct = "SampleText".equals(((EditText)findViewById(R.id.editText1)).getText().toString());
((TextView)findViewById(R.id.textView1)).setText("SampleTest".equals(((EditText)findViewById(R.id.editText1)).getText().toString()) ? "correct!" : "incorrect!");
It's a bit long and theres probably a better way you could do this. The .toString() feels weird!
This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
How do I compare strings in Java?
Someone can tell me why this condition
if (lista.getString(0)=="username")
do not return true? I've used to try
if (lista.getString(0)==lista.getString(0))
and dont work, and i have understand that is a language problem.
== tests for reference equality.
.equals tests for value equality.
Threfore you should use:
if (lista.getString(0).equals("username"))
See How do I compare strings in Java?
For String comparison always use equals().
if (lista.getString(0).equals("username"))
Using == , you will end up comparing references, not values.
A simple snippet to clarify further:
String s1 = "Hello";
String s2 = new String(s1);
System.out.println(s1.equals(s2)); // true because values are same
System.out.println((s1 == s2)); // false because they are different objects
From Java Techniques
Since Strings are objects, the equals(Object) method will return true if two Strings have
the same objects. The == operator will only be true if two String references point to the
same underlying String object. Hence two Strings representing the same content will be
equal when tested by the equals(Object) method, but will only be equal when tested with
the == operator if they are actually the same object.
Use
if (lista.getString(0).equals("username"))
The correct way to compare objects is with,
object1.equals(object2)
And String is an object in Java, so it implies same for String too
s1.equals(s2)
eg :
if (lista.getString(0).equals("username"))
I would like to know how to express OR in Java. I always thought it was ||. But this does not work in my Android App.
So e.g here:
if (team1.getText() **"OR"?** team2.getText() == "myteam");
How can I set the OR statement?
if("myteam".equals(team1.getText()) || "myteam".equals(team2.getText()))
You cannot do something like if((foo || bar).equals(anotherString)).
A couple of this might be causing the problem. if(team1.getText()) will break, as it is not a boolean statement, so you cannot use the || operator on it.
The other problem is your method of comparing strings. Strings in java are not comparable with the == operator, because that is trying to compare the location in memory of a two String objects or literals, or a mix, and that will not return true unless they are the same instance of a String.
You have to compare strings with the equals() method on a String object or a string literal.
In the following Java code, the if statement conditional does not evaluate to true and its block is skipped.
public void options(String input)
{
if(input == "x")
System.exit(0);
}
Input has the right value, so why is the System.exit(0) skipped?
You're comparing two string references for identity, not whether they refer to equal strings. It's not skipping the if statement - it's evaluating the condition, and finding that it's false, so it's not going into the body. Try this:
if (input.equals("x"))
Or if input might be null and you don't want that to cause an exception:
if ("x".equals(input))
This isn't just true of strings - whenever you have ==, it will compare the values of the two expressions... and if those values are references, it simply compares whether those two references are equal, i.e. whether they refer to the same object. equals, on the other hand, is applied polymorphically - so the object it's called on can determine what constitutes equality for that class.
As another example:
Integer x = new Integer(1000);
Integer y = new Integer(1000);
System.out.println(x == y); // false
System.out.println(x.equals(y)); // true
This is a classic. Don't use "==" for comparing Strings, use String.equals().
Try using
"x".equals(input)
== tests whether they refer to the same object not the content of the string.
Do not use == for comparing strings, use equals.
if(input.equals("x"))
System.exit(0);
Try "X".equals(input). For String comparison use equals method.
You need to use .equals(), not ==.
Using == will always fail: Unlike javascript, in java == tests if the two operands are the same exact object, which they aren't (one is a String constant, the other was user input)
.equals() test if the two objects "have the same value" (class-dependant implementation).
Use == for comparing primitives and object references.
equals for content comparisons(provided it is implemented). String has the equals implemented for content comparison and you should use that.