Course Objective The Objective of Java course is: To understand the new features provided with jdk1.5
March 24, 2017
2 Java 2 Standard Edition 1.5 New features Generics Enhanced for loop (foreach) Autoboxing/Unboxing Type-safe enumerations Varargs Static import Metadata Scanner and command-line input Printf
March 24, 2017
3 Generics Problem: Collection element types Cannot be checked at compile time Assignment must use cast Can cause runtime errors ( ClassCastException) Solution: Tell the compiler what type your collection is Compiler can fill in casts for you
March 24, 2017
4 Using Generics Find a data structure that accepts Object(s) ArrayList, LinkedList, HashMap, HashSet, Stack Not arrays: they already take explicit types! Declare the data structure with the type(s) in angle brackets immediately after class name ArrayList<String> myStrings = new ArrayList<String>(); HashMap<String,String> myHashtable = new HashMap<String,String>(); Insert objects of the appropriate type myStrings.add("Some String"); myHashtable.put("Some Key", "Some Value"); No typecast required on removal String myValue = myStrings.get(0); String myOtherValue = myHashtable.get("Some Key");
March 24, 2017
5 Generics Example Old code List l = new LinkedList(); l.add(new Integer(0)); Integer i = (Integer)l.iterator.next(); New code List<Integer> l = new LinkedList<Integer>(); l.add(new Integer(0)); Integer i = l.iterator.next();
March 24, 2017
6 Generics Generics are NOT templates No code size increase No hideous complexity No template metaprogramming
March 24, 2017
7 Enhanced for Loop (foreach) Problem: Iterating over collections is tricky Often, iterator only used to get an element Iterator is error prone (Occurs three times in a for loop) Can produce subtle runtime errors Solution: Let the compiler do it New for loop syntax for (variable : collection)
March 24, 2017
8 For/Each Loops Idea Instead of looping with a numeric index, set a local variable to each item of a collection or array in order Basic syntax for(Type item: collectionOrArrayOfTypes) { doSomethingWith(item); } Applies to List, Map, Queue, Set, and other collections Arrays
March 24, 2017
9 Enhanced for loop example Old code void cancelAll(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ) { TimerTask task = (TimerTask)i.next(); task.cancel(); } } New Code void cancelAll(Collection<TimerTask> c) { for (TimerTask task : c) task.cancel(); } Also works for arrays
March 24, 2017
1 Sample Code public static void listEntries(String[] entries) { for(String entry: entries) { System.out.println(entry); } } Result String[] test = {"This", "is", "a", "test"}; listEntries(test); This is a test
March 24, 2017
1 Auto-boxing of primitive types Problem: Conversion between primitive types and wrapper objects (and vice-versa) Needed when adding primitives to a collection Solution: Let the compiler do it Integer intObj = 22; // Boxing conversion int i = (int)intObj // Unboxing conversion ArrayList al = new ArrayList(); al.add(22); // Boxing conversion
March 24, 2017
1 Autoboxing You cannot insert primitives into tables, lists, or anything else expecting an Object Java provides wrapper types for this purpose (int Integer, etc.) In Java 5, system converts automatically Performance Warning Every insert converts to wrapper type (Integer above) Every retrieval converts to primitive type (int above) Use arrays for performance-critical access
March 24, 2017
1 Example: Finding State Abbreviations Based on State Names public class StateMap extends HasMap{ public StateMap(){ stateMap = new HashMap<String,String>(); for(String[] state:stateArray){ stateMap.put(state[0], state[1]); } }
1 Example: Continued public class MapTest { public static void main(String[] args) { StateMap states = new StateMap(); HashMap<String,String> stateAbbreviationTable = states.getStateMap(); Scanner inputScanner = new Scanner(System.in); System.out.println("Enter state names. " + "Hit RETURN to quit."); String stateName; String abbreviation; while(true) { System.out.print("State: "); stateName = inputScanner.nextLine(); if (stateName.equals("")) { System.out.println("Come again soon."); break; } abbreviation = stateAbbreviationTable.get(stateName); if (abbreviation == null) { abbreviation = "Unknown"; } System.out.println(abbreviation); } } }
March 24, 2017
1 Typesafe Enumerations Problem: Variable needs to hold limited set of values e.g. Card suit can only be Spade, Diamond, Club, Heart Solution: New type of class declaration enum type has public, self-typed members for each enum constant new keyword, enum works with switch statement
March 24, 2017
1 Enumeration Example public enum Suit { spade, diamond, club, heart } ; public enum Value { ace, two, three, four, five, six, seven, eight, nine, ten, jack, queen, king } ; List<card> deck = new ArrayList<card>(); for (Suit suit : Suit.VALUES) for (Value value : Value.VALUES) deck.add(new Card(suit, value); Collections.shuffle(deck);
public enum Coin {
penny(1), nickel(5), dime(10), quarter(25); Coin(int value) { this.value = value; } private final int value; public int value() { return value; } }
March 24, 2017
1 Varargs Problem: To have a method that takes a variable number of parameters Can be done with an array, but not nice Look at java.text.MessageFormat Solution: Let the compiler do it for you New syntax: public static String format(String fmt,Object... args); Java gets printf !!!
March 24, 2017
1 Variable-Length Arguments The printf method takes any number of arguments You can use overloading to define a few versions of printf with different argument lengths, but it takes any number of arguments To do this yourself, use "type ... variable" variable becomes an array of given type Only legal for final argument of method Examples public void printf(String format, Object ... arguments) public int max(int ... numbers) Can call max(1, 2, 3, 4, 5, 6) or max(someArrayOfInts) Use sparingly You usually know how many arguments are possible
March 24, 2017
1 Varargs: Example public class MathUtils { public static int min(int ... numbers) { int minimum = Integer.MAX_VALUE; for(int number: numbers) { if (number < minimum) { minimum = number; } } return(minimum); } public static void main(String[] args) { System.out.printf("Min of 2 nums: %d.%n", min(2,1)); System.out.printf("Min of 7 nums: %d.%n", min(2,4,6,8,1,2,3)); } }
March 24, 2017
2 Static imports Problem: Having to fully qualify every static referenced from external classes Solution: New import syntax import static TypeName . Identifier ; import static Typename . * ; Also works for static methods and enums e.g Math.sin(x) becomes sin(x)
March 24, 2017
2 Metadata Problem: Some APIs require lots of standard code How to indicate this to a tool Solution: Annotated source code e.g. @remote getPrice(Product p)
March 24, 2017
2 Concurrency Utilities Goal: Beat C performance in high end server side applications New framework for locks to provide greater flexibility over synchronized No more threads, use Executors Use anExecutor.execute(aRunnable) Not new Thread(aRunnable).start(); Runnable and Callable Callable for things that return values and/or exceptions
March 24, 2017
2 Scanner and command-line input Basic Syntax Attach a Scanner to System.in Call nextLine, nextInt, nextDouble, etc Examples Scanner inputScanner = new Scanner(System.in); String s = inputScanner.nextLine(); int i = inputScanner.nextInt(); double d = inputScanner.nextDouble(); Notes Scanner for System.in is useful only for simple testing Use a GUI in a real application But you can also attach a Scanner to a File, a Socket, a Process, and more
March 24, 2017
2 Example: Printing Random Numbers import java.util.*; public class RandomNums { public static void main(String[] args) { System.out.print("How many random nums? "); Scanner inputScanner = new Scanner(System.in); int n = inputScanner.nextInt(); for(int i=0; i<n; i++) { System.out.println("Random num " + i + " is " + Math.random()); } } } How many random nums? 5 Random num 0 is 0.22686369670835704 Random num 1 is 0.0783768527137797 Random num 2 is 0.17918121951887145 Random num 3 is 0.3441924454634313 Random num 4 is 0.6131053203170818
March 24, 2017
2 Formatted Output: printf Takes a variable number of arguments System.out.printf("Formatting String", arg1, arg2, ); Advantages Lets you insert values into output without much clumsier String concatenation. Lets you control the width of results so things line up Lets you control the number of digits after the decimal point in numbers, for consistent- looking output Very similar to C/C++ printf function If you know printf in C/C++, you can probably use Java's printf immediately without reading any documentation Although some additions in time formatting and locales Use String.format to get the equivalent of C's sprintf
March 24, 2017
2 Simple Example: printf vs. println General idea Each %s entry in formatting string is replaced by next argument in argument list. %n means newline. Example public static void printSomeStrings() { String firstName = "John"; String lastName = "Doe"; int numPets = 7; String petType = "chickens"; System.out.pfriirnsttfN(a"m%es, %lsa shtaNsa m%es, %nsu.m%Pne"t,s , petType); System.out.println(firstName + " " + lastName + " has " + numPets + " " + petType + "."); } Result: John Doe has 7 chickens. John Doe has 7 chickens.
March 24, 2017
2 Controlling Formatting Different flags %s for strings, %f for floating point numbers, %t for dates, etc. Various extra entries can be inserted To control width, number of digits, commas, justification, type of date format, and more Complete details printf uses mini-language; complete coverage would take an entire lecture However, basic usage is straightforward For complete coverage, see http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html#syntax Most common errors Using + instead of , between arguments (printf uses varargs) Forgetting to add %n at the end if you want a newline (not automatic)
March 24, 2017
2 Printf Formatting Options
March 24, 2017
2 Printf Example: Controlling Width and Precision public static void printSomeSalaries() { CEO[] softwareCEOs = { new CEO("Steve Jobs", 3.1234), new CEO("Scott McNealy", 45.5678), new CEO("Jeff Bezos", 567.982323), new CEO("Larry Ellison", 6789.0), new CEO("Bill Gates", 78901234567890.12)}; System.out.println("SALARIES:"); for(CEO ceo: softwareCEOs) { System.out.printf("%15s: $%,8.2f%n", ceo.getName(), ceo.getSalary()); } } SALARIES: Steve Jobs: $ 3.12 Scott McNealy: $ 45.57 Jeff Bezos: $ 567.98 Larry Ellison: $6,789.00
March 24, 2017
3 Printf Example: Controlling Width and Precision public class CEO { private String name; private double salary; // In billions public CEO(String name, double salary) { this.name = name; this.salary = salary; } public String getName() { return(name); } public double getSalary() { return(salary); } }
March 24, 2017
3 Performance Improvements Goals 25% improvement in startup time over 1.4.0 Asynchronous I/O Unsynchronized StringBuffer class Non-blocking equivalents of SSLSocket and SSLServerSocket Reduce memory footprint of JVM Improve classloader speed Add concurrency library to Java core
March 24, 2017
3 Summary For/Each loops are simple Can't handle all situations, but very easy in the cases in which they do apply Scanner simplifies basic parsing Easier than String.split and Integer.parseInt Generics simplify code Increase safety also. No performance hit. Autoboxing is convenient But can hide performance costs Java finally has printf No more clumsy println's with string concatenation Varargs provides flexibility For formatting, math, and other special-purposes methods