- •CONTENTS
- •1.1 Introduction
- •1.2 What Is a Computer?
- •1.3 Programs
- •1.4 Operating Systems
- •1.5 Java, World Wide Web, and Beyond
- •1.6 The Java Language Specification, API, JDK, and IDE
- •1.7 A Simple Java Program
- •1.8 Creating, Compiling, and Executing a Java Program
- •1.9 (GUI) Displaying Text in a Message Dialog Box
- •2.1 Introduction
- •2.2 Writing Simple Programs
- •2.3 Reading Input from the Console
- •2.4 Identifiers
- •2.5 Variables
- •2.7 Named Constants
- •2.8 Numeric Data Types and Operations
- •2.9 Problem: Displaying the Current Time
- •2.10 Shorthand Operators
- •2.11 Numeric Type Conversions
- •2.12 Problem: Computing Loan Payments
- •2.13 Character Data Type and Operations
- •2.14 Problem: Counting Monetary Units
- •2.15 The String Type
- •2.16 Programming Style and Documentation
- •2.17 Programming Errors
- •2.18 (GUI) Getting Input from Input Dialogs
- •3.1 Introduction
- •3.2 boolean Data Type
- •3.3 Problem: A Simple Math Learning Tool
- •3.4 if Statements
- •3.5 Problem: Guessing Birthdays
- •3.6 Two-Way if Statements
- •3.7 Nested if Statements
- •3.8 Common Errors in Selection Statements
- •3.9 Problem: An Improved Math Learning Tool
- •3.10 Problem: Computing Body Mass Index
- •3.11 Problem: Computing Taxes
- •3.12 Logical Operators
- •3.13 Problem: Determining Leap Year
- •3.14 Problem: Lottery
- •3.15 switch Statements
- •3.16 Conditional Expressions
- •3.17 Formatting Console Output
- •3.18 Operator Precedence and Associativity
- •3.19 (GUI) Confirmation Dialogs
- •4.1 Introduction
- •4.2 The while Loop
- •4.3 The do-while Loop
- •4.4 The for Loop
- •4.5 Which Loop to Use?
- •4.6 Nested Loops
- •4.7 Minimizing Numeric Errors
- •4.8 Case Studies
- •4.9 Keywords break and continue
- •4.10 (GUI) Controlling a Loop with a Confirmation Dialog
- •5.1 Introduction
- •5.2 Defining a Method
- •5.3 Calling a Method
- •5.4 void Method Example
- •5.5 Passing Parameters by Values
- •5.6 Modularizing Code
- •5.7 Problem: Converting Decimals to Hexadecimals
- •5.8 Overloading Methods
- •5.9 The Scope of Variables
- •5.10 The Math Class
- •5.11 Case Study: Generating Random Characters
- •5.12 Method Abstraction and Stepwise Refinement
- •6.1 Introduction
- •6.2 Array Basics
- •6.3 Problem: Lotto Numbers
- •6.4 Problem: Deck of Cards
- •6.5 Copying Arrays
- •6.6 Passing Arrays to Methods
- •6.7 Returning an Array from a Method
- •6.8 Variable-Length Argument Lists
- •6.9 Searching Arrays
- •6.10 Sorting Arrays
- •6.11 The Arrays Class
- •7.1 Introduction
- •7.2 Two-Dimensional Array Basics
- •7.3 Processing Two-Dimensional Arrays
- •7.4 Passing Two-Dimensional Arrays to Methods
- •7.5 Problem: Grading a Multiple-Choice Test
- •7.6 Problem: Finding a Closest Pair
- •7.7 Problem: Sudoku
- •7.8 Multidimensional Arrays
- •8.1 Introduction
- •8.2 Defining Classes for Objects
- •8.3 Example: Defining Classes and Creating Objects
- •8.4 Constructing Objects Using Constructors
- •8.5 Accessing Objects via Reference Variables
- •8.6 Using Classes from the Java Library
- •8.7 Static Variables, Constants, and Methods
- •8.8 Visibility Modifiers
- •8.9 Data Field Encapsulation
- •8.10 Passing Objects to Methods
- •8.11 Array of Objects
- •9.1 Introduction
- •9.2 The String Class
- •9.3 The Character Class
- •9.4 The StringBuilder/StringBuffer Class
- •9.5 Command-Line Arguments
- •9.6 The File Class
- •9.7 File Input and Output
- •9.8 (GUI) File Dialogs
- •10.1 Introduction
- •10.2 Immutable Objects and Classes
- •10.3 The Scope of Variables
- •10.4 The this Reference
- •10.5 Class Abstraction and Encapsulation
- •10.6 Object-Oriented Thinking
- •10.7 Object Composition
- •10.8 Designing the Course Class
- •10.9 Designing a Class for Stacks
- •10.10 Designing the GuessDate Class
- •10.11 Class Design Guidelines
- •11.1 Introduction
- •11.2 Superclasses and Subclasses
- •11.3 Using the super Keyword
- •11.4 Overriding Methods
- •11.5 Overriding vs. Overloading
- •11.6 The Object Class and Its toString() Method
- •11.7 Polymorphism
- •11.8 Dynamic Binding
- •11.9 Casting Objects and the instanceof Operator
- •11.11 The ArrayList Class
- •11.12 A Custom Stack Class
- •11.13 The protected Data and Methods
- •11.14 Preventing Extending and Overriding
- •12.1 Introduction
- •12.2 Swing vs. AWT
- •12.3 The Java GUI API
- •12.4 Frames
- •12.5 Layout Managers
- •12.6 Using Panels as Subcontainers
- •12.7 The Color Class
- •12.8 The Font Class
- •12.9 Common Features of Swing GUI Components
- •12.10 Image Icons
- •13.1 Introduction
- •13.2 Exception-Handling Overview
- •13.3 Exception-Handling Advantages
- •13.4 Exception Types
- •13.5 More on Exception Handling
- •13.6 The finally Clause
- •13.7 When to Use Exceptions
- •13.8 Rethrowing Exceptions
- •13.9 Chained Exceptions
- •13.10 Creating Custom Exception Classes
- •14.1 Introduction
- •14.2 Abstract Classes
- •14.3 Example: Calendar and GregorianCalendar
- •14.4 Interfaces
- •14.5 Example: The Comparable Interface
- •14.6 Example: The ActionListener Interface
- •14.7 Example: The Cloneable Interface
- •14.8 Interfaces vs. Abstract Classes
- •14.9 Processing Primitive Data Type Values as Objects
- •14.10 Sorting an Array of Objects
- •14.11 Automatic Conversion between Primitive Types and Wrapper Class Types
- •14.12 The BigInteger and BigDecimal Classes
- •14.13 Case Study: The Rational Class
- •15.1 Introduction
- •15.2 Graphical Coordinate Systems
- •15.3 The Graphics Class
- •15.4 Drawing Strings, Lines, Rectangles, and Ovals
- •15.5 Case Study: The FigurePanel Class
- •15.6 Drawing Arcs
- •15.7 Drawing Polygons and Polylines
- •15.8 Centering a String Using the FontMetrics Class
- •15.9 Case Study: The MessagePanel Class
- •15.10 Case Study: The StillClock Class
- •15.11 Displaying Images
- •15.12 Case Study: The ImageViewer Class
- •16.1 Introduction
- •16.2 Event and Event Source
- •16.3 Listeners, Registrations, and Handling Events
- •16.4 Inner Classes
- •16.5 Anonymous Class Listeners
- •16.6 Alternative Ways of Defining Listener Classes
- •16.7 Problem: Loan Calculator
- •16.8 Window Events
- •16.9 Listener Interface Adapters
- •16.10 Mouse Events
- •16.11 Key Events
- •16.12 Animation Using the Timer Class
- •17.1 Introduction
- •17.2 Buttons
- •17.3 Check Boxes
- •17.4 Radio Buttons
- •17.5 Labels
- •17.6 Text Fields
- •17.7 Text Areas
- •17.8 Combo Boxes
- •17.9 Lists
- •17.10 Scroll Bars
- •17.11 Sliders
- •17.12 Creating Multiple Windows
- •18.1 Introduction
- •18.2 Developing Applets
- •18.3 The HTML File and the <applet> Tag
- •18.4 Applet Security Restrictions
- •18.5 Enabling Applets to Run as Applications
- •18.6 Applet Life-Cycle Methods
- •18.7 Passing Strings to Applets
- •18.8 Case Study: Bouncing Ball
- •18.9 Case Study: TicTacToe
- •18.10 Locating Resources Using the URL Class
- •18.11 Playing Audio in Any Java Program
- •18.12 Case Study: Multimedia Animations
- •19.1 Introduction
- •19.2 How is I/O Handled in Java?
- •19.3 Text I/O vs. Binary I/O
- •19.4 Binary I/O Classes
- •19.5 Problem: Copying Files
- •19.6 Object I/O
- •19.7 Random-Access Files
- •20.1 Introduction
- •20.2 Problem: Computing Factorials
- •20.3 Problem: Computing Fibonacci Numbers
- •20.4 Problem Solving Using Recursion
- •20.5 Recursive Helper Methods
- •20.6 Problem: Finding the Directory Size
- •20.7 Problem: Towers of Hanoi
- •20.8 Problem: Fractals
- •20.9 Problem: Eight Queens
- •20.10 Recursion vs. Iteration
- •20.11 Tail Recursion
- •APPENDIXES
- •INDEX
212 Chapter 6 Single-Dimensional Arrays
|
Stack |
|
Heap |
|
|
|
Stack |
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Space required for the |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
swapFirstTwoInArray |
|
||||
|
Space required for the |
|
|
|
|
|
|
|
|
|
method |
|
|
|
|
|
||
|
swap method |
|
|
|
|
|
|
|
|
|
int[] array |
|
reference |
|
|
|
||
|
|
n2: 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
n1: 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
Space required for the |
|
|
|
|
|
|
|
|
|
Space required for the |
|
||||||
|
main method |
|
|
|
|
|
|
|
|
|
main method |
|
||||||
|
int[] a |
reference |
|
|
|
|
|
|
|
|
|
|
int[] a |
reference |
|
|
||
|
|
|
|
|
a[0]: 1 |
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a[1]: 2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
||||||||||||
Invoke swap(int n1, int n2). The arrays are |
Invoke swapFirstTwoInArray(int[] |
|||||||||||||||||
The primitive type values in |
|
|
stored in a |
array). The reference value in a is passed |
||||||||||||||
a[0] and a[1] are passed to the |
|
|
heap. |
to the swapFirstTwoInArray method. |
||||||||||||||
swap method. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FIGURE 6.6 When passing an array to a method, the reference of the array is passed to the method.
6.7 Returning an Array from a Method
You can pass arrays when invoking a method. A method may also return an array. For example, the method shown below returns an array that is the reversal of another array:
|
l |
public static int[] reverse(int[] list) { |
|
create array |
2 |
int[] result = new int[list.length]; |
|
|
3 |
|
|
|
4 |
for (int i = 0, j = result.length - 1; |
|
|
5 |
i < list.length; i++, j--) { |
|
|
6 |
result[j] = list[i]; |
list |
|
7 |
} |
|
|
|
||
|
8 |
|
|
return array |
9 |
return result; |
result |
|
10 |
} |
|
Line 2 creates a new array result. Lines 4–7 copy elements from array list to array result. Line 9 returns the array. For example, the following statement returns a new array list2 with elements 6, 5, 4, 3, 2, 1.
int[] list1 = {1, 2, 3, 4, 5, 6}; int[] list2 = reverse(list1);
6.7.1Case Study: Counting the Occurrences of Each Letter
Listing 6.4 presents a program to count the occurrences of each letter in an array of characters. The program does the following:
1.Generate 100 lowercase letters randomly and assign them to an array of characters, as shown in Figure 6.7(a). You can obtain a random letter by using the getRandomLowerCaseLetter() method in the RandomCharacter class in Listing 5.10
2.Count the occurrences of each letter in the array. To do so, create an array, say counts, of 26 int values, each of which counts the occurrences of a letter, as shown in Figure 6.7(b). That is, counts[0] counts the number of a’s, counts[1] counts the number of b’s, and so on.
|
|
|
6.7 Returning an Array from a Method 213 |
|
chars[0] |
|
counts[0] |
|
|
|
|
|
||
chars[1] |
|
counts[1] |
|
|
… |
|
|
|
|
… |
… |
… |
|
|
… |
… |
… |
… |
|
chars[98] |
|
counts[24] |
|
|
|
|
|
||
chars[99] |
|
counts[25] |
|
|
|
|
|
||
|
|
|
|
|
|
(a) |
|
(b) |
FIGURE 6.7 The chars array stores 100 characters, and the counts array stores 26 counts, each of which counts the occurrences of a letter.
LISTING 6.4 CountLettersInArray.java
1 public class CountLettersInArray {
2/** Main method */
3 public static void main(String[] args) {
4// Declare and create an array
5 |
char[] chars = createArray(); |
create array |
6 |
|
|
7// Display the array
8System.out.println("The lowercase letters are:");
9 |
displayArray(chars); |
|
pass array |
|||
10 |
|
|
|
|
|
|
11 |
// Count the |
occurrences of each letter |
|
|||
12 |
int[] counts |
= |
countLetters(chars) |
; |
return array |
|
13 |
|
|
|
|
|
|
14// Display counts
15System.out.println();
16System.out.println("The occurrences of each letter are:");
17 |
displayCounts(counts); |
pass array |
18 |
} |
|
19 |
|
|
20/** Create an array of characters */
21public static char[] createArray() {
22// Declare an array of characters and create it
23char[] chars = new char[100];
24
25// Create lowercase letters randomly and assign
26// them to the array
27for (int i = 0; i < chars.length; i++)
28chars[i] = RandomCharacter.getRandomLowerCaseLetter();
30// Return the array
31return chars;
32}
34/** Display the array of characters */
35public static void displayArray(char[] chars) {
36// Display the characters in the array 20 on each line
37for (int i = 0; i < chars.length; i++) {
38if ((i + 1) % 20 == 0)
39 System.out.println(chars[i]);
214 Chapter 6 |
|
Single-Dimensional Arrays |
|||||||
|
40 |
else |
|||||||
|
41 |
System.out.print(chars[i] + " "); |
|||||||
|
42 |
} |
|
|
|
||||
|
43 |
} |
|
|
|
||||
|
44 |
|
|
|
|
||||
|
45 |
/** Count the occurrences of each letter */ |
|||||||
|
46 |
public static |
int[] countLetters(char[] chars) |
{ |
|||||
|
47 |
// Declare and create an array of 26 int |
|||||||
|
48 |
int[] counts = new int[26]; |
|||||||
|
49 |
|
|
|
|
||||
|
50 |
// For each lowercase letter in the array, count it |
|||||||
|
51 |
for (int i = 0; i < chars.length; i++) |
|||||||
count |
52 |
counts[chars[i] - 'a']++; |
|||||||
|
53 |
|
|
|
|
||||
|
54 |
return counts; |
|||||||
|
55 |
} |
|
|
|
||||
|
56 |
|
|
|
|
||||
|
57 |
/** Display counts */ |
|||||||
|
58 |
public static |
void displayCounts(int[] counts) |
{ |
|||||
|
59 |
for (int i = 0; i < counts.length; i++) { |
|||||||
|
60 |
if ((i + 1) % 10 == 0) |
|||||||
|
61 |
System.out.println(counts[i] + " " + (char)(i + 'a')); |
|||||||
|
62 |
else |
|||||||
|
63 |
System.out.print(counts[i] + " " + (char)(i + 'a') + " "); |
|||||||
|
64 |
} |
|
|
|
||||
|
65 |
} |
|
|
|
||||
|
66 |
} |
|
|
|
||||
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
The lowercase letters are: |
|||
|
|
|
|
|
|
e y l s r i b k j v j h a b z n w b t v |
|||
|
|
|
|
|
|
||||
|
|
|
|
|
|
s c c k r d w a m p w v u n q a m p l o |
|||
|
|
|
|
|
|
a z g d e g f i n d x m z o u l o z j v |
|||
|
|
|
|
|
|
h w i w n t g x w c d o t x h y v z y z |
|||
|
|
|
|
|
|
q e a m f w p g u q t r e n n w f c r f |
|||
|
|
|
|
|
|
The occurrences of each letter are: |
|||
|
|
|
|
|
|
5 a 3 b 4 c 4 d 4 e 4 f 4 g 3 h 3 i 3 j |
|||
|
|
|
|
|
|
2 k 3 l 4 m 6 n 4 o 3 p 3 q 4 r 2 s 4 t |
|||
|
|
|
|
|
|
3 u 5 v 8 w 3 x 3 y 6 z |
|||
|
|
|
|
|
|
|
|
|
|
The createArray method (lines 21–32) generates an array of 100 random lowercase letters. Line 5 invokes the method and assigns the array to chars. What would be wrong if you rewrote the code as follows?
char[] chars = new char[100]; chars = createArray();
You would be creating two arrays. The first line would create an array by using new char[100]. The second line would create an array by invoking createArray() and assign the reference of the array to chars. The array created in the first line would be garbage because it is no longer referenced. Java automatically collects garbage behind the scenes. Your program would compile and run correctly, but it would create an array unnecessarily.
Invoking getRandomLowerCaseLetter() (line 28) returns a random lowercase letter. This method is defined in the RandomCharacter class in Listing 5.10.
The countLetters method (lines 46–55) returns an array of 26 int values, each of which stores the number of occurrences of a letter. The method processes each letter in the
6.8 Variable-Length Argument Lists 215
array and increases its count by one. A brute-force approach to count the occurrences of each letter might be as follows:
for (int i = 0; i < chars.length; i++) if (chars[i] == 'a')
counts[0]++;
else if (chars[i] == 'b') counts[1]++;
...
But a better solution is given in lines 51–52.
for (int i = 0; i < chars.length; i++) counts[chars[i] - 'a']++;
If the letter (chars[i]) is 'a', the corresponding count is counts['a' - 'a'] (i.e., counts[0]). If the letter is 'b', the corresponding count is counts['b' - 'a'] (i.e., counts[1]), since the Unicode of 'b' is one more than that of 'a'. If the letter is 'z', the corresponding count is counts['z' - 'a'] (i.e., counts[25]), since the Unicode of 'z' is 25 more than that of 'a'.
Figure 6.8 shows the call stack and heap during and after executing createArray. See Review Question 6.14 to show the call stack and heap for other methods in the program.
Stack |
|
Heap |
|
Stack |
|
Heap |
Space required for the |
|
Array of 100 |
|
|
|
Array of 100 |
createArray method |
|
characters |
|
|
|
characters |
char[] chars: ref |
|
|
|
|
|
|
|
|
|
|
Space required for the |
|
|
Space required for the |
|
|
|
|
|
|
main method |
|
|
|
main method |
|
|
char[] chars: ref |
|
|
|
char[] chars: ref |
|
|
|
|
|
|
|
|
|
(a) Executing |
|
|
(b) After exiting |
|
||
createArray in line 5 |
|
createArray in line 5 |
FIGURE 6.8 (a) An array of 100 characters is created when executing createArray.
(b) This array is returned and assigned to the variable chars in the main method.
6.8 Variable-Length Argument Lists
You can pass a variable number of arguments of the same type to a method. The parameter in the method is declared as follows:
typeName... parameterName
In the method declaration, you specify the type followed by an ellipsis 1 Á 2. Only one vari- able-length parameter may be specified in a method, and this parameter must be the last parameter. Any regular parameters must precede it.
Java treats a variable-length parameter as an array. You can pass an array or a variable number of arguments to a variable-length parameter. When invoking a method with a variable number of arguments, Java creates an array and passes the arguments to it. Listing 6.5 contains a method that prints the maximum value in a list of an unspecified number of values.
LISTING 6.5 VarArgsDemo.java
1 public class VarArgsDemo {
2public static void main(String[] args) {
3 |
printMax(34, 3, 3, 2, 56.5); |
pass variable-length arg list |