Activity 9.2.1.
What will the code below print out? Try to guess before you run it! Then, add another Turtle friend2 and set it to juan. Does friend2 == juan? Does friend2 == friend? Print out the Boolean expressions for these.
int
and reference types like Dog
are compared with ==
in a physical model of Java memory.
==
or !=
to test if two reference values, like Turtle
and String
objects, refer to the same object. In the figure below, we are creating two separate Turtle
objects called juan
and mia
. They do not refer to same object or turtle. Then, we create a reference variable called friend
that is set to mia
. The turtle mia
will have two ways (references or aliases) to name her β sheβs both mia
and friend
, and these variables refer to the same object (same Turtle
) in memory. If two reference variables refer to the same object like the turtle on the right in the image below, the test with ==
will return true which you can see in the code below.
Turtle
objects have many instance variables like name
, width
, height
, xPos
, yPos
, etc. When comparing two Turtle
objects, we need a specially written equals method to compare all of these values. In the next sections, we will take a look at String
objects and the difference between comparing them with ==
vs. the equals
method.
s1.equals(s2)
is true if s1
and s2
have all the same characters in the same order. With Strings
and other objects, you almost always use equals
instead of ==
to check their equality.
==
or !=
is used to compare object variables, it returns true when the two variables refer to the same object. These variables are called object references and aliases for the same object. With strings this happens when one string variable is set to another.
==
and equals
work with String objects in memory.
new
keyword to create a string, it will always create a new string object. So, even if we create two string objects with new that contain all the same characters in the same order, they will not refer to the same object.
new
keyword, two different String
objects will be created that each have the characters Hello
in them. So s1 == s2
will be false since they donβt refer to the same object, but s1.equals(s2)
is true since the two different objects contain the same characters in the same order.
equals
but not with ==
.Strings
using string literals instead of new, like String s = "Hello"
. String
literals behave a little differently because they are re-used if they already exist instead of creating a new object. But you should not see questions with string literals and ==
on the AP exam.
==
and !=
with primitive types like int
or to test if two strings (or objects) refer to the same object. Use equals
, not ==
or !=
, with strings to test if they are equal letter by letter, and with other objects to see if all of their relevant attributes are equal.
String s1 = new String("hi");
String s2 = new String("bye");
String s3 = new String("hi");
s2 = s1;
String s1 = new String("hi");
String s2 = new String("bye");
String s3 = new String("hi");
String s1 = new String("hi");
String s2 = new String("bye");
String s3 = new String("hi");
==
or !=
with objects is to compare them to null to see if they really exist. Sometimes short-circuit evaluation is used to avoid an error if the object doesnβt exist. Remember that short-circuit evaluation is used with &&
in Java meaning that if the first part of the if condition is false, it doesnβt even have to check the second condition and it knows the whole &&
test is false.
NullPointerException
(if you donβt see the exception because of the autograding, you can copy it into the pencil icon scratch area to run it without the grader). Since s
is null
, trying to access indexOf
on s
throws an NullPointerException
. Comment out the first if
statement and run the program again. The second if
statement avoids the error with shortcircuit evaluation. Because s != null
is false
, the rest of the Boolean expression is not evaluated. Now, change s
to set it to "apple"
instead of null
in the first line and run the code again to see that the if
statements can print out that βapple contains an aβ.