Generics  d h A Li and the ArrayList

20  Download (0)

Full text


Chapter 14

Generics  d h A Li and the ArrayList


Introduction to Generics Introduction to Generics

• Beginning with version 5.0, Java allows class  and method definitions that include 

parameters for types

Such definitions are called generics

Such definitions are called generics

– Generic programming with a type parameter  enables code to be written that applies to any  class

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 14‐2

The ArrayList Class The ArrayList Class

i i l i h d d J lib i

• ArrayList is a class in the standard Java libraries

– Unlike arrays, which have a fixed length once they have  been created an ArrayList is an object that can grow been created, an ArrayList is an object that can grow  and shrink while your program is running

• In general, an In general, an  ArrayList ArrayList serves the same purpose serves the same purpose  as an array, except that an  ArrayList can change  length while the program is running g p g g

The ArrayList Class The ArrayList Class

• The class  ArrayList is implemented using  an array as a private instance variable y p

– When this hidden array is full, a new larger hidden 

array is created and the data is transferred to this

array is created and the data is transferred to this 

new array


The ArrayList Class The ArrayList Class

Wh l i i d f

• Why not always use an ArrayList instead of an  array? 

1 A A Li t i l ffi i t th

1. An ArrayList is less efficient than an array

2. It does not have the convenient square bracket notation 3 The base type of an ArrayList must be a class type 3. The base type of an ArrayList must be a class type 

(or other reference type):  it cannot be a primitive type – This last point is less of a problem now that Java provides  p p p

automatic boxing and unboxing of primitives

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 14‐5

Using the ArrayList Class Using the ArrayList Class

• In order to make use of the  ArrayList class, it  must first be imported from the package 


• An  ArrayList is created and named in the same  way as object of any class, except that you specify  the base type as follows:

ArrayList<BaseType> aList = new ArrayList<BaseType>();

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 14‐6

Using the ArrayList Class Using the ArrayList Class

• An initial capacity can be specified when creating an 

ArrayList as well

A Li t

– The following code creates an  ArrayList that stores  objects of the base type String with an initial capacity of 20  items

ArrayList<String> list = new ArrayList<String>(20);

Specifying an initial capacity does not limit the size to – Specifying an initial capacity does not limit the size to 

which an ArrayList can eventually grow

• Note that the base type of an ArrayList is Note that the base type of an ArrayList is  specified as a type parameter

Using the ArrayList Class Using the ArrayList Class

• The  add method is used to set an element  for the first time in an  ArrayList y


– The method name The method name  add add is overloaded is overloaded – There is also a two argument version that 

allows an item to be added at any currently

allows an item to be added at any currently 

used index position or at the first unused 



Using the ArrayList Class Using the ArrayList Class

• The size method is used to find out how many  indices already have elements in the 

A Li t ArrayList

int howMany = list.size();

Th h d i d l i i

• The  set method is used to replace any existing  element, and the  get method is used to access  the value of any existing element

the value of any existing element

list.set(index, "something else");

String thing = list get(index);

String thing = list.get(index);

Copyright © 2012 Pearson Addison‐Wesley. All rights reserved. 14‐9

Tip:  Summary of Adding to an  ArrayList

h h d i ll d l

• The  add method is usually used to place an  element in an  ArrayList position for the 

( )

first time (at an  ArrayList index) 

• The simplest  p add method has a single  g

parameter for the element to be added, and  adds an element at the next unused index, in  , order

14‐10 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Tip:  Summary of Adding to an  ArrayList

l b dd d l d

• An element can be added at an already  occupied list position by using the two‐

parameter version of  add

• This causes the new element to be placed at  p the index specified, and every other member  of the  ArrayList y to be moved up by one  p y position

Tip:  Summary of Adding to an  ArrayList

Th i f dd l b d

• The two‐argument version of  add can also be used  to add an element at the first unused position (if that  position is known)

position is known)

• Any individual element can be changed using the  set method

set method

– However, set can only reset an element at an index that  already contains an element

already contains an element

• In addition, the method  size can be used to 


Methods in the Class ArrayList Methods in the Class ArrayList

h l f i l i i l

• The tools for manipulating arrays consist only  of the square brackets and the instance 

variable  length

• ArrayLists, however, come with a  y , , selection of powerful methods that can do  many of the things for which code would have  y g to be written in order to do them using arrays

14‐13 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Some Methods in the Class  ArrayList (Part 1 of 11)

