Exception Handling & Java Utility API © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Course Objective • Exception Handling • Java Utilities classes • Java Collection Framework © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Learning Approach The following are strongly suggested for a better learning and understanding of this course: Noting down the key concepts in the class Analyze all the examples / code snippets provided Study and understand the self study topics Completion and submission of all the assignments, on time Completion of the self review questions in the lab guide Study and understand all the artifacts including the reference materials / e-learning / supplementary materials specified Completion of the project (if application for this course) on time inclusive of individual and group activities Taking part in the self assessment activities Participation in the doubt clearing sessions © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Session 1 EXCEPTION HANDLING © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Java Exception - Introduction • Exception is shorthand for the phrase “exceptional event“. • An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program's instructions. • When an error occurs within a method, the method creates an object and hands it off to the runtime system. The object, called an exception object, contains information about the error, including its type and the state of the program when the error occurred. • Creating an exception object and handing it to the runtime system is called throwing an exception. • It is essential that a programmer foresees these conditions and takes care of them by writing proper error messages to be flashed when the program encounters an error. • Error and exception handling is used to foresee and identify error conditions and perform processing to take care of their impact. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Call stack After a method throws an exception, the runtime system attempts to find something to handle it. The set of possible "somethings" to handle the exception is the ordered list of methods that had been called to get to the method where the error occurred. The list of methods is known as the call stack © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Call stack (cont) The runtime system searches the call stack for a method that contains a block of code that can handle the exception. This block of code is called an exception handler. The exception handler chosen is said to catch the exception. If the runtime system exhaustively searches all the methods on the call stack without finding an appropriate exception handler, as shown in the next figure, the runtime system (and, consequently, the program) terminates. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Three Kinds of Exceptions The first kind of exception is the checked exception. These are exceptional conditions that a well-written application should anticipate and recover from. All exceptions are checked exceptions, except for those indicated by Error, RuntimeException, and their subclasses. The second kind of exception is the error. These are exceptional conditions that are external to the application, and that the application usually cannot anticipate or recover from. The third kind of exception is the runtime exception. These are exceptional conditions that are internal to the application, and that the application usually cannot anticipate or recover from. These usually indicate programming bugs, such as logic errors or improper use of an API. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Throwable Class and Its Subclasses © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Error Class When a dynamic linking failure or other hard failure in the Java virtual machine occurs, the virtual machine throws an Error. Simple programs typically do not catch or throw Errors. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Exception Class Most programs throw and catch objects that derive from the Exception class. An Exception indicates that a problem occurred, but it is not a serious system problem. Most programs you write will throw and catch Exceptions. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 The Catch or Specify Requirement Valid Java programming language code must honor the Catch or Specify Requirement. This means that code that might throw certain exceptions must be enclosed by either of the following: A try statement that catches the exception. The try must provide a handler for the exception. A method that specifies that it can throw the exception. The method must provide a throws clause that lists the exception Code that fails to honor the Catch or Specify Requirement will not compile. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Example 1. 2. 3. 4. 5. 6. 7. //Note: This class won't compile by design! import java.io.*; import java.util.List; import java.util.ArrayList; public class ListOfNumbers { private List<Integer> list; private static final int SIZE = 10; public ListOfNumbers () { list = new ArrayList<Integer>(SIZE); for (int i = 0; i < SIZE; i++) { list.add(new Integer(i)); } } 8. 9. 10. 11. 12. 13. public void writeList() { PrintWriter out = new PrintWriter(new FileWriter("OutFile.txt")); 14. 15. for (int i = 0; i < SIZE; i++) { out.println("Value at: " + i + " = " + list.get(i)); } out.close(); 16. 17. 18. 19. } 20. 21. } © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Example (cont) Line 15 call a constructor to initializes an output stream on a file. If the file cannot be opened, the constructor throws an IOException. Line 17 call to the ArrayList class's getmethod, which will throws an IndexOutOfBoundsException if the value of its argument is too small (less than 0) or more than the number of elements currently contained by the ArrayList. If you try to compile this code, the compiler prints an error message about the exception thrown by line 15. However, it does not display an error message about the exception thrown by line 17. The reason is that the exception thrown by the constructor, IOException, is a checked exception, and the one thrown by the get method, IndexOutOfBoundsException, is an unchecked exception. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 The try block The first step in constructing an exception handler is to enclose the code that might throw an exception within a try block. You can put each line of code that might throw an exception within its own try block and provide separate exception handlers for each. Or, you can put all the code within a single try block and associate multiple handlers with it. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 The try block try { System.out.println("Entered try statement"); out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < SIZE; i++) { out.println("Value at: " + i + " = " + list.get(i)); } } catch and finally statements . . . If an exception occurs within the try block, that exception is handled by an exception handler associated with it. To associate an exception handler with a try block, you must put a catch block after it © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 The catch Blocks You associate exception handlers with a try block by providing one or more catch blocks directly after the try block: try { } catch (ExceptionType name) { } catch (ExceptionType name) { } Each catch block is an exception handler and handles the type of exception indicated by its argument. The argument type, ExceptionType, declares the type of exception that the handler can handle and must be a class that inherits from the Throwable class. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 The catch Blocks The catch block contains code that is executed if and when the exception handler is invoked. The runtime system invokes the exception handler when the handler is the first one in the call stack whose ExceptionType matches the type of the exception thrown. try { ... } catch (FileNotFoundException e) { System.err.println("FileNotFoundException: " + e.getMessage()); throw new SampleException(e); } catch (IOException e) { System.err.println("Caught IOException: " + e.getMessage()); } © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 The catch Blocks Both handlers print an error message. The second handler does nothing else. By catching any IOException that's not caught by the first handler, it allows the program to continue executing. The first handler, in addition to printing a message, throws a user-defined exception. In this example, when the FileNotFoundException is caught it causes a user-defined exception called SampleException to be thrown. You might want to do this if you want your program to handle an exception in this situation in a specific way. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 The finally Block The finally block always executes when the try block exits. This ensures that the finally block is executed even if an unexpected exception occurs. finally is useful for more than just exception handling — it allows the programmer to avoid having cleanup code accidentally bypassed by a return, continue, or break. Putting cleanup code in a finally block is always a good practice, even when no exceptions are anticipated. If the JVM exits while the try or catch code is being executed, then the finally block may not execute. Likewise, if the thread executing the try or catch code is interrupted or killed, the finally block may not execute even though the application as a whole continues. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 The finally Block The try block of the writeList method that you've been working with here opens a PrintWriter. The program should close that stream before exiting the writeList method. This poses a somewhat complicated problem because writeList's try block can exit in one of three ways: The new FileWriter statement fails and throws an IOException. The list.get(i) statement fails and throws an ArrayIndexOutOfBoundsException. Everything succeeds and the try block exits normally. The runtime system always executes the statements within the finally block regardless of what happens within the try block. So it's the perfect place to perform cleanup. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 The finally Block The following finally block for the writeList method cleans up and then closes the PrintWriter. finally { if (out != null) { System.out.println("Closing PrintWriter"); out.close(); } else { System.out.println("PrintWriter not open"); } } Important: The finally block is a key tool for preventing resource leaks. When closing a file or otherwise recovering resources, place the code in a finally block to ensure that resource is always recovered. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Putting It All Together public void writeList() { PrintWriter out = null; try { System.out.println("Entering try statement"); out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < SIZE; i++) { out.println("Value at: " + i + " = " + list.get(i)); } } catch (ArrayIndexOutOfBoundsException e) { System.err.println("ArrayIndexOutOfBoundsException:" + e.getMessage()); } catch (IOException e) { System.err.println("Caught IOException:" + e.getMessage()); } finally { if (out != null) { System.out.println("Closing PrintWriter"); out.close(); } else { System.out.println("PrintWriter not open"); } } } © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Scenario 1 Scenario 1: An Exception Occurs For example, the constructor for the FileWriter throws an IOException if the program cannot create or write to the file indicated. The runtime system immediately stops executing the try block; method calls being executed are not completed. The runtime system then starts searching at the top of the method call stack for an appropriate exception handler. In this example, when the IOException occurs, the FileWriter constructor is at the top of the call stack. However, the FileWriter constructor doesn't have an appropriate exception handler, so the runtime system checks the next method — the writeList method — in the method call stack. The writeList method has two exception handlers: one for IOException and one for ArrayIndexOutOfBoundsException. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Scenario 1 (cont) The runtime system checks writeList's handlers in the order in which they appear after the try statement. The argument to the first exception handler is ArrayIndexOutOfBoundsException, this does not match the type of exception thrown. So the runtime system checks the next exception handler —IOException. This matches the type of exception that was thrown, so the runtime system ends its search for an appropriate exception handler. Now that it has found an appropriate handler, the code in that catch block is executed. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Scenario 1 (cont) After the exception handler executes, the runtime system passes control to the finally block. Code in the finally block executes regardless of the exception caught above it. In this scenario, the FileWriter was never opened and doesn't need to be closed. After the finally block finishes executing, the program continues with the first statement after the finally block. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Scenario 1 (cont) Here's the complete output from the program when an IOException is thrown: Entering try statement Caught IOException: OutFile.txt PrintWriter not open © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Scenario 2 Scenario 2: The try Block Exits Normally In this scenario, all the statements within the scope of the try block execute successfully and throw no exceptions. Execution falls off the end of the try block, and the runtime system passes control to the finally block. Because everything was successful, the PrintWriter is open when control reaches the finally block, which closes the PrintWriter. Again, after the finally block finishes executing, the program continues with the first statement after the finally block. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Scenario 2 (cont) Here is the output from the program when no exceptions are thrown: Entering try statement Closing PrintWriter © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Specifying the Exceptions Thrown The previous section showed how to write an exception handler for the writeList method in the ListOfNumber sclass. Sometimes, it's appropriate for code to catch exceptions that can occur within it. In other cases, however, it's better to let a method further up the call stack handle the exception. For example, if you were providing a library with the ListOfNumbers class as part in a package, you probably couldn't anticipate the needs of all the users of your library. In this case, it's better to not catch the exception and to allow a method further up the call stack to handle it. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Specifying the Exceptions Thrown If the writeList method doesn't catch the checked exceptions that can occur within it, the writeList method must specify that it can throw these exceptions. Let's modify the original writeList method to specify the exceptions it can throw instead of catching them. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Specifying the Exceptions Thrown To specify that writeList can throw two exceptions, add a throws clause to the method declaration for the writeList method. The throws clause comprises the throws keyword followed by a comma-separated list of all the exceptions thrown by that method. The clause goes after the method name and argument list and before the brace that defines the scope of the method: public void writeList() throws IOException, ArrayIndexOutOfBoundsException { … } © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 How to Throw Exceptions Before you can catch an exception, some code somewhere must throw one. Any code can throw an exception: your code, code from a package written by someone else, the packages that come with the Java platform, or the Java runtime environment. Regardless of what throws the exception, it's always thrown with the throw statement. The throw statement requires a single argument: a throwable object. Throwable objects are instances of any subclass of the Throwable class. Example: throw someThrowableObject; © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Example import java.util.EmptyStackException; public class ThrowAnException { private List<Integer> list; public void writeList() { if (list == null || list.isEmpty()) { throw new EmptyStackException(); } try {... }... } public static void main(String[] args) { ThrowAnException sample = new ThrowAnException(); sample.writeList(); } } Output: Exception in thread "main" java.util.EmptyStackException at vn.com.fsoft.java.lesson4.ThrowAnException.writeList(ThrowAnException.java:18) at vn.com.fsoft.java.lesson4.ThrowAnException.main(ThrowAnException.java:42) © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Chained Exceptions An application often responds to an exception by throwing another exception. In effect, the first exception causes the second exception. It can be very helpful to know when one exception causes another. Chained Exceptions help the programmer do this. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Chained Exceptions The following example shows how to use a chained exception: try { ... } catch (IOException e) { throw new SampleException("Other IOException", e); } In this example, when an IOException is caught, a new SampleException exception is created with the original cause attached and the chain of exceptions is thrown up to the next higher level exception handler. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Stack Trace A stack trace provides information on the execution history of the current thread and lists the names of the classes and methods that were called at the point when the exception occurred. A stack trace is a useful debugging tool that you'll normally take advantage of when an exception has been thrown. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Accessing Stack Trace Information Now let's suppose that the higher-level exception handler wants to dump the stack trace in its own format. The following code shows how to call the getStackTrace method on the exception object: catch (Exception cause) { StackTraceElement elements[] = cause.getStackTrace(); for (int i = 0; i < elements.length; i++) { System.err.println( elements[i].getFileName() + ":" + elements[i].getLineNumber() + ">> " + elements[i].getMethodName() + "()“ ); } } © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Creating Exception Classes When faced with choosing the type of exception to throw, you can either use one written by someone else, or you can write one of your own. You should write your own exception classes if you answer yes to any of the following questions: Do you need an exception type that isn't represented by those in the Java platform? Do you need more specific information about exception? Would it help users if they could differentiate your exceptions from those thrown by classes written by other vendors? Does your code throw more than one related exception? Should your package be independent and self-contained? © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Example For example, your application has a module in business logic layer to search and create Customer. You may have some method: searchCustomer(Long customerID) searchCustomer(String customerName) createCustomer(Long customerID, String customerName) You want that, when the presentation layer call to this module, it may know what happens if these method could not found or create a Customer, and also know exactly which Customer is it working with. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Example (cont) This figure illustrates one possible class hierarchy for the exceptions thrown by this module. You may have another solution. For readable code, it's good practice to append the string Exception to the names of all classes that inherit (directly or indirectly) from the Exception class. Exception BusinessLogicException CustomerException CustomerNotFoundException © FPT SOFTWARE – TRAINING MATERIAL – Internal use DuplicatedCustomerException 04e-BM/NS/HDCV/FSOFT v2/3 BusinessLogicException.java public class BusinessLogicException extends Exception { public BusinessLogicException() { super(); } public BusinessLogicException(String message) { super(message); } public BusinessLogicException(Throwable cause) { super(cause); } public BusinessLogicException(String message, Throwable cause) { super(message, cause); } } © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 CustomerException.java public class CustomerException extends BusinessLogicException { private private private private static final String ID = "Customer ID: "; static final String NAME = "Customer Name: "; Long customerID; String customerName; public CustomerException(Long customerID, String customerName) { this.customerID = customerID; this.customerName = customerName; } public CustomerException(Long customerID) { this(customerID, null); } public CustomerException(String customerName) { this(null, customerName); } public String getMessage() { StringBuffer msg = new StringBuffer(); if (customerID != null) { msg.append(ID).append(customerID); } if (customerName != null) { msg.append(NAME).append(customerName); } return msg.toString(); } } © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 CustomerNotFoundException.java public class CustomerNotFoundException extends CustomerException { private static final String DEFAULT_MSG = "Could not found the customer in the database."; public CustomerNotFoundException(Long customerID) { super(customerID); } public CustomerNotFoundException(Long customerID, String customerName) { super(customerID, customerName); } public CustomerNotFoundException(String customerName) { super(customerName); } public String getMessage() { StringBuffer msg = new StringBuffer(DEFAULT_MSG); msg.append(super.getMessage()); return msg.toString(); } } © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 DuplicatedCustomerException.java public class DuplicatedCustomerException extends CustomerException { private static final String DEFAULT_MSG = "This customer is already exists."; public DuplicatedCustomerException(Long customerID, String customerName) { super(customerID, customerName); } public DuplicatedCustomerException(Long customerID) { super(customerID); } public DuplicatedCustomerException(String customerName) { super(customerName); } public String getMessage() { StringBuffer msg = new StringBuffer(DEFAULT_MSG); msg.append(super.getMessage()); return msg.toString(); } } © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Some common Runtime Exception When programming, you may often have to deal with: java.lang.NullPointerException java.lang.IndexOutOfBoundsException java.lang.ClassCastException To avoid these exception, you should always: Check null before use. Check array is empty, array’s length before use. Check type before casting. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Advantages of Exceptions Separating Error-Handling Code from "Regular" Code Propagating Errors Up the Call Stack Grouping and Differentiating Error Types © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Summary A program can use exceptions to indicate that an error occurred. To throw an exception, use the throw statement and provide it with an exception object — a descendant of Throwable — to provide information about the specific error that occurred. A method that throws an uncaught, checked exception must include a throws clause in its declaration. A program can catch exceptions by using a combination of the try, catch, and finally blocks. The try block identifies a block of code in which an exception can occur. The catch block identifies a block of code, known as an exception handler, that can handle a particular type of exception. The finally block identifies a block of code that is guaranteed to execute, and is the right place to close files, recover resources, and otherwise clean up after the code enclosed in the try block. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Summary (cont) The try statement should contain at least one catch block or a finally block and may have multiple catch blocks. The class of the exception object indicates the type of exception thrown. The exception object can contain further information about the error, including an error message. With exception chaining, an exception can point to the exception that caused it, which can in turn point to the exception that caused it, and so on. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Session 2 UTILITIES CLASSES © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Utilities classes in the java.lang package • The java.lang package defines classes that are fundamental to the Java language. For this reason, all classes in the java.lang package are imported automatically, so there is no reason to write an import statement for them. • The java.lang package contains many of the most fundamental and often-used classes in the Java API: o o o Strings: String & String Buffer classes Math class Wrappers: Boolean Byte Character Double Float Integer Long Short © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 java.lang.String • Strings Are Immutable Objects String s = “abc”; String s2 = s; s = s.concat(“def”); • Some important methods: public public public public public public public public public public public char charAt(int index) String concat(String s) boolean equals(Object anObject) boolean equalsIgnoreCase(String s) int length() String replace(char old, char new) String substring(int begin) String substring(int begin, int end) String toLowerCase() String toUpperCase() String trim() © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 java.lang.StringBuffer • The StringBuffer class should be used when you have to make a lot of modifications to strings of characters. As we discussed in the previous section, String objects are immutable, so if you choose to do a lot of manipulations with String objects, you will end up with a lot of abandoned String objects in the String pool. • A common use for StringBuffers is file I/O when large, everchanging streams of input are being handled by the program. In these cases, large blocks of characters are handled as its, and StringBuffer objects are the ideal way to handle a block of data, pass it on, and then reuse the same memory to handle the next block of data. • Some important methods: public public public public synchronized StringBuffer append(String s) synchronized StringBuffer insert(int offset, String s) synchronized StringBuffer reverse() String toString() © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 java.lang.Math • Math class, which is used to perform basic mathematical operations. • All methods of the Math class are defined as static, you don’t need to create an instance to use them. In fact, it’s not possible to create an instance of the Math class because the constructor is private. • You can’t extend the Math class because it’s marked final • The Math class defines approximations for the mathematical constants pi and e. Their signatures are as follows: public final static double Math.PI public final static double Math.E • Methods: abs(x), ceil(d), floor(d), max(x, y), min(x, y), random(), round(x), sin(x), cos(x), tan(x), sqrt(x),… © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Wrappers • There is a wrapper class for every primitive in Java. For instance the wrapper class for int is Integer, for float is Float, and so on. Remember that the primitive name is simply the lowercase name of the wrapper except for char, which maps to Character, and int, which maps to Integer. • The wrapper classes in the Java API serve two primary purposes: To provide a mechanism to “wrap” primitive values in an object so that the primitives can be included in activities reserved for objects, like as being added to Collections, or returned from a method with an object return value. o To provide an assortment of utility functions for primitives. Most of these functions are related to various conversions: converting primitives to and from String objects, and converting primitives and String objects to and from different bases (or radix), such as binary, octal, and hexadecimal. o © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Wrappers (cont) All of the numeric wrapper classes are subclasses of the abstract class Number: © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Java.lang – Wrappers (cont.) • Creating Wrapper Objects: o The Wrapper Constructors: Integer i1 = new Integer(42); Integer i2 = new Integer("42"); o The valueOf() Methods Integer i3 = Integer.valueOf("101011", 2); Float f1 = Float.valueOf("3.14f"); © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Java.lang – Wrappers (cont.) • Using Wrapper Conversion Utilities xxxValue() => convert the value of a wrapped numeric to a primitive o parseXxx() and valueOf() => take a String as an argument, throw a NumberFormatException if the String argument is not properly formed, and can convert String objects from different bases (radix), when the underlying primitive type is any of the four integer types. The difference between the two methods is parseXxx() returns the named primitive. valueOf() returns a newly created wrapped object of the type that invoked the method. o toString() => returns a String with the value of the primitive wrapped in the object o toXxxString() (Binary, Hexadecimal, Octal) => The Integer and Long wrapper classes let you convert numbers in base 10 to other bases. These conversion methods, toXxxString(), take an int or long, and return a String representation of the converted number. o © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Java.lang – equals() method • equals() is used only to compare objects. • equals() returns a boolean, true or false. • The StringBuffer class has not overridden equals(). • The String and wrapper classes are final and have overridden equals(). © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Summary Strings are a sequence of characters and are widely used in Java programming. In the Java programming language, strings are objects. The String class has over 60 methods and 13 constructors. The String class has many methods to find and retrieve substrings; these can then be easily reassembled into new strings using the + concatenation operator. The String class also includes a number of utility methods, among them split(), toLowerCase(), toUpperCase(), and valueOf(). The latter method is indispensable in converting user input strings to numbers. The Number subclasses also have methods for converting strings to numbers and vice versa. In addition to the String class, there is also a StringBuilder class. Working with StringBuilder objects can sometimes be more efficient than working with strings. The StringBuilder class offers a few methods that can be useful for strings, among them reverse(). © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Summary (cont) You use one of the wrapper classes – Byte, Double, Float, Integer, Long, or Short – to wrap a number of primitive type in an object. The Java compiler automatically wraps (boxes) primitives for you when necessary and unboxes them, again when necessary. The Number classes include constants and useful class methods. The MIN_VALUE and MAX_VALUE constants contain the smallest and largest values that can be contained by an object of that type. The byteValue, shortValue, and similar methods convert one numeric type to another. The valueOf method converts a string to a number, and thetoString method converts a number to a string. The Math class contains a variety of class methods for performing mathematical functions, including exponential, logarithmic, and trigonometric methods. Math also includes basic arithmetic functions, such as absolute value and rounding, and a method, random(), for generating random numbers. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Session 3 JAVA COLLECTIONS FRAMEWORK © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Collections • A collection (sometimes called a container) is an object that groups multiple elements into a single unit. • Collections are used to store, retrieve and manipulate data, and to transmit data from one method to another. • Collections typically represent data items that form a natural group, a card hand, a mail folder, a telephone directory… © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Collections Framework • The Java collections framework is made up of a set of interfaces and classes for working with groups of objects • The Java Collections Framework provides Interfaces: abstract data types representing collections. o Implementations: concrete implementations of the collection interfaces. o Algorithms: methods that perform useful computations, like searching and sorting, on objects that implement collection interfaces. o © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Interface Collection and Class Collections • Interface Collection o o o o A Collection represents a group of objects, known as its elements Some Collection implementations allow duplicate elements and others do not Some are ordered and others unordered Contains bulk operations Adding, clearing, comparing and retaining objects o Collection is used to pass collections around and manipulate them when maximum generality is desired • Class Collections o o Provides static methods that manipulate collections Collections can be manipulated polymorphically © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 More on Collection interface • All collection implementations (which implement some sub interface of Collection like Set or List) have a constructor that takes a Collection argument. • This constructor allows the caller to create a Collection of a desired implementation type, initially containing all of the elements in any given Collection, whatever its subinterface or implementation type. Suppose you have a Collection, c, which may be a List, a Set, or some other kind of Collection. List li = new ArrayList(c); The statement creates a new ArrayList (an implementation of the List interface), initially containing all of the elements in c © FPT SOFTWARE – TRAINING MATERIAL – Internal use C may be a List, a Set, or some other kind of Collection 04e-BM/NS/HDCV/FSOFT v2/3 More on Collection interface (cont.) The interface does about what you'd expect, given that a Collection represents a group of objects. It has methods to tell you how many elements are in the collection (size, isEmpty), to check if a given object is in the collection (contains), to add and remove an element from the collection (add, remove), and to provide an iterator over the collection (iterator). The add method is defined generally enough so that it makes sense for collections that allow duplicates as well as those that don't. It guarantees that the Collection will contain the specified element after the call completes, and returns true if the Collection changes as a result of the call. Similarly, the remove method is defined to remove a single instance of the specified element from the Collection, assuming the Collection contains the element, and to return true if the Collection was modified as a result. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Collections - Lists • Ordered Collection that can contain duplicate elements • Sometimes called a sequence • Implemented via interface List o ArrayList o LinkedList o Vector • List provides a richer ListIterator ListIterator allows you to traverse the list in either direction, modify the list during iteration, and obtain the current position of the iterator © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 CollectionTest.java 1 // CollectionTest.java 2 // Using the Collection interface. 3 import java.awt.Color; 4 import java.util.*; 5 6 public class CollectionTest { 7 private static final String colors[] = { "red", "white", "blue" }; 8 9 // create ArrayList, add objects to it and manipulate it 10 public CollectionTest() 11 { 12 List list = new ArrayList(); 13 14 // add objects to list 15 list.add( Color.MAGENTA ); // add a color object 16 17 for ( int count = 0; count < colors.length; count++ ) 18 list.add( colors[ count ] ); 19 20 list.add( Color.CYAN ); // add a color object 21 22 // output list contents 23 System.out.println( "\nArrayList: " ); 24 25 for ( int count = 0; count < list.size(); count++ ) 26 System.out.print( list.get( count ) + " " ); 27 © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 CollectionTest.java 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 // remove all String objects removeStrings( list ); // output list contents System.out.println( "\n\nArrayList after calling removeStrings: " ); for ( int count = 0; count < list.size(); count++ ) System.out.print( list.get( count ) + " " ); } // end constructor CollectionTest // remove String objects from Collection private void removeStrings( Collection collection ) { Iterator iterator = collection.iterator(); // get iterator // loop while collection has items while ( iterator.hasNext() ) if ( iterator.next() instanceof String ) iterator.remove(); // remove String object } © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 CollectionTest.java 51 52 53 54 55 56 public static void main( String args[] ) { new CollectionTest(); } } // end class CollectionTest Output: ArrayList: java.awt.Color[r=255,g=0,b=255] red white blue java.awt.Color[r=0,g=255,b=255] ArrayList after calling removeStrings: java.awt.Color[r=255,g=0,b=255] java.awt.Color[r=0,g=255,b=255] © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 ListTest.java 1 // ListTest.java 2 // Using LinkLists. 3 import java.util.*; 4 5 public class ListTest { 6 private static final String colors[] = { "black", "yellow", 7 "green", "blue", "violet", "silver" }; 8 private static final String colors2[] = { "gold", "white", 9 "brown", "blue", "gray", "silver" }; 10 11 // set up and manipulate LinkedList objects 12 public ListTest() 13 { 14 List link = new LinkedList(); 15 List link2 = new LinkedList(); 16 17 // add elements to each list 18 for ( int count = 0; count < colors.length; count++ ) { 19 link.add( colors[ count ] ); 20 link2.add( colors2[ count ] ); 21 } 22 23 link.addAll( link2 ); // concatenate lists 24 link2 = null; // release resources 25 © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 ListTest.java 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 printList( link ); uppercaseStrings( link ); printList( link ); System.out.print( "\nDeleting elements 4 to 6..." ); removeItems( link, 4, 7 ); printList( link ); printReversedList( link ); } // end constructor ListTest // output List contents public void printList( List list ) { System.out.println( "\nlist: " ); for ( int count = 0; count < list.size(); count++ ) System.out.print( list.get( count ) + " " ); System.out.println(); } © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 ListTest.java 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 // locate String objects and convert to uppercase private void uppercaseStrings( List list ) { ListIterator iterator = list.listIterator(); while ( iterator.hasNext() ) { Object object = iterator.next(); // get item if ( object instanceof String ) // check for String iterator.set( ( ( String ) object ).toUpperCase() ); } } // obtain sublist and use clear method to delete sublist items private void removeItems( List list, int start, int end ) { list.subList( start, end ).clear(); // remove items } // print reversed list private void printReversedList( List list ) { ListIterator iterator = list.listIterator( list.size() ); © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 ListTest.java 76 77 78 79 80 81 82 83 84 85 86 87 88 System.out.println( "\nReversed List:" ); // print list in reverse order while( iterator.hasPrevious() ) System.out.print( iterator.previous() + " " ); } public static void main( String args[] ) { new ListTest(); } } // end class ListTest © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 ListTest.java Output: list: black yellow green blue violet silver gold white brown blue gray silver list: BLACK YELLOW GREEN BLUE VIOLET SILVER GOLD WHITE BROWN BLUE GRAY SILVER Deleting elements 4 to 6... list: BLACK YELLOW GREEN BLUE WHITE BROWN BLUE GRAY SILVER Reversed List: SILVER GRAY BLUE BROWN WHITE BLUE GREEN YELLOW BLACK © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 UsingToArray.java 1 // UsingToArray.java 2 // Using method toArray. 3 import java.util.*; 4 5 public class UsingToArray { 6 7 // create LinkedList, add elements and convert to array 8 public UsingToArray() 9 { 10 String colors[] = { "black", "blue", "yellow" }; 11 12 LinkedList links = new LinkedList( Arrays.asList( colors ) ); 13 14 links.addLast( "red" ); // add as last item 15 links.add( "pink" ); // add to the end 16 links.add( 3, "green" ); // add at 3rd index 17 links.addFirst( "cyan" ); // add as first item 18 19 // get LinkedList elements as an array 20 colors = ( String [] ) links.toArray( new String[ links.size() ] ); 21 22 System.out.println( "colors: " ); 23 © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 UsingToArray.java 24 25 26 27 28 29 30 31 32 33 for ( int count = 0; count < colors.length; count++ ) System.out.println( colors[ count ] ); } public static void main( String args[] ) { new UsingToArray(); } } // end class UsingToArray Output: colors: cyan black blue yellow green red pink © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Collections - Algorithms • Collections Framework provides set of algorithms o Implemented as static methods List algorithms sort binarySearch reverse shuffle fill copy Collection algorithms min max © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Collections – Algorithms Sort • sort o Sorts List elements Order is determined by natural order of elements’ type Relatively fast © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Sort1.java 1 // Sort1.java 2 // Using algorithm sort. 3 import java.util.*; 4 5 public class Sort1 { 6 private static final String suits[] = 7 { "Hearts", "Diamonds", "Clubs", "Spades" }; 8 9 // display array elements 10 public void printElements() 11 { 12 // create ArrayList 13 List list = new ArrayList( Arrays.asList( suits ) ); 14 15 // output list 16 System.out.println( "Unsorted array elements:\n" + list ); 17 18 Collections.sort( list ); // sort ArrayList 19 20 // output list 21 System.out.println( "Sorted array elements:\n" + list ); 22 } 23 © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Sort1.java 24 25 26 27 28 29 public static void main( String args[] ) { new Sort1().printElements(); } } // end class Sort1 Output: Unsorted array elements: [Hearts, Diamonds, Clubs, Spades] Sorted array elements: [Clubs, Diamonds, Hearts, Spades] © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Collections - Algorithm shuffle • shuffle o Randomly orders List elements © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Cards.java 1 // Cards.java 2 // Using algorithm shuffle. 3 import java.util.*; 4 5 // class to represent a Card in a deck of cards 6 class Card { 7 private String face; 8 private String suit; 9 10 // initialize a Card 11 public Card( String initialface, String initialSuit ) 12 { 13 face = initialface; 14 suit = initialSuit; 15 } 16 17 // return face of Card 18 public String getFace() 19 { 20 return face; 21 } 22 23 // return suit of Card 24 public String getSuit() 25 { 26 return suit; 27 } © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Cards.java 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 // return String representation of Card public String toString() { StringBuffer buffer = new StringBuffer( face + " of " + suit ); buffer.setLength( 20 ); return buffer.toString(); } } // end class Card // class Cards declaration public class Cards { private static final String suits[] = { "Hearts", "Clubs", "Diamonds", "Spades" }; private static final String faces[] = { "Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King" }; private List list; // set up deck of Cards and shuffle public Cards() { Card deck[] = new Card[ 52 ]; © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Cards.java 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 for ( int count = 0; count < deck.length; count++ ) deck[ count ] = new Card( faces[ count % 13 ], suits[ count / 13 ] ); list = Arrays.asList( deck ); // get List Collections.shuffle( list ); // shuffle deck } // output deck public void printCards() { int half = list.size() / 2 - 1; for ( int i = 0, j = half + 1; i <= half; i++, j++ ) System.out.println( list.get( i ).toString() + list.get( j ) ); } public static void main( String args[] ) { new Cards().printCards(); } } // end class Cards © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Cards.java King of Diamonds Jack of Spades Four of Diamonds Six of Clubs King of Hearts Nine of Diamonds Three of Spades Four of Spades Four of Hearts Seven of Spades Five of Diamonds Eight of Hearts Queen of Diamonds Five of Hearts Seven of Diamonds Seven of Hearts Nine of Hearts Three of Clubs Ten of Spades Deuce of Hearts Three of Hearts Ace of Spades Six of Hearts Eight of Diamonds Six of Diamonds Deuce of Clubs Ace of Clubs Ten of Diamonds Eight of Clubs Queen of Hearts Jack of Clubs Ten of Clubs Seven of Clubs Queen of Spades Five of Clubs Six of Spades Nine of Spades Nine of Clubs King of Spades Ace of Diamonds Ten of Hearts Ace of Hearts Queen of Clubs Deuce of Spades Three of Diamonds King of Clubs Four of Clubs Jack of Diamonds Eight of Spades Five of Spades Jack of Hearts Deuce of Diamonds © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 reverse, fill, copy, max, min • reverse o Reverses the order of List elements • fill o Populates List elements with values • copy o Creates copy of a List • max o Returns largest element in List • min o Returns smallest element in List © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Algorithms1.java 1 // Algorithms1.java 2 // Using algorithms reverse, fill, copy, min and max. 3 import java.util.*; 4 5 public class Algorithms1 { 6 private String letters[] = { "P", "C", "M" }, lettersCopy[]; 7 private List list, copyList; 8 9 // create a List and manipulate it with methods from Collections 10 public Algorithms1() 11 { 12 list = Arrays.asList( letters ); // get List 13 lettersCopy = new String[ 3 ]; 14 copyList = Arrays.asList( lettersCopy ); 15 16 System.out.println( "Initial list: " ); 17 output( list ); 18 19 Collections.reverse( list ); // reverse order 20 System.out.println( "\nAfter calling reverse: " ); 21 output( list ); 22 23 Collections.copy( copyList, list ); // copy List 24 System.out.println( "\nAfter copying: " ); 25 output( copyList ); 26 © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Algorithms1.java 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Collections.fill( list, "R" ); // fill list with Rs System.out.println( "\nAfter calling fill: " ); output( list ); } // end constructor // output List information private void output( List listRef ) { System.out.print( "The list is: " ); for ( int k = 0; k < listRef.size(); k++ ) System.out.print( listRef.get( k ) + " " ); System.out.print( "\nMax: " + Collections.max( listRef ) ); System.out.println( " Min: " + Collections.min( listRef ) ); } public static void main( String args[] ) { new Algorithms1(); } } // end class Algorithms1 © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Algorithms1.java Output: Initial list: The list is: P C M Max: P Min: C After calling reverse: The list is: M C P Max: P Min: C After copying: The list is: M C P Max: P Min: C After calling fill: The list is: R R R Max: R Min: R © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Collections - Algorithm binarySearch • binarySearch o Locates Object in List Returns index of Object in List if Object exists Returns negative value if Object does not exist © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 BinarySearchTest.java 1 // BinarySearchTest.java 2 // Using algorithm binarySearch. 3 import java.util.*; 4 5 public class BinarySearchTest { 6 private static final String colors[] = { "red", "white", 7 "blue", "black", "yellow", "purple", "tan", "pink" }; 8 private List list; // List reference 9 10 // create, sort and output list 11 public BinarySearchTest() 12 { 13 list = new ArrayList( Arrays.asList( colors ) ); 14 Collections.sort( list ); // sort the ArrayList 15 System.out.println( "Sorted ArrayList: " + list ); 16 } 17 18 // search list for various values 19 private void printSearchResults() 20 { 21 printSearchResultsHelper( colors[ 3 ] ); // first item 22 printSearchResultsHelper( colors[ 0 ] ); // middle item 23 printSearchResultsHelper( colors[ 7 ] ); // last item 24 printSearchResultsHelper( "aardvark" ); // below lowest 25 printSearchResultsHelper( "goat" ); // does not exist 26 printSearchResultsHelper( "zebra" ); // does not exist 27 } 28 © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 BinarySearchTest.java 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 // helper method to perform searches private void printSearchResultsHelper( String key ) { int result = 0; System.out.println( "\nSearching for: " + key ); result = Collections.binarySearch( list, key ); System.out.println( ( result >= 0 ? "Found at index " + result : "Not Found (" + result + ")" ) ); } public static void main( String args[] ) { new BinarySearchTest().printSearchResults(); } } Sorted ArrayList: black blue pink purple red tan white yellow Searching for: black Found at index 0 Searching for: red Found at index 4 Searching for: pink Found at index 2 Searching for: aardvark Not Found (-1) Searching for: goat Not Found (-3) Searching for: zebra Not Found (-9) © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Collections - Sets • Cannot contain duplicate elements • Models the mathematical set abstraction • A SortedSet is a Set that maintains its elements in ascending order • HashSet o o Stores elements in hash table HashSet is much faster but offers no ordering guarantees • TreeSet o o Stores elements in tree Stores its elements in a red-black tree, guarantees the order of iteration © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 SetTest.java 1 // SetTest.java 2 // Using a HashSet to remove duplicates. 3 import java.util.*; 4 5 public class SetTest { 6 private static final String colors[] = { "red", "white", "blue", 7 "green", "gray", "orange", "tan", "white", "cyan", 8 "peach", "gray", "orange" }; 9 10 // create and output ArrayList 11 public SetTest() 12 { 13 List list = new ArrayList( Arrays.asList( colors ) ); 14 System.out.println( "ArrayList: " + list ); 15 printNonDuplicates( list ); 16 } 17 18 // create set from array to eliminate duplicates 19 private void printNonDuplicates( Collection collection ) 20 { 21 // create a HashSet and obtain its iterator 22 Set set = new HashSet( collection ); 23 Iterator iterator = set.iterator(); 24 25 System.out.println( "\nNonduplicates are: " ); 26 © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 SetTest.java 27 28 29 30 31 32 33 34 35 36 37 38 while ( iterator.hasNext() ) System.out.print( iterator.next() + " " ); System.out.println(); } public static void main( String args[] ) { new SetTest(); } } // end class SetTest ArrayList: [red, white, blue, green, gray, orange, tan, white, cyan, peach, gray, orange] Nonduplicates are: red cyan white tan gray green orange blue peach © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 SortedSetTest.java 1 // SortedSetTest.java 2 // Using TreeSet and SortedSet. 3 import java.util.*; 4 5 public class SortedSetTest { 6 private static final String names[] = { "yellow", "green", 7 "black", "tan", "grey", "white", "orange", "red", "green" }; 8 9 // create a sorted set with TreeSet, then manipulate it 10 public SortedSetTest() 11 { 12 SortedSet tree = new TreeSet( Arrays.asList( names ) ); 13 14 System.out.println( "set: " ); 15 printSet( tree ); 16 17 // get headSet based upon "orange" 18 System.out.print( "\nheadSet (\"orange\"): " ); 19 printSet( tree.headSet( "orange" ) ); 20 21 // get tailSet based upon "orange" 22 System.out.print( "tailSet (\"orange\"): " ); 23 printSet( tree.tailSet( "orange" ) ); 24 25 // get first and last elements 26 System.out.println( "first: " + tree.first() ); 27 System.out.println( "last : " + tree.last() ); 28 } 29 © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 SortedSetTest.java 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 // output set private void printSet( SortedSet set ) { Iterator iterator = set.iterator(); while ( iterator.hasNext() ) System.out.print( iterator.next() + " " ); System.out.println(); } public static void main( String args[] ) { new SortedSetTest(); } } // end class SortedSetTest set: black green grey orange red tan white yellow headSet ("orange"): black green grey tailSet ("orange"): orange red tan white yellow first: black last : yellow © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Collections - Maps • Associates keys to values • Cannot contain duplicate keys o Called one-to-one mapping • Map allows iterating over keys, values, or key-value pairs; Hashtable did not provide 3rd option. • Map provides safe way to remove entries in the midst of iteration; © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 MapTest.java 1 // WordTypeCount.java 2 // Program counts the number of occurrences of each word in a string 3 import java.awt.*; 4 import java.awt.event.*; 5 import java.util.*; 6 import javax.swing.*; 7 8 public class WordTypeCount extends JFrame { 9 private JTextArea inputField; 10 private JLabel prompt; 11 private JTextArea display; 12 private JButton goButton; 13 14 private Map map; 15 16 public WordTypeCount() 17 { 18 super( "Word Type Count" ); 19 inputField = new JTextArea( 3, 20 ); 20 21 map = new HashMap(); 22 23 goButton = new JButton( "Go" ); 24 goButton.addActionListener( 25 © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 MapTest.java 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 new ActionListener() { // inner class public void actionPerformed( ActionEvent event ) { createMap(); display.setText( createOutput() ); } } // end inner class ); // end call to addActionListener prompt = new JLabel( "Enter a string:" ); display = new JTextArea( 15, 20 ); display.setEditable( false ); JScrollPane displayScrollPane = new JScrollPane( display ); // add components to GUI Container container = getContentPane(); container.setLayout( new FlowLayout() ); container.add( prompt ); container.add( inputField ); container.add( goButton ); container.add( displayScrollPane ); © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 MapTest.java 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 setSize( 400, 400 ); show(); } // end constructor // create map from user input private void createMap() { String input = inputField.getText(); StringTokenizer tokenizer = new StringTokenizer( input ); while ( tokenizer.hasMoreTokens() ) { String word = tokenizer.nextToken().toLowerCase(); // get word // if the map contains the word if ( map.containsKey( word ) ) { Integer count = (Integer) map.get( word ); // get value // increment value map.put( word, new Integer( count.intValue() + 1 ) ); } else // otherwise add word with a value of 1 to map map.put( word, new Integer( 1 ) ); } // end while } // end method createMap © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 MapTest.java 80 81 // create string containing map values 82 private String createOutput() { 83 StringBuffer output = new StringBuffer( "" ); 84 Iterator keys = map.keySet().iterator(); 85 86 // iterate through the keys 87 while ( keys.hasNext() ) { 88 Object currentKey = keys.next(); 89 90 // output the key-value pairs 91 output.append( currentKey + "\t" + 92 map.get( currentKey ) + "\n" ); 93 } 94 95 output.append( "size: " + map.size() + "\n" ); 96 output.append( "isEmpty: " + map.isEmpty() + "\n" ); 97 98 return output.toString(); 99 100 } // end method createOutput 101 © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 MapTest.java 102 103 104 105 106 107 108 public static void main( String args[] ) { WordTypeCount application = new WordTypeCount(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } // end class WordTypeCount © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Summary The Java Collections Framework hierarchy consists of two distinct interface trees: The first tree starts with the Collection interface, which provides for the basic functionality used by all collections, such as add and remove methods. Its subinterfaces — Set, List, and Queue — provide for more specialized collections. The Set interface does not allow duplicate elements. This can be useful for storing collections such as a deck of cards or student records. The Set interface has a subinterface, SortedSet, that provides for ordering of elements in the set. The List interface provides for an ordered collection, for situations in which you need precise control over where each element is inserted. You can retrieve elements from a List by their exact position. The Queue interface enables additional insertion, extraction, and inspection operations. Elements in a Queue are typically ordered in on a FIFO basis. The second tree starts with the Map interface, which maps keys and values similar to a Hashtable.Map's subinterface, SortedMap, maintains its key-value pairs in ascending order or in an order specified by aComparator. These interfaces allow collections to be manipulated independently of the details of their representation. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Summary (cont) The Java Collections Framework provides several general-purpose implementations of the core interfaces: For the Set interface, HashSet is the most commonly used implementation. For the List interface, ArrayList is the most commonly used implementation. For the Map interface, HashMap is the most commonly used implementation. For the Queue interface, LinkedList is the most commonly used implementation. Each of the general-purpose implementations provides all optional operations contained in its interface.The Java Collections Framework also provides several special-purpose implementations for situations that require nonstandard performance, usage restrictions, or other unusual behavior. The Collections class (as opposed to the Collection interface), provides static methods that operate on or return collections, which are known as Wrapper implementations. Finally, there are several Convenience implementations, which can be more efficient than general-purpose implementations when you don't need their full power. The Convenience implementations are made available through static factory methods. © FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 Q&A © FPT SOFTWARE – TRAINING MATERIAL – Internal use 108 04e-BM/NS/HDCV/FSOFT v2/3