Java - All The Modern Buzzwords: Simple
Java - All The Modern Buzzwords: Simple
Java
This handout introduces the basics of Java, OOP style, classes, objects, messages,
methods, constructors, and “this”, arrays, static, and collections. See also, the many Java
links off the course page.
1
CS193i Handout #19
Summer 2004 Kelly A. Shaw
Bytecode
A compiled class stored in a .class files or .jar file
Represent a computation in a portable way – as PDF is to text and images
2
CS193i Handout #19
Summer 2004 Kelly A. Shaw
program to compile. In some cases, hotspot can do a better job of optimization than a
C++ compiler, since hotpsot is playing with the code at runtime and so has more
information. Java performance is now similar to C performance – faster in some cases,
slower in others. Memory use and startup time are worse than C.
Java Lang + Its Libraries
The core Java language is not that big
However, it is packaged with an enormous number of standard "library" or "off the
shelf" classes that solve common problems for you
e.g. String, ArrayList, HashMap, StringTokenizer, HTTPConnection, Date, ...
Java programmers are more productive in part because they have access to a large set of
standard, well documented library classes.
3
CS193i Handout #19
Summer 2004 Kelly A. Shaw
Using more memory and CPU time but less programmer time is an increasingly
appealing tradeoff.
Robustness and portability can be very useful features
I suspect we will be using some version of the Java language for the next 10 or 20 years.
OOP Structure
Objects
Storage
Objects store state at runtime in the form of instance variables (aka ivars)
Behavior
Objects will also in some sense take an active role. Each object has a set of
operations (aka methods) that it can perform, usually on itself.
Class
Every object belongs to a class that defines its storage and behavior. An object
always remembers its class (in Java).
"Instance" is another word for object – an "instance" of a class.
Anthropomorphic – self-contained
Procedural variables are passive – they just sit there. A procedure is called and it
changes the variable.
Objects are anthropomorphic-- the object has both storage and behavior to
operate on that state.
String example
Could have a couple String objects, each of which stores a sequence of characters. The
objects belong to the String class. The String class defines the storage and operations for
the String objects...
4
CS193i Handout #19
Summer 2004 Kelly A. Shaw
Message / Receiver
Suppose we have Student objects, each of which has a current number of units. The
message getUnits() requests the units from a student.
Java syntax:
a.getUnits()
send the "getUnits()" message to the receiver "a"
Receiver
The "receiver" is the object receiving the message. Typically, the operation uses
the receiver's memory.
Method (code)
A “method” is executable code defined in a class.
The objects of a class use the methods defined in their class.
The String class defines the code for length() and reverse() methods. The methods are
run by sending the "length()" or "reverse()" message to a String object.
5
CS193i Handout #19
Summer 2004 Kelly A. Shaw
1. The receiver, x, is of some class – suppose x is of the String class
2. Look in that class of the receiver for a matching reverse() method (code)
3. Execute that code “against” the receiver – using its memory (instance variables)
In Java this is “dynamic” – the message/method resolution uses the true, runtime class
of the receiver.
6
CS193i Handout #19
Summer 2004 Kelly A. Shaw
7
CS193i Handout #19
Summer 2004 Kelly A. Shaw
Object Pointers
The declaration “Student x;” declares a pointer “x” to a Student object, but does not
allocate the object yet.
Java has a very simple and uniform memory system. Objects and arrays are allocated in
the heap and accessed through pointers.
There is no "&" operator to make a pointer to something in the stack and there is no
pointer arithmetic. The only pointers that exist in Java point to objects and arrays in the
heap – simple.
Objects and arrays are allocated with the "new" operator (below).
Using = on an object pointer just copies the pointer, so there are multiple
pointers to the one object (aka "shallow" or "sharing").
Likewise, using == does a shallow comparison of the two pointers – true if the
two pointers point to the same object. For some classes, the equals() method will
do a "deep" comparison of two objects.
8
CS193i Handout #19
Summer 2004 Kelly A. Shaw
Message send
Send a message to an object.
a.getUnits();
b.getStress();
Finds the matching method in the class of the receiver, executes that method against the
receiver and returns.
The Java compiler checks the names and types of all message sends at compile time, and
only allows message sends that the receiver responds to.
Object Lifecycle
The client allocates objects and they are initialized by the class ctor code
The client then sends messages which run class method code on the objects.
The client essentially makes requests – all the code that actually operates on the objects
is defined by the class, not the client.
As a result, if the class is written correctly, the client should not be able to introduce
new bugs in the class and visa-versa.
This is the benefit of using public/private to keep the client and the implementation
separate.
9
CS193i Handout #19
Summer 2004 Kelly A. Shaw
System.out.println("b units:" + b.getUnits() + " stress:" +
b.getStress());
/* OUTPUT...
a units:12 stress:120
b units:15 stress:150
a units:9 stress:90
a units:10 stress:100
*/
Class Definition
A class defines the instance variables and methods used by its objects.
Each variable and method may be declared as "public" if it may be used by clients, or
"private" or "protected" if it is part of the implementation and not for use by clients.
The compiler and JVM enforce the public/private scheme.
Public Interface
The most common public/private scheme is...
All ivars are declared private
Methods to be used by clients are declared public – these make up the interface that the
class exposes to clients.
Utility methods for the internal use of the class are declared private.
Java Class
The convention is that Java classes have upper case names like “Student” and the code
is in a file named “Student.java”.
10
CS193i Handout #19
Summer 2004 Kelly A. Shaw
By default, Java classes have the special class "Object" as a superclass. We'll look at what
that means later when we study superclasses.
Inside the Student.java file, the class definition looks like...
The “extends Object” part can be omitted, since Java classes extend Object by default if
no “extends” clause is specified.
There are not separate .h and .c files to keep in synch – the class is defined in one place.
This is a nice example of the "never have two copies of anything" rule. Keeping
duplicate info in the .h and .c files in synch was a bore – better to just have one
copy.
The object itself is allocated in the heap, and its ivars are stored inside it. The ivars may
be primitive types, such as int, or they may be pointers to other objects or arrays.
The Heap
public/private/protected
An ivar or other element declared private is not accessible to client code. The element is
only accessible to the implementation inside the class.
Suppose on the client side we have a pointer "s" to a Student object. The statement
"s.units = 13;" in client code will not compile if "units" is private or protected.
11
CS193i Handout #19
Summer 2004 Kelly A. Shaw
"protected" is similar to private, but allows access by subclasses or other classes in the
same package (we will not worry about those cases)
There is also a "default" protection level that you get when no public, private, or
protected is specified. In that case, the element is accessible to all other classes in the
same package as the compiled class. This is an odd case, and I recommend against using
it.
Constructor (ctor)
A constructor has the same name as the class. It runs when new objects of the class are
created to set up their ivars.
public Student(int initUnits) {
units = initUnits;
}
A constructor does not have a return type (unlike a method).
New objects are set to all 0's first, then the ctor (if any) is run to further initialize the
object.
Classes can have multiple ctors, distinguished by different arguments (overloading)
If a class has constructors, the compiler will insist that one of them is invoked when
new is called.
If a class has no ctors, new objects will just have the default "all 0's" state. As a matter of
style, a class that is at all complex should have a ctor.
Bug control
Ctors make it easier for the client to do the right thing since objects are
automatically put into an initialized state when they are created.
Every ivar goes in Ctor
Every time you add an instance variable to a class, go add the line to the ctor that
inits that variable.
Or you can give an initial value to the ivar right where it is declared, like this...
"private int units = 0;" – there is not agreement about which ivar init style is
better.
Default Ctor
A constructor with no arguments is known as the “default ctor”.
public Student() {
units = 15;
}
If a class has a default ctor, and a client creates an instance of that class, but without
specifying a ctor, the default ctor is automatically invoked.
e.g. new Student() – invokes the default ctor, if there is one.
12
CS193i Handout #19
Summer 2004 Kelly A. Shaw
Method
A method corresponds to a message that the object responds to
public int getStress() {
return(units * 10);
}
When a message is sent to an object, the corresponding method runs against that that
object (the receiver). Methods may have a return type, int in the above example, or may
return void.
Message-Method Lookup sequence
Message sent to a receiver
Receiver knows its class and looks for a matching method
The matching method executes against the receiver
13
CS193i Handout #19
Summer 2004 Kelly A. Shaw
Ivar read/write operations in the method code use the ivars of the receiver
Method code is written in a “receiver relative” style where the state of the receiver is
implicitly present. This makes data access very convenient in method code compared to
writing in C.
e.g. the “units” ivar in the Student methods is automatically that of the receiver
Likewise, sending a message to the same receiver from inside a method requires no
extra syntax.
e.g.. inside the Student dropClass() method, the code sends the setUnits()
message to change the number of units with the simple syntax: setUnits(units -
drop);
“this” – receiver
“this” in a method
“this” is a pointer to the receiver
Don’t need to write “this.units”, write: “units”
Don’t need to write “this.setUnits(5)”, write “setUnits(5);”
Some programmers like sprinkling “this” around to remind themselves of the OOP
structure involved, but it can get distracting. The nice thing about OOP is the
effortlessness of the receiver-relative style.
A common use of “this” is when one object is trying to register itself with another
object.
e.g. myFriend.callMeBackLater(this);
14
CS193i Handout #19
Summer 2004 Kelly A. Shaw
15
CS193i Handout #19
Summer 2004 Kelly A. Shaw
public class Student extends Object {
// NOTE this is an "instance variable" named "units"
// Every Student object will have its own units variable.
// "protected" and "private" mean that clients do not
// get access
protected int units;
/* NOTE
* "public static final" declares a public readable
* constant that is associated with the class --
* it's full name is Student.MAX_UNITS.
* It's a convention to put constants like
* that in upper case.
*/
public static final int MAX_UNITS = 20;
public static final int DEFAULT_UNITS = 15;
16
CS193i Handout #19
Summer 2004 Kelly A. Shaw
/*
OUTPUT...
a units:12 stress:120
b units:15 stress:150
a units:9 stress:90
a units:10 stress:100
*/
}
}
17
CS193i Handout #19
Summer 2004 Kelly A. Shaw
Java Features
Inheritance – ignore for now
OOP languages have an important feature called “inheritance” where a class can be
declared as a “subclass” of another class, known as the superclass.
In that case, the subclass inherits the features of the superclass. This is a tidy way to give
the subclass features from its superclass – a form of code sharing.
This is an important feature in some cases, but we can do without it for now. By default
in Java, classes have the superclass “Object” – this means that all classes inherit the
methods defined in the Object class.
Java Primitives
Java has “primitive” types, much like C. Unlike C, the sizes of the primitives are fixed
and do not vary from one platform to another, and there are no unsigned variants.
boolean -- true or false
byte -- 1 byte
char -- 2 bytes (unicode)
int -- 4 bytes
long -- 8 bytes
float -- 4 bytes
double -- 8 bytes
Primitives can be used for local variables, parameters, and ivars.
Local variables are allocated on the runtime stack when the code runs, just as in C. At
runtime, primitives are simple and work fast.
Primitives may be allocated inside objects or arrays, however, it is not possible to get a
pointer to a primitive itself (there is no & operator). Pointers only work for objects and
arrays in the heap – this makes pointers much simpler in Java than in C or C++.
Java is divided into two worlds: primitives work in simple ways and there are no
pointers, while objects and arrays only work through pointers. The two worlds are
separate, and the boundary between the two can be a little awkward.
There are “wrapper” classes Integer, Boolean, Float, Double.... that can hold a single
primitive value. These classes are "immutable", they cannot be changed once
constructed. They can finesse, to some extent, the situation where you have a primitive
value, but need a pointer to it. Use intValue() to get the int value out of an Integer
object.
18
CS193i Handout #19
Summer 2004 Kelly A. Shaw
Arrays
Java has a nice array functionality built in to the language.
An array is declared according to the type of element – an int[] array holds ints, and a
Student[] array holds Student objects.
Arrays are always allocated in the heap with the “new” operator and accessed through
pointers (like objects)
An array may be allocated to be any size, although it may not change size after it is
allocated (i.e. there is no equivalent to the C realloc() call).
Array Declaration
int[] a; -- a can point to an array of ints (the array itself is not yet allocated)
int a[]; -- alternate syntax for C refugees – do not use!
Student[] b; -- b can point to an array of Student objects. The array will hold
pointers to Student objects.
a = new int[100];
Allocate the array in the heap with the given size
Like allocating a new object
The array elements are all zeroed out when allocated.
The requested array length does not need to be a constant – it could be an
expression like new int[2*i +100];
Array element access
Elements are accessed 0..len-1, just like C and C++
Java detects array-out--of-bounds access at runtime
a[0] = 1; -- first element
a[99] = 2; -- last element
a[-1] = 3; -- runtime array bounds exception
a.length – returns the length of the array (read-only)
Arrays know their length -- cool!
NOT a.length()
Arrays have compile-time types
a[0] = "a string"; // NO -- int and String don't match
At compile time, arrays know their element type and detect type mismatches
such as above. The other Java collections, such as ArrayList, do not have this
compile time type system error catching, although it is rumored that compile
time types are being added for Java 1.5 (out soon).
Student[] b = new Student[100];
Allocates an array of 100 Student pointers (initially all null)
Does not allocate any Student objects -- that's a separate pass
19
CS193i Handout #19
Summer 2004 Kelly A. Shaw
int[] squares;
squares = new int[100]; // allocate the array in the heap
for (int i=0; i<squares.length; i++) {// iterate over the array
squares[i] = (i+1) * (i+1);
}
Student[] students;
students = new Student[100]; // 1. allocate the array
Array Literal
There's a syntax to specify an array and its contents as part of an array variable
declaration.
This is called an "array constant" or an "array literal".
Anonymous array
Alternately, you can create outside of a variable declaration like this…
… new String[] { "foo", "bar", "baz"} ...
Array Utilities
Java has a few utility functions to help with arrays...
There is a method in the System class, System.arraycopy(), that will copy a section of
elements from one array to another. This is likely faster than writing the equivalent for-
loop yourself.
System.arraycopy(source array, source index, dest array, dest index, length);
Arrays Class
The Arrays class contains many convenience methods that work on arrays -
filling, searching, sorting, etc.
20
CS193i Handout #19
Summer 2004 Kelly A. Shaw
21
CS193i Handout #19
Summer 2004 Kelly A. Shaw
Multidimensional Arrays
An array with more dimensions is allocated like this...
int[][] big = new int[100][100]; // allocate a 100x100 array
big[0][1] = 10; // refer to (0,1) element
Unlike C, a 2-d java array is not allocated as a single block of memory. Instead, it is
implemented as a 1-d array of pointers to 1-d arrays.
String
Java has a great built-in String class. See the String class docs to see the many operations
it supports.
Strings (and char) use 2-byte unicode characters – work with Kanji, Russian, etc.
String objects use the “immutable” design style
Never change once created
i.e. there is no append() or reverse() method that changes a string object
To represent a different string state, create a new string with the different state
The immutable style, has an appealing simplicity to it – easy for clients to
understand.
The immutable style happens to avoid many complexities when dealing with (a)
multiple pointers sharing one object, and (b) multiple threads sharing one object.
On the other hand, the immutable style can cause the program to work through a
lot of memory over time which can be expensive.
String constants
Double quotes (") build String objects
“Hello World!\n” – builds a String object with the given chars and returns a
pointer to it
The expression new String("hello") is a little silly, can just say "hello". Use single
quotes for a char 'a', 'B', '\n'
System.out.print("print out a string"); // or use println() to include the endline
String + String
+ concats strings together – creates a new String based on the other two
String a = "foo";
String b = a + "bar"; // b is now "foobar"
Backslash
Use backslash (\) to include funny characters in a string...
\n -- newline
\t -- tab
\" -- double quote
\\ -- a backslash
toString()
Many objects support a toString() method that creates some sort of String version
of the object – handy for debugging. print(), println(), and + will use the
toString() of any object passed in. The toString() method is defined up in the
Object class, so that's why all classes respond to it. (More on this when we talk
about inheritance.)
22
CS193i Handout #19
Summer 2004 Kelly A. Shaw
23
CS193i Handout #19
Summer 2004 Kelly A. Shaw
String Methods
Here are some of the representative methods implemented in the String class
Look in the String class docs for the many messages it responds to…
int length() – number of chars
char charAt(int index) – char at given 0-based index
int indexOf(char c) – first occurrence of char, or -1
int indexOf(String s)
boolean equals(Object) – test if two strings have the same characters
boolean equalsIgnoreCase(Object) – as above, but ignoring case
String substring(int begin, int end) – return a new String made of the begin..end-
1 substring from the original
String trim() – returns a string where whitespace characters from the front and
back have been deleted.
StringBuffer
StringBuffer is similar to String, but can change the chars over time. More efficient to
change one StringBuffer over time, than to create 20 slightly different String objects
over time.
24
CS193i Handout #19
Summer 2004 Kelly A. Shaw
System.out
System.out is a static object in the System class that represents standard output. It
responds to the messages...
println(String) – print the given string on a line (using the end-line character of
the local operating system)
print(String) – as above, but without an end-line
Example
System.out.println("hello"); // prints to standard out
== vs equals()
== compares primitives or pointers
boolean equals(Object other)
There is a default definition in the Object superclass that just does an == compare
of (this == other), so it's just like using == directly.
String Example
String a = new String("hello"); // can write this as "hello"
String a2 = "hello";
a == a2 // false
a.equals(a2) // true
Foo Example
Foo a = new Foo("a");
Foo a2 = new Foo("a");
a == a2 // false
a.equals(a2) // ??? – depends on Foo overriding equals()
GC slows Java code down a little, but eliminates all those &/malloc()/free()
bugs. The GC algorithm is very sophisticated, and its efficiency depends very
much on the memory use pattern of the program.
25
CS193i Handout #19
Summer 2004 Kelly A. Shaw
26
CS193i Handout #19
Summer 2004 Kelly A. Shaw
Stack vs. Heap
Remember, stack memory (where locals are allocated for a method call), is much
faster than heap memory for allocation and deallocation.
Destructor
In C++, the "destructor" is an explicit notification that the object is about to be
destroyed.
Static
Variables or methods in a class may be declared “static”.
Regular ivars and methods are associated with objects of the class.
Static variables and methods are not associated with an object of the class. Instead, they
are associated with the class itself.
Static variable
A static variable is like a global variable, except it exists inside of a class.
There is a single copy of the static variable inside the class. In contrast, regular ivars
such as “units” exist many times – once for each object of the class.
Static variables are rare compared to ordinary ivars.
27
CS193i Handout #19
Summer 2004 Kelly A. Shaw
The full name of a static variable includes the name of its class – so a static variable
named “count” in the Student class would be referred to as "Student.count".
Output Example
“System.out” is a static variable in the System class that represents standard
output.
Monster Example
Suppose you are implementing the game Doom 9. You have a Monster class that
represents the monsters that run around in the game. Each monster object needs
access to a Sound object that holds the sound "roar.mp3". so the monster can play
that sound at the right moment. With a regular ivar, each monster would have
their own copy of the variable. Instead, the Monster class contains a static Sound
variable, and all the monster objects share that one variable.
Static methods
A static method is like a function that is defined inside a class.
A static method does not execute against a receiver. Instead, it is like a plain C function
– it takes arguments, but there is no receiver.
The full name of a static method includes the name of its class, so a static foo() method
in the Student class is called Student.foo(). This allows you to distinguish between foo()
mehods defined in different classes.
The Math class contains the common math functions, such as sin(), cos(), etc.. These are
defined as static methods in the Math class. Their full names are Math.sin(), Math.cos(),
...
The System.arraycopy() method is another example of a static method. The static
method does not have a receiver that it executes against. Instead, we call it like a regular
function, and pass it the arguments to work on.
A “static int getCount()” method in the Student class is invoked as Student.getCount();
In contrast, a regular method would be invoked with a message send to a receiver like
s.getStress(); where s points to a Student object.
The method “public static void main(String[] args)” is special. To run a java program,
you specify the name of a class. The system then starts the program by running the
static main() function in that class, and the String[] array represents the command-line
arguments.
Call a static method like this: Student.foo(), NOT s.foo(); where s points to a Student.
s.foo() actually compiles, but it discards s as a receiver and translates to the same
thing as Student.foo() using the compile-time type of the receiver variable. The
s.foo() syntax is misleading, since it makes it look like a regular message send.
28
CS193i Handout #19
Summer 2004 Kelly A. Shaw
29
CS193i Handout #19
Summer 2004 Kelly A. Shaw
Collections
Built-in classes for common storage problems (like the C++ Standard Template Library
(STL))
We'll look at basic features of the Collection classes now, and see more detail later on
Collection type (sequence/set) – ArrayList is the most useful
Map type (hash table/dictionary) – HashMap is the most useful
They only store pointers
See the Sun docs: http://java.sun.com/docs/books/tutorial/collections/
The collection classes use inheritance and interfaces, but we are ignoring that for now.
We will just look at the basic uses of a collection classes.
Collection Design
As much as possible, all the various classes implement the same interface so they use
the same method names (e.g. add(), iterator(), ...), so you can substitute one type of
collection for another. This also makes it easier to learn, since the method names are all
consistent.
At runtime, java checks all casts, so a bad cast will be caught at that time.
Collection Messages
There are a few basic methods, and everything else is built on them. constructor() –
collection with no elements
Actually, a Java interface cannot specify a ctor or static method, but all the
collection classes implement the default ctor at a minimum.
30
CS193i Handout #19
Summer 2004 Kelly A. Shaw
The iterator responds to...
-hasNext() – returns true if more elements,
-next() – returns the next element
-remove() – removes the element returned by the previous call to next()
It is not valid to modify the collection directly while the iterator is iterating
e.g. calling collection.add(), collection.remove(). It is valid to modify the
collection through the iterator – iterator.remove().
31
CS193i Handout #19
Summer 2004 Kelly A. Shaw
Java Miscellaneous
Book
Our optional/recommended book, Core Web Programming, includes lots of basic
material on Java, exceptions, socket programming, and HTTP programming in
particular.
Streams
InputStream – read from
OutputStream – write to
Reader/Writer variants – use for text, so you can read/write strings and chars and it
will take care of unicode conversion
"Layered" design – wrap a stream around another to layer up effects.
BufferedReader in = new BufferedReader(new FileReader( ... );
Text Reading
Below is the standard incantation to read a text file.
We construct a FileReader object, that takes either a File object or a String filename.
readLine() recognizes the many different end-line conventions, and strips all the end-
line chars before returning the string.
It's polite to close() the reader when done. This may help free up resources in the VM.
However, code that forgets to close() will generally still work.
String line;
while ((line = in.readLine()) != null) {
32
CS193i Handout #19
Summer 2004 Kelly A. Shaw
// do something with 'line'
System.out.println(line);
}
Text Writing
Writing is pretty similar.
We construct a BufferedWriter on a FileWriter
The writer responds to print() and println() messages to write strings and chars.
Text Writing Code
public void writeLines(String fname) {
try {
// Build a writer on the fname (also works on File objects)
BufferedWriter out = new BufferedWriter(new FileWriter(fname));
out.close(); // polite
}
catch (IOException e) {
e.printStackTrace();
}
}
33
CS193i Handout #19
Summer 2004 Kelly A. Shaw
while((count = in.read(buff)) != -1) {
out.write(buff, 0, count);
}
in.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
Exceptions
An exception is an error condition that arises at runtime – it can stop the normal
sequence of instructions and jump to an error handling section.
The error handling code may be in the same method, or the current method may exit
immediately to jump to error handling code in an earlier method that called the current
method.
Many stream operations can throw exceptions
In Java, the compiler will insist that most types of exception are caught by the code.
throws clause
If code might throw an exception, it can be wrapped in a try/catch (below) to handle
the exception locally.
Or, a method may add a"throws" clause to its prototype to indicate that it may generate
an exception back to its caller.
e.g. public void foo() throws IOException { ....}
34
CS193i Handout #19
Summer 2004 Kelly A. Shaw
public void fileRead(String fname) { // NOTE no throws
try {
// this is the standard way to read a text file...
FileReader reader = new FileReader(new File(fname));
BufferedReader in = new BufferedReader(reader);
String line;
while ((line = in.readLine()) != null) {
...
// readLine() etc. can fail in various ways with
// an IOException
}
ClientSocket
Open a client socket
Use input/output streams
Note the manual use of flush() to send the output (vs auto-flush in Perl)
We use a StringBuffer, since it does append() more efficiently, than a series of string =
string + string operations.
Socket sock = new Socket("hostname", 80);
PrintWriter out = new PrintWriter(sock.getOutputStream());
BufferedReader in =
new BufferedReader(new InputStreamReader(sock.getInputStream()));
out.print("GET / HTTP/1.0\r\n");
out.print("\r\n");
out.flush(); // ok, really send the output
35
CS193i Handout #19
Summer 2004 Kelly A. Shaw
ServerSocket
Same concepts as in Perl, just different syntax
while (true) {
Socket sock = serv.accept(); // blocks like in Perl
BufferedReader in =
new BufferedReader(
new InputStreamReader(sock.getInputStream()));
URL
•Built-in class
We'll use it for relative/absolute URL conversion
Can throw an exception on protocols it doesn't know
ArrayList
See the main Java document above.
Pattern
The Pattern class stores a regular expression pattern. (See the Pattern class docs)
The regular expression chars work as in Perl: . \w \s * + and so on.
The regular expression is defined in a Java String, which has its own use of the
backslash (\).
For that reason, each backslash needs a backslash in front of it so it goes through.
To express for example, \w, in the Java string we have to write “\\w”.
Pattern of two \w words separated by whitespace
Pattern p1 = Pattern.compile("\\w+\\s+\\w+");
Pattern of “hello” followed by space followed by a word. Not case sensitive variant.
Pattern p2 = Pattern.compile("hello\\s+\\w+",
Pattern.CASE_INSENSITIVE);
The Pattern.MULTILINE option allows the matching to span across lines
36
CS193i Handout #19
Summer 2004 Kelly A. Shaw
Matcher
A Matcher runs a pattern on some text to find all the matching sections of text. (See the
Matcher class docs)
Matcher mat = pat.matcher(text);
Responds to find() to find successive matches
Responds to group() to return the matched text
Responds to group(i) to return the ith (..) sub-part of the matched text (like $1, $2 ... in
Perl)
Example \w Extraction
Suppose we have "hello SOMEWORD" and we want to extract the word.
Pattern pat = Pattern.compile("hello\\s+(\\w+)");
The same regular expression written in Perl would be “\{(.*?)\}”. We need a double
\\ in Java, because \ is normally used as an escape character. To have the \ be
represented in a Java String, we need to escape it with a \. =)
37