14‐14 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Some Methods in the Class  ArrayList (Part 2 of 11)

Some Methods in the Class 

ArrayList (Part 3 of 11)


Some Methods in the Class  ArrayList (Part 4 of 11)

14‐17 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Some Methods in the Class  ArrayList (Part 5 of 11)

14‐18 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Some Methods in the Class  ArrayList (Part 6 of 11)

Some Methods in the Class 

ArrayList (Part 7 of 11)


Some Methods in the Class  ArrayList (Part 8 of 11)

14‐21 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Some Methods in the Class  ArrayList (Part 9 of 11)

14‐22 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Some Methods in the Class  ArrayList (Part 10 of 11)

Some Methods in the Class 

ArrayList (Part 11 of 11)


Why are Some Parameters of Type Base_Type and Others of type Object

Wh l ki t th th d il bl i th A Li t

• When looking at the methods available in the ArrayList class, there appears to be some inconsistency

– In some cases, when a parameter is naturally an object of the base In some cases, when a parameter is naturally an object of the base  type, the parameter type is the base type

– However, in other cases, it is the type  Object

• This is because the Arra List class implements a number

• This is because the ArrayList class implements a number  of interfaces, and inherits methods from various ancestor  classes

– These interfaces and ancestor classes specify that certain parameters  have type  Object

14‐25 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

The "For Each" Loop The  For Each  Loop

• The  ArrayList class is an example of a  collection class

• Starting with version 5.0, Java has added a  new kind of for loop called a for each or new kind of for loop called a for‐each or  enhanced for loop 

– This kind of loop has been designed to cycle  through all the elements in a collection (like an  ArrayList )

14‐26 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

A for‐each Loop Used with an  ArrayList (Part 1 of 3)

A for‐each Loop Used with an 

ArrayList (Part 2 of 3)


A for‐each Loop Used with an  ArrayList (Part 3 of 3)

14‐29 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Golf Score Program (Part 1 of 6) Golf Score Program (Part 1 of 6)

14‐30 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Golf Score Program (Part 2 of 6)

Golf Score Program (Part 2 of 6) Golf Score Program (Part 3 of 6) Golf Score Program (Part 3 of 6)


Golf Score Program (Part 4 of 6) Golf Score Program (Part 4 of 6)

14‐33 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Golf Score Program (Part 5 of 6) Golf Score Program (Part 5 of 6)

14‐34 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Golf Score Program (Part 6 of 6)

Golf Score Program (Part 6 of 6) Tip: Use trimToSize to Save Memory Tip:  Use trimToSize to Save Memory

A A Li t t ti ll i it it h

• An ArrayList automatically increases its capacity when  needed

– However, the capacity may increase beyond what a program requires However, the capacity may increase beyond what a program requires – In addition, although an  ArrayList grows automatically when 

needed, it does not shrink automatically

• If an Arra List has a large amount of excess capacity an

• If an ArrayList has a large amount of excess capacity, an 

invocation of the method trimToSize will shrink the 

capacity of the ArrayList y down to the size needed


Pitfall:  The clone method Makes a Shallow  Copy

Wh d f A Li t i d d

• When a deep copy of an ArrayList is needed,  using the clone method is not sufficient

– Invoking Invoking clone clone on an on an ArrayList ArrayList object produces a object produces a  shallow copy, not a deep copy

• In order to make a deep copy, it must be possible to 

k d f b f h b

make a deep copy of objects of the base type

– Then a deep copy of each element in the ArrayList can  be created and placed into a new ArrayList object be created and placed into a new ArrayList object

14‐37 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

The Vector Class The Vector Class

h d d lib i h l d

• The Java standard libraries have a class named  Vector that behaves almost exactly the  same as the class  ArrayList

• In most situations, either class could be used ,

– However the  ArrayList class is newer, and is  becoming the preferred class g p

14‐38 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Parameterized Classes and Generics Parameterized Classes and Generics

Th l A Li t i t i d l

• The class  ArrayList is a parameterized class

• It has a parameter, denoted by Base_Type, that  can be replaced by any reference type to obtain a can be replaced by any reference type to obtain a  class for ArrayLists with the specified base type

• Starting with version 5.0, Java allows class definitions Starting with version 5.0, Java allows class definitions  with parameters for types

– These classes that have type parameters are called 

t i d l i d fi iti i l

parameterized class or generic definitions, or, simply,  generics

Nonparameterized ArrayList and Vector Classes

h d l

• The  ArrayList and  Vector classes 

