* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
Download Chapter 10 Dynamic Data Structures and Generics
Abstraction (computer science) wikipedia , lookup
Java syntax wikipedia , lookup
Falcon (programming language) wikipedia , lookup
Design Patterns wikipedia , lookup
K-nearest neighbors algorithm wikipedia , lookup
Name mangling wikipedia , lookup
Linked list wikipedia , lookup
Object-oriented programming wikipedia , lookup
Covariance and contravariance (computer science) wikipedia , lookup
Go (programming language) wikipedia , lookup
Class (computer programming) wikipedia , lookup
Generic programming wikipedia , lookup
Corecursion wikipedia , lookup
Dynamic Data Structures and
Generics
Chapter 10
Outline
• Vectors
• Linked Data Structures
• Introduction to Generics
Introduction
• A data structure is a construct used to
organize data in a specific way.
• An array is a static data structure.
• Dynamic data structures can grow and shrink
while a program is running.
• Vectors and linked data structures are
dynamic.
• Vectors are similar to arrays, but offer more
flexibility.
Introduction, cont.
• The linked list is a simple but useful linked
data structure that makes use of inner
classes.
• An inner class is a class definition within
another class definition.
• Java 5.0 allows definitions with parameters
for types.
• These definitions are known as generics.
Vectors: Outline
• Introduction to Vectors
• Using Vectors
• Parameterized Classes and Generics
Introduction to Vectors
• We can think of vectors as arrays that grow
and shrink while a program is running.
• At the time an array is created, its length is
fixed.
– Sometimes an array turns out to be too
small for its intended use.
– Sometimes an array turns out to be too
large for its intended use, but the unused
portion of the array is not available for
other purposes.
Introduction to Vectors, cont.
• Vectors serve the same purposes as arrays,
but can change in length while a program is
running.
• This added flexibility comes at a price:
– Vectors are less efficient than arrays.
– The base type of a vector must be a class
type rather than a primitive type.
(Automatic boxing and unboxing make this
requirement less significant.)
Using Vectors
• The definition of class Vector must be
imported.
import java.util.*;
• to create and name a vector
vector<String> v = new Vector<String>(20);
– The vector v stores objects of class String
and has an initial capacity of 20.
Using Vectors, cont.
– When more capacity is needed, the system
allocates more memory automatically.
– If the initial capacity was sufficient, the
code is more efficient.
• In this example, the base type is type String.
– Any class can be used as the base type.
– But, wrapper classes must be used for
primitive types.
Creating and Naming a Vector
• syntax
Vector<Base_Type> v1 = new
Vector<Base_Type>();
Vector<Base_Type> v2 = new
Vector<Base_Type>(Initial_Capacity);
Vector<Base_Type> v2 = new
Vector<Base_Type>(Initial_Capacity,
Capacity_Increment);
Adding, Getting, and Setting
Values
• to add an element
v.addElement(“Hello!);
• to get the value of an element
String temp = v.elementAt(index);
• to change the value of an existing element
v.setElementAt(“Hi, Mom!”, index);
Inserting and Removing
Values
• to insert an element
v.insertElementAt(“Good-bye”, position);
– elements at index position or higher move
to index positions greater by one.
• to remove an element from a position
v.removeElementAt(postion);
• to remove the first occurrence of an element
boolean done = v.removeElement(“Hello!”);
• to remove all elements
v.removeAllElements();
Searching a Vector
• to learn if an element is in the vector
boolean found = v.contains(“Good-bye”);
• to learn the location of the first occurrence of
an element
int position = v.indexOf(“Hi, Mom!”);
• to learn the location of the first occurrence of
an element at or after a position
int position = v.indexOf(“Hello”,
startFrom);
Searching a Vector, cont.
• to learn the location of the last occurrence of
an element
int position =
v.lastIndexOf(“Hi, Mom!”);
• to learn the value of the first element
String first = v.firstElement();
• to learn the value of the last element
String first = v.lastElement();
Size and Capacity
• to learn if the vector is empty
boolean none = v.isEmpty();
• to learn the size of the vector
int howMany = v.size();
• to learn the current capacity
int howBig = v.capacity();
• to make room for more elements
v.ensureCapacity(moreElements);
• to trim to the current size
v.trimToSize();
• to set the size
v.setSize(howMany);
Vector Demonstration
Using Method clone
• When used with a vector, the assignment
statement creates another reference to the
same vector.
• To make a copy of a vector, use
otherV = (Vector<String>)v.clone();
using a correct type cast.
• On the other hand
Vector otherV = v.clone(); //ILLEGAL
will produce an error message.
Using Method clone, cont.
• Accessor methods should not return a private
instance variable of type Vector.
• Accessor methods should return a copy of the
vector, not the private instance vector itself.
• Method clone can be used to produce a copy
of the private instance vector.
Using Method clone, cont.
• However, the return type of method clone is
Object.
• Hence, the appropriate form is
public Vector<String> getVector()
{
return (Vector<String>)v.clone();
}
• Any objects stored in the vector also must
have appropriate accessor methods.
Parameterized Classes and
Generics
• The class Vector is a parameterized class.
• Its parameter, denoted Base_Type, can be
replaced by any class type.
• Java 5.0 allows definitions, called generic
definitions or simply generics, with
parameters for types.
(optional) Newer Collection
Classes
• A new group of classes implement the
Collection interface.
– These classes are known as collection
classes.
• The Vector definition has been retrofitted to be
a collection class.
AbstractList class
• Roughly equivalent to Vector except
that it is unsynchronized.
– More efficient in environments that
synchronization are not required
Linked Data Structures:
Outline
•
•
•
•
Linked Lists
Inner Classes
Node Inner Classes
Other Linked Data Structures
Introduction to Linked Data
Structures
• A linked data structure is a collection of
objects (called nodes), each containing data
and a (potential) reference to (at least) one
other node.
Linked Lists
• The predefined LinkedList class is part of the
java.util package.
• Nevertheless, to learn how linked data
structures work, we’ll construct a simplified
example of a linked list.
Linked Lists, cont.
Linked Lists, cont.
• Links, shown as arrows in the previous
diagram, are implemented as references and
are instance variables of the node type.
• The reference marked head is a variable of the
node type which provides access to the first
node in the linked list, but is not itself one of
the nodes.
• Each node is an object of a class that has (at
least) two instance variables:
– the data
– the link.
Linked Lists, cont.
Detecting the Last Node
• There must be means for detecting the last
node.
• A link instance variable with the value null
indicates the last node.
• A reference to the linked list with the value
null indicates an empty linked list.
• The value of the link instance variable is
tested using ==.
A Linked List of Strings
Moving Down a Linked List
Adding a Node at the Start
A Linked List Demonstration
Advancing to the Next Node
Adding a Node
Deleting a Node
Privacy Leaks
• A method such as getLink in class ListNode
returns an instance variable which is a
reference to a node, potentially defeating the
private restriction of the instance variable.
• This problem can be remedied by making
class ListNode a private inner class of class
StringLinkedList.
Inner Classes
• An inner class is a class defined within
another class.
• An inner class provides a solution to the
privacy leak problem.
Defining an Inner Class
public class OuterClass
{
OuterClass_Instance_Variables
OuterClass_Methods
private class InnerClass
{
InnerClass_Instance_Variables
InnerClass_Methods
}
}
Access to Members
• The inner and outer classes’ methods have
access to each other’s methods and instance
variables, even when they are declared
private.
Node Inner Classes
• By making the node class an inner class, data
structure classes become self-contained.
• Further, the accessor and mutator methods of
the inner class can be eliminated since
instance variables of an inner class are
accessible directly.
Node Inner Classes, cont.
Node Inner Classes, cont.
• class StringLinkedListSelfContained, cont.
Other Linked Data Structures
• Many colleges and universities offer a course
devoted entirely to the study of data
structures.
• Typically, a data structure can be
implemented by “linking” its elements
together.
• Example data structures include stacks,
queues, deques, trees, binary trees, graphs,
and directed graphs.
– Refer java.util package
Introduction to Generics
• Java 5.0 allows definitions, called generics,
that include parameters for types.
• Generics can be subtle and full of pitfalls.
• We provide an introduction to generics.
• Serious programming with generics is
presented in more advanced texts.
Generic Basics
• Classes and methods can have a type
parameter.
• Any class type can be substituted for the type
parameter, producing a specific class type or
method.
Generic Basics, cont.
• class Sample<T>
Generic Basics, cont.
• A class definition with a type parameter is
stored in a file and compiled just like any
other class.
• When used in code a class type must be
specified so that it can be substituted for the
type parameter.
Generic Basics, cont.
• example
Sample<String> 01 = new Sample<String>();
o1. setData(“Hello”);
Sample<Species> ow = new Sample<Species>();
Species x = new Species();
<code to set the data for object s>
o2.setData(s);
Generic Basics, cont.
• You cannot substitute a primitive type for a
type parameter.
• You must instead use a class type.
Programming Example: A
Generic Linked List
Programming Example: A
Generic Linked List, cont.
Programming Example: A
Generic Linked List, cont.
Programming Example: A
Generic Linked List, cont.
Generic Constructor
• The class name in a parameterized class
definition has a type parameter attached.
• But, a generic constructor name has no type
parameter and the type parameter is not used
in the heading of the constructor definition.
public LinkedList()
not
public LinkedList<e>() // ILLEGAL
Limited Use of the Type
Parameter
• Within the definition of a parameterized class
definition, there are places where a type
name is allowed, but a type parameter is not
allowed.
• Type parameters cannot be used in simple
expressions that use new to create a new
object.
Limited Use of the Type
Parameter
• examples
T object = new T(); // ILLEGAL
T[] a = new T[10]; // ILLEGAL
– In both cases, the first T is legal, but the
second T is illegal.
Summary
• You have become familiar with vectors.
• You have learned about linked data
structures in Java.
• You have learned how to manipulate linked
lists.
• You have learned about generics
(parameters for types).