Top Banner
Which is better?
25

Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Dec 22, 2015

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Which is better?

Page 2: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Which is better?

• Assume s1 and s2 are Strings:

A. if (s1 == s2) { ... }

B. if (s1.equals(s2)) { ... }

Page 3: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Answer: B

• s1 == s2 tests whether s1 and s2 reference the same string; s1.equals(s2) tests whether they reference equal strings

• String s1 = "ABC";String s2 = s1;String s3 = "ABC";String s4 = "AB" + "C"

• All these strings are equal; but s4 is in a different memory location than the others, so the == test yields false

Page 4: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Which is better?

• Assume String s1;

A. if (s1.equals("OK")) { ... }

B. if ("OK".equals(s1)) { ... }

Page 5: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Answer: B

• s1.equals("OK") sends a message to s1 asking if it is equal to "OK"

• "OK".equals(s1) sends a message to "OK" asking if it is equal to s1– This is legal, because "OK" is a String

• If s1 is null, then: s1.equals("OK") gives a NullPointerException "OK".equals(s1) gives false

Page 6: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Which is better?

• Assume int numbers[ ] = new int[100];

A. for (int i = 0; i < 100; i++) numbers[i] = i;

B. for (int i = 0; i <= 99; i++) numbers[i] = i;

Page 7: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Answer: A

• for (int i = 0; i < 100; i++) is better thanfor (int i = 0; i <= 99; i++)

• Three reasons:– The first is more traditional

– The array size is 100, not 99, so it’s more obvious where the number came from

• You have to do some arithmetic to get 99

– If you change the array size, a search for 100 won’t find the loop that uses 99

Page 8: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Which is better?

• Assume int numbers[ ] = new int[100];

A. for (int i = 0; i < 100; i++) numbers[i] = i;

B. for (int i = 0; i < numbers.length; i++) numbers[i] = i;

Page 9: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Answer: B

• for (int i = 0; i < numbers.length; i++)is better thanfor (int i = 0; i < 100; i++)

• If you later decide to change the size of the numbers array, you only need to do it in the declaration; the for loop that uses length will automatically adjust

Page 10: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Which is better?

• Assume finished is a boolean variable:

A. if (finished == true) {...}

B. if (finished) {...}

Page 11: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Answer: B

• finished == true is redundant:– If finished is true, then finished==true will be

true– If finished is false, then finished==true will be

false

• The extra words don’t gain you anything– finished==true might seem more readable to a

beginner, but you quickly learn to read the shorter form

– Brevity in programming, as in writing, is a virtue

– You can avoid the possible mistake of saying if (finished = true) { ... }

Page 12: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Which is better?

• Assume foo, bar, and larger are integers

A. if (foo > bar) larger = foo;else larger = bar;

B. larger = foo > bar ? foo : bar;

Page 13: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Answer: neither

• For each of these, you have to look at the code carefully to make sure it is correct

larger = Math.max(foo, bar);is easier to read and more obviously correct

Page 14: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Which is better?

A. String s = "Hello";

B. String s = new String("Hello");

Page 15: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Answer: A

• "Hello" is special syntax to implicitly construct a string

• String s = new String("Hello"); actually constructs two strings: "Hello" constructs the first string, then it is given as a parameter to an explicit constructor, which constructs the second string

Page 16: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Which is better?

• Suppose p is a Panel with a BorderLayout and okButton is a Button:

A. p.add(okButton, BorderLayout.NORTH);

B. p.add(okButton, "North");

• Note: BorderLayout.NORTH == "North"

Page 17: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Answer: A

• p.add(okButton, BorderLayout.NORTH); is strongly recommended over the shorter form p.add(okButton, "North") -- but why?

• Answer: better error detection– If you type p.add(okButton, "north"), there is no

error, but it doesn’t do what you want

– If you type p.add(okButton, BorderLayout.North) you will get a syntax error, because BorderLayout has no such variable as North

Page 18: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Which is better?

• Suppose n is an int and s is a String:

A. s = Integer.toString(n);

B. s = String.valueOf(n);

C. s = new Integer(n).toString();

D. s = n + "";

Page 19: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Answer: D

• I prefer D (s = n + ""; ) because:– It’s a common idiom, therefore easily recognized

– It’s short

– It works for any type

Page 20: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Which is better?

• Assume n is an integer:

A. if (n < 0) n = 0;

B. if (n < 0) n = 0;

C. if (n < 0) { n = 0;}

Page 21: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Answer: C

• If, later on, you want to add a statement, it’s easy to make this mistake with B:– if (n < 0)

System.out.println("n was " + n); n = 0;

• You won’t make this mistake with A or C– With C (using braces), you don’t have to change anything

that’s already there

– However, A (all on one line) is often convenient

Page 22: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Which is better?

• Assume n is an integer:

A. int factorial = 1;for (int i = 2; i < n; i++) { factorial *= n;}

B. int factorial = 1;int i = 1;for (i = 2; i < n; i++) { factorial *= n; }

Page 23: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Answer: A

• In most cases, you don’t care about the index of a for loop outside the loop– You typically give it an initial value in the loop

– You typically already have its final value in some variable or by some simple computation

• If you don’t need a variable, you shouldn’t have that variable– It doesn’t help anything, and it might get in the way

Page 24: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

Conclusions

• There are various ways to do things• One way may be better than another because:

– It’s easier to read and understand

– It’s more familiar—the way things are usually done

– It’s less error prone, or provides better error detection

– It’s more efficient

Page 25: Which is better?. Assume s1 and s2 are Strings: A.if (s1 == s2) {... } B.if (s1.equals(s2)) {... }

The End