discussed here have a type parameter for the  base type

• There are also  ArrayList y and  Vector classes with no parameter whose base type is  Object j

– These classes are left over from earlier versions of 



Generics Generics

Cl d h d h

• Classes and methods can have a type parameter

– A type parameter can have any reference type (i.e., any  class type) plugged in for the type parameter

class type) plugged in for the type parameter

– When a specific type is plugged in, this produces a specific  class type or method yp

– Traditionally, a single uppercase letter is used for a type  parameter, but any non‐keyword identifier may be used

14‐41 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Generics Generics

A l d fi iti ith t t i t d i

• A class definition with a type parameter is stored in a  file and compiled just like any other class

• Once a parameterized class is compiled it can be

• Once a parameterized class is compiled, it can be  used like any other class

– However, the class type plugged in for the type parameter  , yp p gg yp p must be specified before it can be used in a program – Doing this is said to instantiate the generic class

Sample<String> object = Sample<String> object =

new Sample<String>();

14‐42 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

A Class Definition with a Type 

Parameter Class Definition with a Type Parameter Class Definition with a Type Parameter

A l th t i d fi d ith t f t i

• A class that is defined with a parameter for a type is  called a generic class or a parameterized class

– The type parameter is included in angular brackets after The type parameter is included in angular brackets after  the class name in the class definition heading

– Any non‐keyword identifier can be used for the type  parameter b t b con ention the parameter starts ith parameter, but by convention, the parameter starts with  an uppercase letter

– The type parameter can be used like other types used in 

the definition of a class


Tip: Compile with the -Xlint Option Tip:  Compile with the -Xlint Option

h i f ll h b

• There are many pitfalls that can be 

encountered when using type parameters

• Compiling with the  -Xlint option will  provide more informative diagnostics of any 

p g y

problems or potential problems in the code

javac –Xlint javac Xlint

14‐45 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

A Generic Ordered Pair Class  (Part 1 of 4)

14‐46 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

A Generic Ordered Pair Class  (Part 2 of 4)

A Generic Ordered Pair Class 

(Part 3 of 4)


A Generic Ordered Pair Class  (Part 4 of 4)

14‐49 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Using Our Ordered Pair Class  (Part 1 of 3)

14‐50 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Using Our Ordered Pair Class  (Part 2 of 3)

Using Our Ordered Pair Class 

(Part 3 of 3)


Pitfall:  A Generic Constructor Name Has No  Type Parameter

• Although the class name in a parameterized class definition has a type

• Although the class name in a parameterized class definition has a type  parameter attached, the type parameter is not used in the heading of the  constructor definition

public Pair<T>() public Pair<T>()

• A constructor can use the type parameter as the type for a parameter of  the constructor, but in this case, the angular brackets are not used

public Pair(T first T second) public Pair(T first, T second)

• However, when a generic class is instantiated, the angular  brackets are used

P i St i i

Pair<String> pair =

new Pair<STring>("Happy", "Day");

14‐53 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Pitfall:  A Primitive Type Cannot be Plugged in  for a Type Parameter

• The type plugged in for a type parameter must  always be a reference type y yp

– It cannot be a primitive type such as int,  double , or char

double , or  char

– However, now that Java has automatic boxing, this  is not a big restriction

is not a big restriction

– Note:  reference types can include arrays

14‐54 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Pitfall:  A Type Parameter Cannot Be Used 

E h T N C B U d

Everywhere a Type Name Can Be Used

Withi th d fi iti f t i d l

• Within the definition of a parameterized class  definition, there are places where an ordinary class  name would be allowed, but a type parameter is not name would be allowed, but a type parameter is not  allowed

• In particular, the type parameter cannot be used in  simple expressions using new to create a new object

– For instance, the type parameter cannot be used as a  constructor name or like a constructor:

constructor name or like a constructor:

T object = new T();

T[] a = new T[10];

Pitfall:  An Instantiation of a Generic Class  Cannot be an Array Base Type

• Arrays such as the following are illegal:

Pair<String>[] a = g []

new Pair<String>[10];

Although this is a reasonable thing to want to do – Although this is a reasonable thing to want to do, 

it is not allowed given the way that Java  implements generic classes

implements generic classes


Using Our Ordered Pair Class and  Automatic Boxing (Part 1 of 3)

14‐57 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Using Our Ordered Pair Class and  Automatic Boxing (Part 2 of 3)

14‐58 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Using Our Ordered Pair Class and  Automatic Boxing (Part 3 of 3)

Pitfall:  A Class Definition Can Have More Than  One Type Parameter

• A generic class definition can have any  number of type parameters yp p

– Multiple type parameters are listed in angular 

brackets just as in the single type parameter case,

brackets just as in the single type parameter case, 

but are separated by commas


Multiple Type Parameters (Part 1  of 4)

14‐61 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Multiple Type Parameters (Part 2  of 4)

14‐62 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Multiple Type Parameters (Part 3  of 4)

Multiple Type Parameters (Part 4 

of 4)


Pitfall:  A Generic Class Cannot Be an Exception  Class

i i d i l

• It is not permitted to create a generic class  with  ExceptionErrorThrowable , or  any descendent class of  Throwable

– A generic class cannot be created whose objects  are throwable

public class Gex<T> extends Exception

h b l ll l

– The above example will generate a compiler error  message

14‐65 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Using a Generic Class with Two  Type Parameters (Part 1 of 2)

14‐66 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Using a Generic Class with Two 

Type Parameters (Part 2 of 2) Bounds for Type Parameters Bounds for Type Parameters

S ti it k t t i t th ibl

• Sometimes it makes sense to restrict the possible  types that can be plugged in for a type parameter T

– For instance to ensure that only classes that implement For instance, to ensure that only classes that implement  the Comparable interface are plugged in for T, define a  class as follows:

public class RClass<T extends Comparable>

public class RClass<T extends Comparable>

– "extends Comparable" serves as a bound on the type  parameter T

– Any attempt to plug in a type for T which does not implement the – Any attempt to plug in a type for  T which does not implement the 

Comparable interface will result in a compiler error message


Bounds for Type Parameters Bounds for Type Parameters

A b d b l ( h h

• A bound on a type may be a class name (rather than an  interface name)

– Then only descendent classes of the bounding class may be plugged in Then only descendent classes of the bounding class may be plugged in  for the type parameters

public class ExClass<T extends Class1>

• A bounds expression may contain multiple interfaces and up

• A bounds expression may contain multiple interfaces and up  to one class

• If there is more than one type parameter, the syntax is as If there is more than one type parameter, the syntax is as  follows:

public class Two<T1 extends Class1, T2 extends Class2 & Comparable>

Class2 & Comparable>

14‐69 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

A Bounded Type Parameter A Bounded Type Parameter

14‐70 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Tip: Generic Interfaces Tip:  Generic Interfaces

• An interface can have one or more type  parameters


• The details and notation are the same as they  are for classes with type parameters

are for classes with type parameters

Generic Methods Generic Methods

Wh i l i d fi d th t t

• When a generic class is defined, the type parameter  can be used in the definitions of the methods for  that generic class

that generic class

• In addition, a generic method can be defined that  has its own type parameter that is not the type  parameter of any class

– A generic method can be a member of an ordinary class or  a member of a generic class that has some other type a member of a generic class that has some other type  parameter

– The type parameter of a generic method is local to that  th d t t th l

method, not to the class


Generic Methods Generic Methods

Th b l d (i l

• The type parameter must be placed (in angular  brackets) after all the modifiers, and before the  returned type

returned type

public static <T> T genMethod(T[] a)

• When one of these generic methods is invoked the

• When one of these generic methods is invoked, the  method name is prefaced with the type to be 

plugged in enclosed in angular brackets plugged in, enclosed in angular brackets

String s = NonG.<String>genMethod(c);

14‐73 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Inheritance with Generic Classes Inheritance with Generic Classes

A i l b d fi d d i d l f

• A generic class can be defined as a derived class of  an ordinary class or of another generic class

– As in ordinary classes an object of the subclass type would As in ordinary classes, an object of the subclass type would  also be of the superclass type

• Given two classes:  A and  B , and given G: a generic 

l h l h b d

class, there is no relationship between  G<A> and  G<B>

This is true regardless of the relationship between class A – This is true regardless of the relationship between class A

and B, e.g., if class B is a subclass of class A

14‐74 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

A Derived Generic Class (Part 1 of  2)

A Derived Generic Class (Part 2 of 



Using UnorderedPair (Part 1 of 2) Using UnorderedPair (Part 1 of 2)

14‐77 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.

Using UnorderedPair (Part 2 of 2) Using UnorderedPair (Part 2 of 2)

14‐78 Copyright © 2012 Pearson Addison‐Wesley. All rights reserved.




Related subjects :