Unit 5
Unit 5
Unit 5
Exception Handling
Exception Hierarchy:
library
java
lang
Package
object
Super Class
Throwable
Super Class
Error
Built-in Exceptions
User-Defined Exceptions
Exception
Checked Exception
class
Excepion
Compile time
UnChecked Exception
Logical Error
Linkage Error
Java: JAVA API is a library contains the packages. These were developed by the JavaSoft people
of Sun MicroSystems Inc. used to import the classes in developing the programs.
Lang: lang is a package included in java library. And it is considered as a default package named
as language. Implicitly it is imported into every java programs.
Object: Object is a super class of all classes(user defined, pre-defined classes) directly or
indirectly. Because it is included in the lang package.
Throwable: Throwable is super class of errors and exceptions in java. Throwable is deriving
from the object class.
Error: Error is a class. This is not handled. We known the error in program after the compilation
denoted by the java compiler. Always these were detected at compile time.
An error in a program is called bug. Removing errors from program is called debugging. There
are basically three types of errors in the Java program:
Compile time errors: Errors which occur due to syntax or format is called compile
time errors. These errors are detected by java compiler at compilation time. Desk
checking is solution for compile-time errors.
Example:
import java.io.*;
class Compile
{
static public void main(String args[])
{
System.out.println("hello")
}
}
Output:
Compile.java:16 ; expected
System.out.println("hello")^
1 error
Logical errors: These are the errors that occur due to bad logic in the program. These
errors are rectified by comparing the outputs of the program manually.
Example:
class Salary
{
public static void main(String args[])
{
double sal=5000.00;
Y SUBBA RAYUDU M Tech
sal=sal*15/100; //use:sal+=sal*15/100;
System.out.println("incremented salary:"+sal);
}
}
Output: java Salary
Incremented salary:750.0
Exception: An abnormal event in a program is called Exception.
Exception may occur at compile time or at runtime.
Exceptions which occur at compile time are called Checked exceptions.
Checked Exceptions:
A checked exception is any subclass of Exception (or Exception itself), excluding class
RuntimeException and its subclasses.
You should compulsorily handle the checked exceptions in your code, otherwise your
code will not be compiled. i.e you should put the code which may cause checked
exception in try block. "checked" means they will be checked at compiletime itself.
There are two ways to handle checked exceptions. You may declare the exception using a
throws clause or you may use the try..catch block.
The most perfect example of Checked Exceptions is IOException which should be
handled in your code Compulsorily or else your Code will throw a Compilation Error.
e.g.: ClassNotFoundException, NoSuchMethodException, NoSuchFieldException etc
import java.io.*;
class Sample
{
void accept( ) throws IOException
{
BufferedReader br=new BufferedReader (new InputStreamReader(System.in));
System.out.print ("enter ur name: ");
String name=br.readLine ( );
System.out.println ("Hai "+name);
}
}
Y SUBBA RAYUDU M Tech
class ExceptionNotHandle
{
public static void main (String args[])
{
Sample s=new Sample ( );
s.accept ( );
}
}
Output: javac ExceptionNotHandle.java
ExceptionNotHandle.java:16: unreported exception java.io.IOException must be caught or
declared to be thrown
s.accept();^
1 error
d[3]=99;
int a=5,b=0,c;
c=a/b;
System.out.println("c is:"+c);
System.out.println("okay");
}
}
Output:
Exception in thread main java.lang.ArrayInde xOutOfBoundsException: 3
At V.main (V.java:6)
Concepts of Exception Handling:
exception is an abnormal condition that arises during the execution of a program that disrupts the
normal flow of execution.
Error: When a dynamic linking failure or some other hard failure in the virtual machine occurs,
the virtual machine throws an Error.
Java exception handling is managed via by five keywords: try, catch, throw, throws, finally.
Try: The try block is said to govern the statements enclosed within it and defines the scope of
any exception associated with it. It detects the exceptions.
Catch: The catch block contains a series of legal Java statements. These statements are executed
if and when the exception handler is invoked. It holds an exception.
Throw: To manually throw an exception ,use the keyword throw.
Throws: Any exception that is thrown out of a method must be specified as such by a throws
clause.
Finally: Any code that absolutely must be executed after a try block completes is put in a finally
block. After the exception handler has run, the runtime system passes control to the finally block.
General form of an exception handling:
try
{
Example:
public class ExceptionDemo
{
public static void main(String args[])throws IOException
{
int subject[]={12,23,34,21};
try
{
System.out.println(subject[2]);
System.out.println("not okay");
}
catch(ArrayIndexOutOfBoundException e)
{
Y SUBBA RAYUDU M Tech
Usually only after having tried to cure the cause of an exception, we can say, whether the attempt
was successful or not. Therefore, only the handler of an exception can decide, whether it could
cure the cause for an exception or not. this knowledge is essential, because resumption only
makes sense with the motivation to cure the cause for the exception before resuming normal
execution.
Therefore, we suggest, that the respective handler should indicate, whether to terminate or to
resume.
public void a() {
try { b(); }
catch (Exception1 e1) { ...... }
catch (Exception2 e2) {
/* Try to cure the cause. */
if (error_is_curable)
resume new Solution("the solution");
else { /*Clean up and proceed*
*as with termination.*/ } }
public void b () throws Exception2 {
......
throw new Exception2("Caused by error")
accept (Solution s1) { ...... }
accept (AnotherSolution s2) { ...... }
...... }
Fig. 1. A simple resumption scenario demonstrating the new syntax.
int b = 42 / a;
int c[] = { 1 };
c[42] = 99;
} catch(ArithmeticException e) {
System.out.println("Divide by 0: " + e);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Array index oob: " + e);
}
System.out.println("After try/catch blocks.");
}
}
This program will cause a division-by-zero exception if it is started with no command-line
arguments, since a will equal zero. It will survive the division if you provide a command-line
argument, setting a to something larger than zero. But it will cause an
ArrayIndexOutOfBoundsException, since the int array c has a length of 1, yet the program
attempts to assign a value to c[42].
Here is the output generated by running it both ways:
C:\>java MultiCatch
a=0
Divide by 0: java.lang.ArithmeticException: / by zero
After try/catch blocks.
C:\>java MultiCatch TestArg
a=1
Array index oob: java.lang.ArrayIndexOutOfBoundsException:42
After try/catch blocks.
When you use multiple catch statements, it is important to remember that exception subclasses
must come before any of their superclasses. This is because a catch statement that uses a
superclass will catch exceptions of that type plus any of its subclasses.
Thus, a subclass would never be reached if it came after its superclass. Further, in Java,
unreachable code is an error. For example, consider the following program:
Y SUBBA RAYUDU M Tech
/* This program contains an error. A subclass must come before its superclass in a series of catch
statements. If not, unreachable code will be created and a compile-time error will result.*/
class SuperSubCatch {
public static void main(String args[]) {
try {
int a = 0;
int b = 42 / a;
} catch(Exception e) {
System.out.println("Generic Exception catch.");
}
/* This catch is never reached because
ArithmeticException is a subclass of Exception. */
catch(ArithmeticException e) { // ERROR - unreachable
System.out.println("This is never reached.");
}
}
}
If you try to compile this program, you will receive an error message stating that the second
catch statement is unreachable because the exception has already been caught. Since
ArithmeticException is a subclass of Exception, the first catch statement will handle all
Exception-based errors, including ArithmeticException. This means that the second catch
statement will never execute. To fix the problem, reverse the order of the catch statements.
Nested try Statements
The try statement can be nested. That is, a try statement can be inside the block of another try.
Each time a try statement is entered, the context of that exception is pushed on the stack. If an
inner try statement does not have a catch handler for a particular exception, the stack is unwound
and the next try statements catch handlers are inspected for a match. This continues until one of
the catch statements succeeds, or until all of the nested try statements are exhausted.
If no catch statement matches, then the Java run-time system will handle the exception. Here is
an example that uses nested try statements:
// An example of nested try statements.
class NestTry {
public static void main(String args[]) {
try {
int a = args.length;
/* If no command-line args are present,
the following statement will generate
a divide-by-zero exception. */
int b = 42 / a;
System.out.println("a = " + a);
try { // nested try block
/* If one command-line arg is used,
then a divide-by-zero exception
will be generated by the following code. */
if(a==1) a = a/(a-a); // division by zero
/* If two command-line args are used,
then generate an out-of-bounds exception. */
if(a==2) {
int c[] = { 1 };
c[42] = 99; // generate an out-of-bounds exception
}
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Array index out-of-bounds: " + e);
}
} catch(ArithmeticException e) {
System.out.println("Divide by 0: " + e);
}
}
Y SUBBA RAYUDU M Tech
}
As you can see, this program nests one try block within another. The program works as
follows.When you execute the program with no command-line arguments, a divide-by-zero
exception is generated by the outer try block. Execution of the program with one command-line
argument generates a divide-by-zero exception from within the nested try block. Since the inner
block does not catch this exception, it is passed on to the outer try block, where it is handled. If
you execute the program with two command-line arguments, an array boundary exception is
generated from within the inner try block. Here are sample runs that illustrate each case:
C:\>java NestTry
Divide by 0: java.lang.ArithmeticException: / by zero
C:\>java NestTry One
a=1
Divide by 0: java.lang.ArithmeticException: / by zero
C:\>java NestTry One Two
a=2
Array index out-of-bounds:
java.lang.ArrayIndexOutOfBoundsException:42
Nesting of try statements can occur in less obvious ways when method calls are involved.
For example, you can enclose a call to a method within a try block. Inside that method is another
try statement. In this case, the try within the method is still nested inside the outer try block,
which calls the method. Here is the previous program recoded so that the nested try block is
moved inside the method nesttry( ):
/* Try statements can be implicitly nested via
calls to methods. */
class MethNestTry {
static void nesttry(int a) {
try { // nested try block
/* If one command-line arg is used,
then a divide-by-zero exception
will be generated by the following code. */
if(a==1) a = a/(a-a); // division by zero
Y SUBBA RAYUDU M Tech
So far, you have only been catching exceptions that are thrown by the Java run-time system.
However, it is possible for your program to throw an exception explicitly, using the throw
statement. The general form of throw is shown here:
throw ThrowableInstance;
Here, ThrowableInstance must be an object of type Throwable or a subclass of Throwable.
Primitive types, such as int or char, as well as non-Throwable classes, such as String and Object,
cannot be used as exceptions.
There are two ways you can obtain a Throwable object:
using a parameter in a catch clause,
or creating one with the new operator.
The flow of execution stops immediately after the throw statement; any subsequent statements
are not executed. The nearest enclosing try block is inspected to see if it has a catch statement
that matches the type of exception. If it does find a match, control is transferred to that statement.
If not, then the next enclosing try statement is inspected, and so on. If no matching catch is
found, then the default exception handler halts the program and prints the stack trace.
Here is a sample program that creates and throws an exception. The handler that catches the
exception rethrows it to the outer handler.
// Demonstrate throw.
class ThrowDemo {
static void demoproc() {
try {
throw new NullPointerException("demo");
} catch(NullPointerException e) {
System.out.println("Caught inside demoproc.");
throw e; // rethrow the exception
}
}
public static void main(String args[]) {
try {
demoproc();
} catch(NullPointerException e) {
}
Here is the output generated by running this example program:
inside throwOne
caught java.lang.IllegalAccessException: demo
finally
When exceptions are thrown, execution in a method takes a rather abrupt, nonlinear path that
alters the normal flow through the method. Depending upon how the method is coded, it is even
possible for an exception to cause the method to return prematurely. This could be a problem in
some methods. For example, if a method opens a file upon entry and closes it upon exit, then you
will not want the code that closes the file to be bypassed by the exception-handling mechanism.
The finally keyword is designed to address this contingency.
finally creates a block of code that will be executed after a try/catch block has completed
and before the code following the try/catch block.
The finally block will execute whether or not an exception is thrown. If an exception is
thrown, the finally block will execute even if no catch statement matches the exception.
Any time a method is about to return to the caller from inside a try/catch block, via an
uncaught exception or an explicit return statement, the finally clause is also executed just
before the method returns.
This can be useful for closing file handles and freeing up any other resources that might
have been allocated at the beginning of a method with the intent of disposing of them
before returning.
The finally clause is optional. However, each try statement requires at least one catch or a
finally clause.
Here is an example program that shows three methods that exit in various ways, none without
executing their finally clauses:
// Demonstrate finally.
class FinallyDemo {
// Through an exception out of the method.
static void procA() {
try {
System.out.println("inside procA");
throw new RuntimeException("demo");
} finally {
System.out.println("procA's finally");
Y SUBBA RAYUDU M Tech
}
}
// Return from within a try block.
static void procB() {
try {
System.out.println("inside procB");
return;
} finally {
System.out.println("procB's finally");
}
}
// Execute a try block normally.
static void procC() {
try {
System.out.println("inside procC");
} finally {
System.out.println("procC's finally");
}
}
public static void main(String args[]) {
try {
procA();
} catch (Exception e) {
System.out.println("Exception caught");
}
procB();
procC();
Y SUBBA RAYUDU M Tech
}
}
In this example, procA( ) prematurely breaks out of the try by throwing an exception.
The finally clause is executed on the way out. procB( )s try statement is exited via a
return statement.
The finally clause is executed before procB( ) returns. In procC( ), the try
statementexecutes normally, without error. However, the finally block is still executed.
Here is the output generated by the preceding program:
inside procA
procAs finally
Exception caught
inside procB
procBs finally
inside procC
procCs finally
NOTE: If a finally block is associated with a try, the finally block will be executed upon
conclusion of the try.
Built in Exceptions:
The Exception class does not define any methods of its own. It does, of course, inherit those
methods provided by Throwable. Thus, all exceptions, including those that you create, have the
methods defined by Throwable available to them. They are shown in Table 10-3.
You may also wish to override one or more of these methods in exception classes that you create.
Exception defines four constructors. Two were added by JDK 1.4 to support chained exceptions,
described in the next section. The other two are shown here:
Exception( )
Exception(String msg)
The first form creates an exception that has no description. The second form lets you specify a
description of the exception. Although specifying a description when an exception is created is
often useful, sometimes it is better to override toString( ). Heres why: The version of toString( )
defined by Throwable (and inherited by Exception) first displays the name of the exception
followed by a colon, which is then followed by your description. By overriding toString( ), you
Y SUBBA RAYUDU M Tech
can prevent the exception name and colon from being displayed. This makes for a cleaner output,
which is desirable in some cases.
The following example declares a new subclass of Exception and then uses that subclass to
signal an error condition in a method. It overrides the toString( ) method, allowing a carefully
tailored description of the exception to be displayed.
// This program creates a custom exception type.
class MyException extends Exception {
private int detail;
MyException(int a) {
detail = a;
}
public String toString() {
return "MyException[" + detail + "]";
}
}
class ExceptionDemo {
static void compute(int a) throws MyException {
System.out.println("Called compute(" + a + ")");
if(a > 10)
throw new MyException(a);
System.out.println("Normal exit");
}
public static void main(String args[]) {
try {
compute(1);
compute(20);
} catch (MyException e) {
System.out.println("Caught " + e);
}
}
}
This example defines a subclass of Exception called MyException. This subclass is quite simple:
it has only a constructor plus an overloaded toString( ) method that displays the value of the
exception. The ExceptionDemo class defines a method named compute( ) that throws a
MyException object. The exception is thrown when compute( )s integer parameter is greater
than 10. The main( ) method sets up an exception handler for MyException, then calls
compute( ) with a legal value (less than 10) and an illegal one to show both paths through the
code. Here is the result:
Called compute(1)
Normal exit
Called compute(20)
Caught MyException[20]
Chained Exceptions
Beginning with JDK 1.4, a new feature has been incorporated into the exception
subsystem:chained exceptions.
The chained exception feature allows you to associate another exception with an exception. This
second exception describes the cause of the first exception. For example, imagine a situation in
which a method throws an ArithmeticException because of an attempt to divide by zero.
However, the actual cause of the problem was that an I/O error occurred, which caused the
divisor to be set improperly. Although the method must certainly throw an ArithmeticException,
since that is the error that occurred, you might also want to let the calling code know that the
underlying cause was an I/O error. Chained exceptions let you handle this, and any other
situation in which layers of exceptions exist.
To allow chained exceptions, two constructors and two methods were added to Throwable.
The constructors are shown here:
Throwable(Throwable causeExc)
Throwable(String msg, Throwable causeExc)
In the first form, causeExc is the exception that causes the current exception. That is, causeExc is
the underlying reason that an exception occurred. The second form allows you to specify a
description at the same time that you specify a cause exception. These two constructors have also
been added to the Error, Exception, and RuntimeException classes.
The chained exception methods added to Throwable are getCause( ) and initCause( ).
These methods are shown in Table 10-3 and are repeated here for the sake of discussion.
Throwable getCause( )
Throwable initCause(Throwable causeExc)
The getCause( ) method returns the exception that underlies the current exception. If there is no
underlying exception, null is returned. The initCause( ) method associates causeExc with the
invoking exception and returns a reference to the exception. Thus, you can associate a cause with
an exception after the exception has been created. However, the cause exception can be set only
once. Thus, you can call initCause( ) only once for each exception object.
Furthermore, if the cause exception was set by a constructor, then you cant set it again using
initCause( ). In general, initCause( ) is used to set a cause for legacy exception classes that dont
support the two additional constructors described earlier. Here is an example that illustrates the
mechanics of handling chained exceptions:
String Handling in Java :
The String class is defined in the java.lang package and hence is implicitly available to all the
programs in Java. The String class is declared as final, which means that it cannot be subclassed.
It extends the Object class and implements the Serializable, Comparable, and CharSequence
interfaces.
Java implements strings as objects of type String. A string is a sequence of characters. Unlike
most of the other languages, Java treats a string as a single value rather than as an array of
characters.
The String objects are immutable, i.e., once an object of the String class is created, the string it
contains cannot be changed. In other words, once a String object is created, the characters that
comprise the string cannot be changed. Whenever any operation is performed on a String object,
a new String object will be created while the original contents of the object will remain
unchanged. However, at any time, a variable declared as a String reference can be changed to
point to some other String object.
Why String is immutable in Java
Though there could be many possible answer for this question and only designer of String class
can answer this, I think below three does make sense
1) Imagine StringPool facility without making string immutable, its not possible at all because in
case of string pool one string object/literal e.g. "Test" has referenced by many reference variables
, so if any one of them change the value others will be automatically gets affected i.e. lets say
String A = "Test"
String B = "Test"
Y SUBBA RAYUDU M Tech
Now String B called "Test".toUpperCase() which change the same object into "TEST" , so A will
also be "TEST" which is not desirable.
2) String has been widely used as parameter for many java classes e.g. for opening network
connection you can pass hostname and port number as stirng , you can pass database URL as
string for opening database connection, you can open any file by passing name of file as
argument to File I/O classes.
In case if String is not immutable, this would lead serious security threat , I mean some one can
access to any file for which he has authorization and then can change the file name either
deliberately or accidentally and gain access of those file.
3) Since String is immutable it can safely shared between many threads, which is very
important for multithreaded programming.
String Vs StringBuffer and StringBuilder
String
Strings: A String represents group of characters. Strings are represented as String objects
in java.
Creating Strings:
We can declare a String variable and directly store a String literal using assignment
operator.
String str = "Hello";
We can create String object using new operator with some data.
String s1 = new String ("Java");
We can create a String by using character array also.
char arr[] = { 'p','r','o',g,r,a,m};
We can create a String by passing array name to it, as:
String s2 = new String (arr);
We can create a String by passing array name and specifying which characters we need:
String s3 = new String (str, 2, 3);
Here starting from 2nd character a total of 3 characters are copied into String s3.
String Class Methods:
String represents a sequence of characters. It has fixed length of character sequence. Once a
string object has been created than we can't change the character that comprise that string. It is
immutable. This allows String to be shared. String object can be instantiated like any other object
String str = new String ("Stanford );
str += "Lost!!";
This code will display the string "Our daily sale is 500 dollars". In this case, the variable sale is
declared as int rather than String, but the output produced is the same. This is because the int
value contained in the variable sale is automatically converted to String type, and then the +
operator concatenates the two strings.
String Comparison
The String class defines various methods that are used to compare strings or substrings within
strings. Each of them is discussed in the following sections:
Note: Since strings are stored as a memory address, the == operator can't be used for
comparisons. Use equals() and equalsIgnoreCase() to do comparisons. A simple example is:
equals()
The equals() method is used to check whether the Object that is passed as the argument to the
method is equal to the String object that invokes the method. It returns true if and only if the
argument is a String object that represents the same sequence of characters as represented by the
invoking object. The signature of the equals() method is as follows:
public boolean equals(Object str)
equalsIgnoreCase()
The equalsIgnoreCase() method is used to check the equality of the two String objects without
taking into consideration the case of the characters contained in the two strings. It returns true if
the two strings are of the same length and if the corresponding characters in the two strings are
the same ignoring case. The signature of the equalsIgnoreCase() method is:
public boolean equalsIgnoreCase(Object str)
compareTo()
The compareTo() method is used in conditions where a Programmer wants to sort a list of strings
in a predetermined order. The compareTo() method checks whether the string passed as an
argument to the method is less than, greater than, or equal to the invoking string. A string is
considered less than another string if it comes before it in alphabetical order. The signature of the
compareTo() method is as follows:
public int compareTo(String str)
where, str is the String being compared to the invoking String. The compareTo() method returns
Y SUBBA RAYUDU M Tech
an int value as the result of String comparison. The meaning of these values are given in the
following table:
The String class also has the compareToIgnoreCase() method that compares two strings without
taking into consideration their case difference. The signature of the method is given below:
public int compareToIgnoreCase(String str)
regionMatches()
The regionMatches() method is used to check the equality of two string regions where the two
string regions belong to two different strings. The signature of the method is given below:
public boolean regionMatches(int startindex, String str2, int startindex2, int len)
There is also an overloaded version of the method that tests the equality of the substring ignoring
the case of characters in the substring. Its signature is given below:
public boolean regionMatches(boolean ignoreCase, int startindex, String str2, int startindex2, int
len)
In both signatures of the method, startindex specifies the starting index of the substring within
the invoking string. The str2 argument specifies the string to be compared. The startindex2
specifies the starting index of the substring within the string to be compared. The len argument
specifies the length of the substring being compared. However, in the latter signature of the
method, the comparison is done ignoring the case of the characters in the substring only if the
ignoreCase argument is true.
startsWith()
The startsWith() method is used to check whether the invoking string starts with the same
sequence of characters as the substring passed as an argument to the method. The signature of the
method is given below:
public boolean startsWith(String prefix)
There is also an overloaded version of the startsWith() method with the following signature:
public boolean startsWith(String prefix, int startindex)
In both signatures of the method given above, the prefix denotes the substring to be matched
within the invoking string. However, in the second version, the startindex denotes the starting
index into the invoking string at which the search operation will commence.
endsWith()
The endsWith() method is used to check whether the invoking string ends with the same
sequence of characters as the substring passed as an argument to the method. The signature of the
method is given below:
public boolean endsWith(String prefix)
Modifying a String
The String objects are immutable. Therefore, it is not possible to change the original contents of
a string. However, the following String methods can be used to create a new copy of the string
with the required modification:
substring()
The substring() method creates a new string that is the substring of the string that invokes the
method. The method has two forms:
public String substring(int startindex)
public String substring(int startindex, int endindex)
where, startindex specifies the index at which the substring will begin and endindex specifies the
index at which the substring will end. In the first form where the endindex is not present, the
substring begins at startindex and runs till the end of the invoking string.
Concat()
The concat() method creates a new string after concatenating the argument string to the end of
the invoking string. The signature of the method is given below:
public String concat(String str)
replace()
The replace() method creates a new string after replacing all the occurrences of a particular
character in the string with another character. The string that invokes this method remains
unchanged. The general form of the method is given below:
public String replace(char old_char, char new_char)
trim()
The trim() method creates a new copy of the string after removing any leading and trailing
whitespace. The signature of the method is given below:
public String trim(String str)
toUpperCase()
The toUpperCase() method creates a new copy of a string after converting all the lowercase
letters in the invoking string to uppercase. The signature of the method is given below:
public String toUpperCase()
toLowerCase()
The toLowerCase() method creates a new copy of a string after converting all the uppercase
letters in the invoking string to lowercase. The signature of the method is given below:
public String toLowerCase()
Searching Strings
The String class defines two methods that facilitate in searching a particular character or
sequence of characters in a string. They are as follows:
IndexOf()
The indexOf() method searches for the first occurrence of a character or a substring in the
invoking string. If a match is found, then the method returns the index at which the character or
the substring first appears. Otherwise, it returns -1.
The indexOf() method has the following signatures:
public int indexOf(int ch)
public int indexOf(int ch, int startindex)
public int indexOf(String str)
public int indexOf(String str, int startindex)
lastIndexOf()
The lastIndexOf() method searches for the last occurrence of a character or a substring in the
invoking string. If a match is found, then the method returns the index at which the character or
the substring last appears. Otherwise, it returns 1.
The lastIndexOf() method has the following signatures:
public int lastIndexOf(int ch)
public int lastIndexOf (int ch, int startindex)
public int lastIndexOf (String str)
public int lastIndexOf (String str, int startindex)
StringBuffer
StringBuffer: StringBuffer objects are mutable, so they can be modified. The methods that
directly manipulate data of the object are available in StringBuffer class.
Creating StringBuffer:
We can create a StringBuffer object by using new operator and pass the string to the
object, as:
StringBuffer sb = new StringBuffer ("Kiran");
We can create a StringBuffer object by first allotting memory to the StringBuffer
object using new operator and later storing the String into it as:
StringBuffer sb = new StringBuffer (30);
In general a StringBuffer object will be created with a default capacity of 16 characters. Here,
StringBuffer object is created as an empty object with a capacity for storing 30 characters. Even
if we declare the capacity as 30, it is possible to store more than 30 characters into StringBuffer.
To store characters, we can use append () method as:
Sb.append (Kiran);
This represents growable and writeable character sequence. It is mutable in nature. StringBuffer
are safe to be used by multiple thread as they are synchronized but this brings performance
penalty.
It defines 3-constructor:
StringBuffer(); //initial capacity of 16 characters
StringBuffer(int size); //The initial size
StringBuffer(String str);
StringBuffer str = new StringBuffer ("Stanford ");
str.append("Lost!!");
}
}
Output:
Accessor
methods:
capacity(),
length(),
charAt(i),
indexOf(g),
lastIndexOf(g)
Modifier methods: append(g), delete(i1, i2), insert(iPosn, g), getChars(i), setCharAt(iposn, c),
substring(), replace(i1,i2,gvalue), reverse(), trimToSize(g ), toString(g)
java.lang
Class StringBuilder
java.lang.Object
java.lang.StringBuilder
All Implemented Interfaces:
Serializable, Appendable, CharSequence
Instances of StringBuilder are not safe for use by multiple threads. If such synchronization is
required then it is recommended that StringBuffer be used.
Constructor Summary
StringBuilder()
Constructs a string builder with no characters in it and an initial capacity of 16
characters.
StringBuilder(CharSequence seq)
Constructs a string builder that contains the same characters as the specified
CharSequence.
StringBuilder(int capacity)
Constructs a string builder with no characters in it and an initial capacity specified by
the capacity argument.
StringBuilder(String str)
Constructs a string builder initialized to the contents of the specified string.
Method Summary
StringBuilder append(boolean b)
Appends the string representation of the boolean argument to the
sequence.
StringBuilder append(char c)
Appends the string representation of the char argument to this sequence.
StringBuilder append(char[] str)
Appends the string representation of the char array argument to this
sequence.
StringBuilder append(char[] str, int offset, int len)
Appends the string representation of a subarray of the char array
argument to this sequence.
StringBuilder append(CharSequence s)
Appends the specified character sequence to this Appendable.
StringBuilder append(CharSequence s, int start, int end)
Appends a subsequence of the specified CharSequence to this sequence.
StringBuilder append(double d)
Appends the string representation of the double argument to this
sequence.
StringBuilder append(float f)
Appends the string representation of the float argument to this sequence.
StringBuilder append(int i)
Appends the string representation of the int argument to this sequence.
StringBuilder append(long lng)
Appends the string representation of the long argument to this sequence.
StringBuilder append(Object obj)
Appends the string representation of the Object argument.
StringBuilder append(String str)
Appends the specified string to this character sequence.
StringBuilder append(StringBuffer sb)
Appends the specified StringBuffer to this sequence.
StringBuilder appendCodePoint(int codePoint)
Appends the string representation of the codePoint argument to this
sequence.
int capacity()
Returns the current capacity.
char charAt(int index)
Returns the char value in this sequence at the specified index.
int codePointAt(int index)
Returns the character (Unicode code point) at the specified index.
Y SUBBA RAYUDU M Tech
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Constructor Detail
StringBuilder
public StringBuilder()
Constructs a string builder with no characters in it and an initial capacity of 16 characters.
StringBuilder
public StringBuilder(int capacity)
Constructs a string builder with no characters in it and an initial capacity specified by the
capacity argument.
Parameters:
capacity - the initial capacity.
Throws: NegativeArraySizeException - if the capacity argument is less than 0.
StringBuilder
public StringBuilder(String str)
Constructs a string builder initialized to the contents of the specified string. The initial
capacity of the string builder is 16 plus the length of the string argument.
Parameters:
str - the initial contents of the buffer.
Throws: NullPointerException - if str is null
StringBuilder
public StringBuilder(CharSequence seq)
Constructs a string builder that contains the same characters as the specified
CharSequence. The initial capacity of the string builder is 16 plus the length of the
CharSequence argument.
Parameters:
seq - the sequence to copy.
Throws: NullPointerException - if seq is null
Method Detail
append
public StringBuilder append(Object obj)
Appends the string representation of the Object argument.
The argument is converted to a string as if by the method String.valueOf, and the
characters of that string are then appended to this sequence.
Parameters:
obj - an Object.
Returns: a reference to this object.
append
public StringBuilder append(String str)
Appends the specified string to this character sequence.
The characters of the String argument are appended, in order, increasing the length of this
sequence by the length of the argument. If str is null, then the four characters "null" are
appended.
Let n be the length of this character sequence just prior to execution of the append
method. Then the character at index k in the new character sequence is equal to the
character at index k in the old character sequence, if k is less than n; otherwise, it is equal
to the character at index k-n in the argument str.
Parameters:
str - a string.
Returns: a reference to this object.
append
public StringBuilder append(StringBuffer sb)
Appends the specified StringBuffer to this sequence.
The characters of the StringBuffer argument are appended, in order, to this sequence,
increasing the length of this sequence by the length of the argument. If sb is null, then the
four characters "null" are appended to this sequence.
Let n be the length of this character sequence just prior to execution of the append
method. Then the character at index k in the new character sequence is equal to the
character at index k in the old character sequence, if k is less than n; otherwise, it is equal
to the character at index k-n in the argument sb.
Parameters:
sb - the StringBuffer to append.
Returns: a reference to this object.
append
public StringBuilder append(CharSequence s)
Description copied from interface: Appendable
Appends the specified character sequence to this Appendable.
Depending on which class implements the character sequence csq, the entire sequence
may not be appended. For instance, if csq is a CharBuffer then the subsequence to append
is defined by the buffer's position and limit.
Specified by:
append in interface Appendable
Parameters:
s - The character sequence to append. If csq is null, then the four characters "null" are
appended to this Appendable.
Returns: A reference to this Appendable
Throws: IndexOutOfBoundsException
append
public StringBuilder append(CharSequence s,int start, int end)
Y SUBBA RAYUDU M Tech
append
public StringBuilder append(char[] str)
Appends the string representation of the char array argument to this sequence.
The characters of the array argument are appended, in order, to the contents of this
sequence. The length of this sequence increases by the length of the argument.
The overall effect is exactly as if the argument were converted to a string by the method
String.valueOf(char[]) and the characters of that string were then appended to this
character sequence.
Parameters:
The argument is appended to the contents of this sequence. The length of this sequence
increases by 1.
The overall effect is exactly as if the argument were converted to a string by the method
String.valueOf(char) and the character in that string were then appended to this character
sequence.
Specified by:
append in interface Appendable
Parameters:
c - a char.
Returns: a reference to this object.
append
public StringBuilder append(int i)
Appends the string representation of the int argument to this sequence.
The argument is converted to a string as if by the method String.valueOf, and the
characters of that string are then appended to this sequence.
Parameters:
i - an int.
Returns: a reference to this object.
append
public StringBuilder append(long lng)
Appends the string representation of the long argument to this sequence.
The argument is converted to a string as if by the method String.valueOf, and the
characters of that string are then appended to this sequence.
Parameters:
lng - a long.
Returns: a reference to this object.
append
Removes the characters in a substring of this sequence. The substring begins at the
specified start and extends to the character at index end - 1 or to the end of the sequence
if no such character exists. If start is equal to end, no changes are made.
Parameters:
start - The beginning index, inclusive.
end - The ending index, exclusive.
Returns: This object.
Throws: StringIndexOutOfBoundsException - if start is negative, greater than length(),
or greater than end.
deleteCharAt
public StringBuilder deleteCharAt(int index)
Removes the char at the specified position in this sequence. This sequence is shortened
by one char.
Note: If the character at the given index is a supplementary character, this method does
not remove the entire character. If correct handling of supplementary characters is
required, determine the number of chars to remove by calling
Character.charCount(thisSequence.codePointAt(index)), where thisSequence is this
sequence.
Parameters:
index - Index of char to remove
Returns: This object.
Throws: StringIndexOutOfBoundsException - if the index is negative or greater than or
equal to length().
replace
public StringBuilder replace(int start, int end,String str)
Replaces the characters in a substring of this sequence with characters in the specified
String. The substring begins at the specified start and extends to the character at index
end - 1 or to the end of the sequence if no such character exists. First the characters in the
substring are removed and then the specified String is inserted at start. (This sequence
will be lengthened to accommodate the specified String if necessary.)
Parameters:
Y SUBBA RAYUDU M Tech
The offset argument must be greater than or equal to 0, and less than or equal to the
length of this sequence.
Parameters:
offset - the offset.
obj - an Object.
Returns: a reference to this object.
Throws: StringIndexOutOfBoundsException - if the offset is invalid.
insert
public StringBuilder insert(int offset, String str)
Inserts the string into this character sequence.
The characters of the String argument are inserted, in order, into this sequence at the
indicated offset, moving up any characters originally above that position and increasing
the length of this sequence by the length of the argument. If str is null, then the four
characters "null" are inserted into this sequence.
The character at index k in the new character sequence is equal to:
the character at index k in the old character sequence, if k is less than offset
the character at index k-offset in the argument str, if k is not less than offset but is
less than offset+str.length()
the character at index k-str.length() in the old character sequence, if k is not less
than offset+str.length()
The offset argument must be greater than or equal to 0, and less than or equal to the
length of this sequence.
Parameters:
offset - the offset.
str - a string.
Returns: a reference to this object.
Throws: StringIndexOutOfBoundsException - if the offset is invalid.
insert
public StringBuilder insert(int offset,char[] str)
Inserts the string representation of the char array argument into this sequence.
The characters of the array argument are inserted into the contents of this sequence at the
position indicated by offset. The length of this sequence increases by the length of the
argument.
The overall effect is exactly as if the argument were converted to a string by the method
String.valueOf(char[]) and the characters of that string were then inserted into this
character sequence at the position indicated by offset.
Parameters:
offset - the offset.
str - a character array.
Returns: a reference to this object.
Throws: StringIndexOutOfBoundsException - if the offset is invalid.
insert
public StringBuilder insert(int dstOffset,CharSequence s)
Inserts the specified CharSequence into this sequence.
The characters of the CharSequence argument are inserted, in order, into this sequence at
the indicated offset, moving up any characters originally above that position and
increasing the length of this sequence by the length of the argument s.
The result of this method is exactly the same as if it were an invocation of this object's
insert(dstOffset, s, 0, s.length()) method.
If s is null, then the four characters "null" are inserted into this sequence.
Parameters:
dstOffset - the offset.
s - the sequence to be inserted
Returns: a reference to this object.
Throws: IndexOutOfBoundsException - if the offset is invalid.
Y SUBBA RAYUDU M Tech
insert
public StringBuilder insert(int dstOffset,CharSequence s, int start, int end)
Inserts a subsequence of the specified CharSequence into this sequence.
The subsequence of the argument s specified by start and end are inserted, in order, into
this sequence at the specified destination offset, moving up any characters originally
above that position. The length of this sequence is increased by end - start.
The character at index k in this sequence becomes equal to:
The dstOffset argument must be greater than or equal to 0, and less than or equal to the
length of this sequence.
The start argument must be nonnegative, and not greater than end.
The end argument must be greater than or equal to start, and less than or equal to the
length of s.
If s is null, then this method inserts characters as if the s parameter was a sequence
containing the four characters "null".
Parameters:
dstOffset - the offset in this sequence.
s - the sequence to be inserted.
start - the starting index of the subsequence to be inserted.
end - the end index of the subsequence to be inserted.
Returns: a reference to this object.
Throws:
is true.
Parameters:
str - any string.
Returns:
if the string argument occurs as a substring within this object, then the index of the first
character of the first such substring is returned; if it does not occur as a substring, -1 is
returned.
Throws: NullPointerException - if str is null.
indexOf
public int indexOf(String str, int fromIndex)
Returns the index within this string of the first occurrence of the specified substring,
starting at the specified index. The integer returned is the smallest value k for which:
k >= Math.min(fromIndex, str.length()) &&
this.toString().startsWith(str, k)
If no such value of k exists, then -1 is returned.
Parameters:
str - the substring for which to search.
fromIndex - the index from which to start the search.
Returns:
the index within this string of the first occurrence of the specified substring, starting at
the specified index.
Throws: NullPointerException - if str is null.
lastIndexOf
public int lastIndexOf(String str)
Returns the index within this string of the rightmost occurrence of the specified substring.
The rightmost empty string "" is considered to occur at the index value this.length(). The
returned index is the largest value k such that
this.toString().startsWith(str, k)
is true.
Parameters:
str - the substring to search for.
Returns:
if the string argument occurs one or more times as a substring within this object, then the
index of the first character of the last such substring is returned. If it does not occur as a
substring, -1 is returned.
Throws: NullPointerException - if str is null.
lastIndexOf
public int lastIndexOf(String str, int fromIndex)
Returns the index within this string of the last occurrence of the specified substring. The
integer returned is the largest value k such that:
k <= Math.min(fromIndex, str.length()) &&
this.toString().startsWith(str, k)
If no such value of k exists, then -1 is returned.
Parameters:
str - the substring to search for.
fromIndex - the index to start the search from.
Returns:
the index within this sequence of the last occurrence of the specified substring.
Throws: NullPointerException - if str is null.
reverse
public StringBuilder reverse()
Causes this character sequence to be replaced by the reverse of the sequence. If there are
any surrogate pairs included in the sequence, these are treated as single characters for the
reverse operation. Thus, the order of the high-low surrogates is never reversed. Let n be
the character length of this character sequence (not the length in char values) just prior to
execution of the reverse method. Then the character at index k in the new character
sequence is equal to the character at index n-k-1 in the old character sequence.
Note that the reverse operation may result in producing surrogate pairs that were unpaired
low-surrogates and high-surrogates before the operation. For example, reversing
"\uDC00\uD800" produces "\uD800\uDC00" which is a valid surrogate pair.
Returns: a reference to this object.
toString
public String toString()
Returns a string representing the data in this sequence. A new String object is allocated
and initialized to contain the character sequence currently represented by this object. This
String is then returned. Subsequent changes to this sequence do not affect the contents of
the String.
Specified by:
toString in interface CharSequence
Returns: a string representation of this sequence of characters.
length
public int length()
Returns the length (character count).
Specified by:
length in interface CharSequence
Returns: the length of the sequence of characters currently represented by this object
capacity
public int capacity()
Returns the current capacity. The capacity is the amount of storage available for newly
inserted characters, beyond which an allocation will occur.
Returns: the current capacity
ensureCapacity
public void ensureCapacity(int minimumCapacity)
Ensures that the capacity is at least equal to the specified minimum. If the current
capacity is less than the argument, then a new internal array is allocated with greater
capacity. The new capacity is the larger of:
Y SUBBA RAYUDU M Tech
If the minimumCapacity argument is nonpositive, this method takes no action and simply
returns.
Parameters:
minimumCapacity - the minimum desired capacity.
trimToSize
public void trimToSize()
Attempts to reduce storage used for the character sequence. If the buffer is larger than
necessary to hold its current sequence of characters, then it may be resized to become
more space efficient. Calling this method may, but is not required to, affect the value
returned by a subsequent call to the capacity() method.
setLength
public void setLength(int newLength)
Sets the length of the character sequence. The sequence is changed to a new character
sequence whose length is specified by the argument. For every nonnegative index k less
than newLength, the character at index k in the new character sequence is the same as the
character at index k in the old sequence if k is less than the length of the old character
sequence; otherwise, it is the null character '\u0000'. In other words, if the newLength
argument is less than the current length, the length is changed to the specified length.
If the newLength argument is greater than or equal to the current length, sufficient null
characters ('\u0000') are appended so that length becomes the newLength argument.
The newLength argument must be greater than or equal to 0.
Parameters:
newLength - the new length
Throws: IndexOutOfBoundsException - if the newLength argument is negative.
charAt
public char charAt(int index)
Returns the char value in this sequence at the specified index. The first char value is at
index 0, the next at index 1, and so on, as in array indexing.
The index argument must be greater than or equal to 0, and less than the length of this
sequence.
If the char value specified by the index is a surrogate, the surrogate value is returned.
Specified by:
charAt in interface CharSequence
Parameters:
index - the index of the desired char value.
Returns: the char value at the specified index.
Throws: IndexOutOfBoundsException - if index is negative or greater than or equal to
length().
codePointAt
public int codePointAt(int index)
Returns the character (Unicode code point) at the specified index. The index refers to
char values (Unicode code units) and ranges from 0 to length() - 1.
If the char value specified at the given index is in the high-surrogate range, the following
index is less than the length of this sequence, and the char value at the following index is
in the low-surrogate range, then the supplementary code point corresponding to this
surrogate pair is returned. Otherwise, the char value at the given index is returned.
Parameters:
index - the index to the char values
Returns: the code point value of the character at the index
Throws: IndexOutOfBoundsException - if the index argument is negative or not less
than the length of this sequence.
codePointBefore
public int codePointBefore(int index)
Returns the character (Unicode code point) before the specified index. The index refers to
char values (Unicode code units) and ranges from 1 to length().
If the char value at (index - 1) is in the low-surrogate range, (index - 2) is not negative,
and the char value at (index - 2) is in the high-surrogate range, then the supplementary
Y SUBBA RAYUDU M Tech
code point value of the surrogate pair is returned. If the char value at index - 1 is an
unpaired low-surrogate or a high-surrogate, the surrogate value is returned.
Parameters:
index - the index following the code point that should be returned
Returns: the Unicode code point value before the given index.
Throws: IndexOutOfBoundsException - if the index argument is less than 1 or greater
than the length of this sequence.
codePointCount
public int codePointCount(int beginIndex,int endIndex)
Returns the number of Unicode code points in the specified text range of this sequence.
The text range begins at the specified beginIndex and extends to the char at index
endIndex - 1. Thus the length (in chars) of the text range is endIndex-beginIndex.
Unpaired surrogates within this sequence count as one code point each.
Parameters:
beginIndex - the index to the first char of the text range.
endIndex - the index after the last char of the text range.
Returns: the number of Unicode code points in the specified text range
Throws: IndexOutOfBoundsException - if the beginIndex is negative, or endIndex is
larger than the length of this sequence, or beginIndex is larger than endIndex.
offsetByCodePoints
public int offsetByCodePoints(int index, int codePointOffset)
Returns the index within this sequence that is offset from the given index by
codePointOffset code points. Unpaired surrogates within the text range given by index
and codePointOffset count as one code point each.
Parameters:
index - the index to be offset
codePointOffset - the offset in code points
Returns: the index within this sequence
Throws:
Y SUBBA RAYUDU M Tech
srcBegin is negative
dstBegin is negative
setCharAt
public void setCharAt(int index, char ch)
The character at the specified index is set to ch. This sequence is altered to represent a
new character sequence that is identical to the old character sequence, except that it
contains the character ch at position index.
Y SUBBA RAYUDU M Tech
The index argument must be greater than or equal to 0, and less than the length of this
sequence.
Parameters:
index - the index of the character to modify.
ch - the new character.
Throws: IndexOutOfBoundsException - if index is negative or greater than or equal to
length().
substring
public String substring(int start)
Returns a new String that contains a subsequence of characters currently contained in this
character sequence. The substring begins at the specified index and extends to the end of
this sequence.
Parameters:
start - The beginning index, inclusive.
Returns: The new string.
Throws: StringIndexOutOfBoundsException - if start is less than zero, or greater than
the length of this object.
subSequence
public CharSequence subSequence(int start, int end)
Returns a new character sequence that is a subsequence of this sequence.
An invocation of this method of the form
sb.subSequence(begin, end)
behaves in exactly the same way as the invocation
sb.substring(begin, end)
This method is provided so that this class can implement the CharSequence interface.
Specified by:
subSequence in interface CharSequence
Parameters:
start - the start index, inclusive.
Y SUBBA RAYUDU M Tech
Interface Summary
Collection<E>
Comparator<T>
Formattable
Iterator<E>
List<E>
ListIterator<E>
An iterator for lists that allows the programmer to traverse the list in either
direction, modify the list during iteration, and obtain the iterator's current
position in the list.
Map<K,V>
Map.Entry<K,V
>
Observer
Queue<E>
RandomAccess
Set<E>
A map that further guarantees that it will be in ascending key order, sorted
SortedMap<K,V
according to the natural ordering of its keys (see the Comparable
>
interface), or by a comparator provided at sorted map creation time.
SortedSet<E>
A set that further guarantees that its iterator will traverse the set in
ascending element order, sorted according to the natural ordering of its
elements (see Comparable), or by a Comparator provided at sorted set
creation time.
Class Summary
AbstractCollection<E>
AbstractList<E>
AbstractMap<K,V>
AbstractQueue<E>
ArrayList<E>
Arrays
BitSet
Calendar
Collections
Currency
Represents a currency.
Date
Dictionary<K,V>
EnumMap<K extends
Enum<K>,V>
EnumSet<E extends
Enum<E>>
EventListenerProxy
EventObject
The root class from which all event state objects shall be derived.
FormattableFlags
Formatter
GregorianCalendar
HashMap<K,V>
HashSet<E>
Hashtable<K,V>
IdentityHashMap<K,V>
This class implements the Map interface with a hash table, using
reference-equality in place of object-equality when comparing
keys (and values).
LinkedHashMap<K,V>
LinkedHashSet<E>
LinkedList<E>
ListResourceBundle
Locale
Observable
PriorityQueue<E>
Properties
PropertyPermission
PropertyResourceBundle
Random
ResourceBundle
Scanner
A simple text scanner which can parse primitive types and strings
using regular expressions.
SimpleTimeZone
Stack<E>
StringTokenizer
into tokens.
Timer
TimerTask
TimeZone
TreeMap<K,V>
TreeSet<E>
UUID
Vector<E>
WeakHashMap<K,V>
Enum Summary
Formatter.BigDecimalLayoutFor
m
Exception Summary
ConcurrentModificationException
DuplicateFormatFlagsException
IllegalFormatCodePointException
IllegalFormatConversionException
IllegalFormatException
IllegalFormatFlagsException
IllegalFormatPrecisionException
IllegalFormatWidthException
InputMismatchException
InvalidPropertiesFormatException
MissingFormatArgumentException
MissingFormatWidthException
MissingResourceException
NoSuchElementException
TooManyListenersException
UnknownFormatConversionException
UnknownFormatFlagsException
Class Hierarchy
o java.lang.Object
o java.util.AbstractCollection<E> (implements java.util.Collection<E>)
o java.util.AbstractList<E> (implements java.util.List<E>)
o java.util.AbstractSequentialList<E>
o java.util.LinkedList<E> (implements java.lang.Cloneable,
java.util.List<E>, java.util.Queue<E>, java.io.Serializable)
o java.util.ArrayList<E> (implements java.lang.Cloneable,
java.util.List<E>, java.util.RandomAccess, java.io.Serializable)
o java.util.Vector<E> (implements java.lang.Cloneable,
java.util.List<E>, java.util.RandomAccess, java.io.Serializable)
o java.util.Stack<E>
o java.util.AbstractQueue<E> (implements java.util.Queue<E>)
o java.util.PriorityQueue<E> (implements java.io.Serializable)
o java.util.AbstractSet<E> (implements java.util.Set<E>)
o java.util.EnumSet<E> (implements java.lang.Cloneable,
java.io.Serializable)
o java.util.HashSet<E> (implements java.lang.Cloneable,
java.io.Serializable, java.util.Set<E>)
o java.util.LinkedHashSet<E> (implements
java.lang.Cloneable, java.io.Serializable, java.util.Set<E>)
o java.util.TreeSet<E> (implements java.lang.Cloneable,
java.io.Serializable, java.util.SortedSet<E>)
2
java.util.Arrays
java.util.Collections
java.util.Dictionary<K,V>
o java.util.Hashtable<K,V> (implements java.lang.Cloneable,
java.util.Map<K,V>, java.io.Serializable)
o java.util.Properties
15 java.util.Observable
16 java.security.Permission (implements java.security.Guard, java.io.Serializable)
o java.security.BasicPermission (implements java.io.Serializable)
o java.util.PropertyPermission
17 java.util.Random (implements java.io.Serializable)
18 java.util.ResourceBundle
o java.util.ListResourceBundle
o java.util.PropertyResourceBundle
19 java.util.Scanner (implements java.util.Iterator<E>)
20 java.util.StringTokenizer (implements java.util.Enumeration<E>)
21 java.lang.Throwable (implements java.io.Serializable)
o java.lang.Exception
o java.io.IOException
o java.util.InvalidPropertiesFormatException
o java.lang.RuntimeException
o java.util.ConcurrentModificationException
o java.util.EmptyStackException
o java.lang.IllegalArgumentException
o java.util.IllegalFormatException
o java.util.DuplicateFormatFlagsException
o java.util.FormatFlagsConversionMismatc
hException
o java.util.IllegalFormatCodePointExceptio
n
Y SUBBA RAYUDU M Tech
o java.util.IllegalFormatConversionExceptio
n
o java.util.IllegalFormatFlagsException
o java.util.IllegalFormatPrecisionException
o java.util.IllegalFormatWidthException
o java.util.MissingFormatArgumentExcepti
on
o java.util.MissingFormatWidthException
o java.util.UnknownFormatConversionExce
ption
o java.util.UnknownFormatFlagsException
o java.lang.IllegalStateException
o java.util.FormatterClosedException
o java.util.MissingResourceException
o java.util.NoSuchElementException
o java.util.InputMismatchException
o java.util.TooManyListenersException
2
java.util.Timer
Interface Hierarchy
o java.util.Comparator<T>
o java.util.Enumeration<E>
o java.util.EventListener
o java.util.Formattable
o java.lang.Iterable<T>
o java.util.Collection<E>
o java.util.List<E>
o java.util.Queue<E>
o java.util.Set<E>
o java.util.SortedSet<E>
o java.util.Iterator<E>
1
java.util.ListIterator<E>
o java.util.Map<K,V>
1
java.util.SortedMap<K,V>
o java.util.Map.Entry<K,V>
o java.util.Observer
o java.util.RandomAccess
Enum Hierarchy
o java.lang.Object
o java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable)
o java.util.Formatter.BigDecimalLayoutForm
Introduction
The Java 2 platform includes a collections framework. A collection is an object that represents a
group of objects (such as the familiar Vector class). A collections framework is a unified
architecture for representing and manipulating collections, allowing them to be manipulated
independently of the details of their representation.
In order to handle group of objects we can use array of objects. If we have a class called Employ
with members name and id, if we want to store details of 10 Employees, create an array of object
to hold 10 Employ details.
Employ ob [] = new Employ [10];
Collection Object:
Reduces programming effort by providing useful data structures and algorithms so you
don't have to write them yourself.
Reduces the effort required to learn APIs by eliminating the need to learn multiple ad
hoc collection APIs.
Reduces the effort required to design and implement APIs by eliminating the need to
produce ad hoc collections APIs.
Fosters software reuse by providing a standard interface for collections and algorithms
to manipulate them.
Collection Interfaces - Represent different types of collections, such as sets, lists and
maps. These interfaces form the basis of the framework.
Legacy Implementations - The collection classes from earlier releases, Vector and
Hashtable, have been retrofitted to implement the collection interfaces.
Algorithms - Static methods that perform useful functions on collections, such as sorting
a list.
Infrastructure - Interfaces that provide essential support for the collection interfaces.
Array Utilities - Utility functions for arrays of primitives and reference objects. Not,
strictly speaking, a part of the Collections Framework, this functionality was added to the
Java platform at the same time and relies on some of the same infrastructure.
Collection Interfaces
There are nine collection interfaces. The most basic interface is Collection. Five interfaces
extend Collection: Set, List, SortedSet, Queue, and BlockingQueue. The other three collection
interfaces, Map, SortedMap, and ConcurrentMap do not extend Collection, as they represent
mappings rather than true collections. However, these interfaces contain collection-view
operations, which allow them to be manipulated as collections.
All of the modification methods in the collection interfaces are labeled optional. Some
implementations may not perform one or more of these operations, throwing a runtime exception
(UnsupportedOperationException) if they are attempted. Implementations must specify in their
documentation which optional operations they support. Several terms are introduced to aid in this
specification:
Collections that do not support any modification operations (such as add, remove and
clear) are referred to as unmodifiable. Collections that are not unmodifiable are referred
to modifiable.
Collections that additionally guarantee that no change in the Collection object will ever
be visible are referred to as immutable. Collections that are not immutable are referred to
as mutable.
Lists that guarantee that their size remains constant even though the elements may change
are referred to as fixed-size. Lists that are not fixed-size are referred to as variable-size.
Lists that support fast (generally constant time) indexed element access are known as
random access lists. Lists that do not support fast indexed element access are known as
sequential access lists. The RandomAccess marker interface is provided to allow lists to
advertise the fact that they support random access. This allows generic algorithms to alter
their behavior to provide good performance when applied to either random or sequential
access lists.
Some implementations may restrict what elements (or in the case of Maps, keys and values) may
be stored. Possible restrictions include requiring elements to:
Be of a particular type.
Be non-null.
Collection Implementations
Classes that implement the collection interfaces typically have names of the form
<Implementation-style><Interface>. The general purpose implementations are summarized in the
table below:
Implementations
Hash
Table
Resizable
Array
Set HashSet
Interfaces List
Map HashMap
Balanced
Tree
Linked
List
TreeSet
ArrayList
LinkedList
TreeMap
LinkedHashMap
The general-purpose implementations support all of the optional operations in the collection
interfaces, and have no restrictions on the elements they may contain. They are unsynchronized,
but the Collections class contains static factories called synchronization wrappers that may be
used to add synchronization to any unsynchronized collection. All of the new implementations
have fail-fast iterators, which detect illegal concurrent modification, and fail quickly and cleanly
(rather than behaving erratically).
Set: A Set represents a group of elements (objects) arranged just like an array. The set
will grow dynamically when the elements are stored into it. A set will not allow
duplicate elements.
List: Lists are like sets but allow duplicate values to be stored.
Queue: A Queue represents arrangement of elements in FIFO (First In First Out) order.
This means that an element that is stored as a first element into the queue will be
removed first from the queue.
Map: Maps store elements in the form of key value pairs. If the key is provided
its corresponding value can be obtained.
Retrieving Elements from Collections: Following are the ways to retrieve any element from a
collection object:
Iterator Interface: Iterator is an interface that contains methods to retrieve the elements one by
one from a collection object. It retrieves elementsonly in forward direction. It has 3 methods:
ListIterator Interface: ListIterator is an interface that contains methods to retrieve the elements
from a collection object, both in forward and reverse directions. It can retrieve the elements in
forward and backward direction. It has the following important methods:
Enumeration Interface: This interface is useful to retrieve elements one by one like Iterator. It
has 2 methods.
HashSet Class: HashSet represents a set of elements (objects). It does not guarantee the order of
elements. Also it does not allow the duplicate elements to be stored.
Y SUBBA RAYUDU M Tech
HashSet();
HashSet (int capacity); Here capacity represents how many elements can be stored into
the HashSet initially. This capacity may increase automatically when more number of
elements is being stored.
Program : Write a program which shows the use of HashSet and Iterator.
//HashSet Demo
import java.util.*;
class HS
{ public static void main(String args[])
{ //create a HashSet to store Strings
HashSet <String> hs = new HashSet<String> ();
//Store some String elements
hs.add ("India");
hs.add ("America");
hs.add ("Japan");
hs.add ("China");
hs.add ("America");
//view the HashSet
System.out.println ("HashSet = " + hs);
//add an Iterator to hs
Iterator it = hs.iterator ();
//display element by element using Iterator
System.out.println ("Elements Using Iterator: ");
while (it.hasNext() )
{ String s = (String) it.next ();
System.out.println(s);
}
}
}
Output:
LinkedHashSet Class: This is a subclass of HashSet class and does not contain any
additional members on its own. LinkedHashSet internally uses a linked list to store the
elements. It is a generic class that has the declaration:
class LinkedHashSet<T>
Stack Class: A stack represents a group of elements stored in LIFO (Last In First Out)
order.
This means that the element which is stored as a last element into the stack will be
the first element to be removed from the stack. Inserting the elements (Objects) into
Y SUBBA RAYUDU M Tech
the stack is called push operation and removing the elements from stack is called pop
operation. Searching for an element in stack is called peep operation. Insertion and deletion
of elements take place only from one side of the stack, called top of the stack. We can write a
Stack class as:
class Stack<E>
e.g.: Stack<Integer> obj = new Stack<Integer> ();
Stack Class Methods:
void display()
{
System.out.println("\nStack elements from top to bottom\n");
for(int i=top;i>=0;i--)
System.out.println(st[i]);
}
boolean isFull()
{
return(top==5-1);
}
boolean isEmpty()
{
return(top==-1);
}
}
class Stack
{
public static void main(String a[])
{
Scanner sc=new Scanner(System.in);
Stack1 s=new Stack1();
int el=0,ch=1;
while(ch!=4)
{
System.out.println("\n1.PUSH\n2.POP\n3.DISPLAY\n4.EXIT");
System.out.println("ENTER YOUR CHOICE");
ch=sc.nextInt();
Y SUBBA RAYUDU M Tech
switch(ch)
{
case 1:if(s.isFull())
System.out.println("\nstack is full");
else
{
System.out.println("Enter element");
el=sc.nextInt();
s.push(el);
}break;
case 2:if(s.isEmpty())
System.out.println("\nstack is empty");
else
{
el=s.pop();
System.out.println("\nDeleted element = "+el);
}break;
case 3:if(s.isEmpty())
System.out.println("\nstack is empty");
else
s.display();
break;
case 4:break;
default:System.out.println("\nEnter correct choice");
}
}
}
Y SUBBA RAYUDU M Tech
LinkedList Class: A linked list contains a group of elements in the form of nodes. Each
node will have three fields- the data field contatins data and the link fields contain
references to previous and next nodes.A linked list is written in the form of:
class LinkedList<E>
we can create an empty linked list for storing String type elements (objects) as:
LinkedList <String> ll = new LinkedList<String> ();
LinkedList Class methods:
Note: In case of LinkedList counting starts from 0 and we start counting from 1.
like an
array, which
can
grow
in
memory
ArrayList is not synchronized. This means that when more than one thread acts
simultaneously on the ArrayList object, the results may be incorrect in some cases.
ArrayList class can be written as: class ArrayList <E>
We can create an object to ArrayList as: ArrayList <String> arl = new ArrayList<String> ();
import java.util.*;
//ArrayList Demo
class ArrayListDemo
{ public static void main(String args[])
{ ArrayList <String> al = new ArrayList<String>();
al.add ("Asia");
al.add ("North America");
al.add ("South America");
al.add ("Africa");
al.add ("Europe");
al.add (1,"Australia");
al.add (2,"Antarctica");
System.out.print ("Size of the Array List is: " + al.size ());
System.out.print ("\nRetrieving elements in ArrayList using Iterator :");
Iterator it = al.iterator ();
while (it.hasNext () )
System.out.print (it.next () + "\t");
}
}
Output:
Vector Class: Similar to ArrayList, but Vector is synchronized. It means even if several
threads act on Vector object simultaneously, the results will be reliable.
Vector class can be written as: class Vector <E>
We can create an object to Vector as:
v.add(x[i]);
System.out.println ("Getting Vector elements using get () method: ");
for (int i = 0; i<v.size(); i++)
System.out.print (v.get (i) + "\t");
System.out.println ("\nRetrieving elements in Vector using ListIterator :");
ListIterator lit = v.listIterator ();
while (lit.hasNext () )
System.out.print (lit.next () + "\t");
System.out.println ("\nRetrieving elements in reverse order using ListIterator :");
while (lit.hasPrevious () )
System.out.print (lit.previous () + "\t");
}
}
Output:
HashMap Class: HashMap is a collection that stores elements in the form of key-value
pairs. If key is provided later its corresponding value can be easily retrieved from the
HAshMap. Key should be unique. HashMap is not synchronized and hence while using
multiple threads on HashMap object, we get unreliable results.
We can write HashMap class as: class HashMap<K, V>
For example to store a String as key and an integer object as its value, we can
create the
HashMap as: HashMap<String, Integer> hm = new HashMap<String, Integer> ();
The default initial capacity of this HashMap will be taken as 16 and the load factor as 0.75.
Load factor represents at what level the HashMap capacity should be doubled. For
example, the product of capacity and load factor = 16 * 0.75 = 12. This represents that after
storing 12th key-value pair into the HashMap, its capacity will become 32.
Y SUBBA RAYUDU M Tech
Hashtable Class: Hashtable is a collection that stores elements in the form of key-value
pairs. If key is provided later its corresponding value can be easily retrieved from the
HAshtable. Keys should be unique. Hashtable is synchronized and hence while using
multiple threads on Hashtable object, we get reliable results.
We can write Hashtable class as: class Hashtable<K,V>
For example to store a String as key and an integer object as its value, we can
create the
Hashtable as: Hashtable<String, Integer> ht = new Hashtable<String, Integer> ();
The default initial capacity of this Hashtable will be taken as 11 and the load factor as 0.75.
Load factor represents at what level the Hashtable capacity should be doubled. For
example, the product of capacity and load factor = 11 * 0.75 = 8.25. This represents that
after storing 8th key-value pair into the Hashtable, its capacity will become 22.
Hashtable Class Methods:
Arrays Class: Arrays class provides methods to perform certain operations on any
single dimensional array. All the methods of the Arrays class are static, so they can be
called in the form of Arrays.methodname ().
Program : Write a program to sort given numbers using sort () method of Arrays Class.
import java.util.*;
//Arrays Demo
class ArraysDemo
{ public static void main(String args[])
{
int x[] = {40,50,10,30,20};
Arrays.sort( x );
for (int i=0;i<x.length;i++)
System.out.print(x[i] + "\t");
}
}
Output:
StringTokenizer: The StringTokenizer class is useful to break a String into small pieces
called tokens. We can create an object to StringTokenizer as:
StringTokenizer st = new StringTokenizer (str, "delimeter");
StringTokenizer Class Methods:
}
}
}
Output:
Calendar: This class is useful to handle date and time. We can create an object to Calendar
class as: Calendar cl = Calendar.getInstance ();
Calendar Class Methods:
Date Class: Date Class is also useful to handle date and time. Once Date class object is
created, it should be formatted using the following methods of DateFormat class of java.text
package.We can create an object to Date class as: Date dd = new Date ();
Once Date class object is created, it should be formatted using the methods of DateFormat
class of java.text package.
DateFormat class Methods:
This method is useful to store format information for time value into DateFormat object fmt.
This method is useful to store format information for date value into DateFormat object fmt.
Design Goals
The main design goal was to produce an API that was reasonably small, both in size, and, more
importantly, in "conceptual weight." It was critical that the new functionality not seem alien to
current Java programmers; it had to augment current facilities, rather than replacing them. At the
same time, the new API had to be powerful enough to provide all the advantages described
above.
To keep the number of core interfaces small, the interfaces do not attempt to capture such subtle
distinctions as mutability, modifiability, and resizability. Instead, certain calls in the core
interfaces are optional, allowing implementations to throw an UnsupportedOperationException
to indicate that they do not support a specified optional operation. Of course, collection
implementers must clearly document which optional operations are supported by an
implementation.
To keep the number of methods in each core interface small, an interface contains a method only
if either:
1. It is a truly fundamental operation: a basic operations in terms of which others could be
reasonably defined,
2. There is a compelling performance reason why an important implementation would want
to override it.
It was critical that all reasonable representations of collections interoperate well. This included
arrays, which cannot be made to implement the Collection interface directly without changing
the language. Thus, the framework includes methods to allow collections to be dumped into
arrays, arrays to be viewed as collections, and maps to be viewed as collections.
MULTI THREADING
Multi Threading:
Java Language Classes
The java.lang package contains the collection of base types (language types) that are always
imported into any given compilation unit. This is where you'll find the declarations of Object (the
root of the class hierarchy) and Class, plus threads, exceptions, wrappers for the primitive data
types, and a variety of other fundamental classes.
This picture illustrates the classes in java.lang, excluding all the exception and error classes.
Note the Boolean, Character, and Number classes--these classes are "wrapper" classes for the
primitive types. You use these classes in applications where the primitive types must be stored as
objects. Note also the Throwable class--this is the root class for all exceptions and errors.
Simply put, a thread is a program's path of execution. Most programs written today run as a
single thread, causing problems when multiple events or actions need to occur at the same time.
Let's say, for example, a program is not capable of drawing pictures while reading keystrokes.
The program must give its full attention to the keyboard input lacking the ability to handle more
than one event at a time. The ideal solution to this problem is the seamless execution of two
or more sections of a program at the same time. Threads allow us to do this.
Multiprogramming is a rudimentary form of parallel processing in which several programs are
run at the same time on a uniprocessor.Since there is only one processor, there can be no true
simultaneous execution of different programs. Instead, the operating system executes part of one
program, then part of another, and so on. To the user it appears that all programs are executing at
the same time.
Y SUBBA RAYUDU M Tech
Multitasking, in an operating system, is allowing a user to perform more than one computer task
(such as the operation of an application program) at a time. The operating system is able to keep
track of where you are in these tasks and go from one to the other without losing information
Multithreading is the ability of a program to manage its use by more than one thread at a time
.Dispatchable atomic units of the program are executing simultaneously.
Multithreaded applications deliver their potent power by running many threads concurrently
within a single program. From a logical point of view, multithreading means multiple lines of a
single program can be executed at the same time, however, it is not the same as starting a
program twice and saying that there are multiple lines of a program being executed at the same
time. In this case, the operating system is treating the programs as two separate and distinct
processes.
Uses of Threads:
Threads are used in designing serverside programs to handle multiple clients at a time.
Threads are used in games and animations.
We can reduce the idle time of processor.
Performance of processor is improved.
Reduces interferences between execution and user interface.
MULTI TASKING
1). More than one process running
simultaneously
2). Its a program.
3). It is a heavy-weight process.
4). Process is divided into threads.
5). Inter process communication is difficulty
It is kind of interesting to know how the objects without reference are found. Java normally finds
all the objects that have reference and then regards rest of the objects are reference less which
is in fact a very smart way of finding the unreferenced java objects.
Types of Java Garbage Collectors/Garbage Collection Algorithms:
On J2SE 5.0 and above, one can normally find the following types of Java Garbage collectors
that the programmers can normally choose to do a garbage collection through JVM Parameters.
The concurrent collector is used to collect the tenured generation and does most of the
collection concurrently with the execution of the application. The application is paused
for short periods during the collection.
A parallel version of the young generation copying collector is used with the concurrent
collector.
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC
o Selects the Concurrent Mark Sweep collector.
o This collector may deliver better response time properties for the application (i.e.,
low application pause time).
o It is a parallel and mostly-concurrent collector and and can be a good match for
the threading ability of an large multi-processor systems.
Dangling pointer bugs, which occur when a piece of memory is freed while there are still
pointers to it, and one of those pointers is then used. By then the memory may have been
re-assigned to another use, with unpredictable results.
Double free bugs, which occur when the program tries to free a region of memory that
has already been freed, and perhaps already been allocated again.
Certain kinds of memory leaks, in which a program fails to free memory occupied by
objects that will not be used again, leading, over time, to memory exhaustion.
Interaction with memory hierarchy effects can make this overhead intolerable in
circumstances that are hard to predict or to detect in routine testing.
The moment when the garbage is actually collected can be unpredictable, resulting in
stalls scattered throughout a session.
Memory may leak despite the presence of a garbage collector, if references to unused
objects are not themselves manually disposed of. This is described as a logical memory
leak.The belief that garbage collection eliminates all leaks leads many programmers not
to guard against creating such leaks.
In virtual memory environments, it can be difficult for the garbage collector to notice
when collection is needed, resulting in large amounts of accumulated garbage, a long,
disruptive collection phase, and other programs data swapped out.
Garbage collectors often exhibit poor locality (interacting badly with cache and virtual
memory systems), occupy more address space than the program actually uses at any one
time, and touch otherwise idle pages.
Garbage collectors may cause thrashing, in which a program spends more time copying
data between various grades of storage than performing useful work.
A thread enters the dead state when its run () method completes (or) terminates
for any reason. A dead thread is eventually be disposed of by the system.
One common way for a running thread to enter the blocked state is when the thread issues
an input or output request. In this case a blocked thread becomes ready when the input or
output waits for completes. A blocked thread cant use a processor even if one is
available.
Creating Threads:
We know that in every java program, there is a main thread available already. Apart from this
main thread, we can also create our owen threads in a program. The following steps should be
used.
Write a class that extends Thread class or implements Runnable interface this is available
in lang package.
Class Myclass extends Thread (or)
Class Myclass implements Runnable
Write public void run () method in that class. This is the method by default executed by
any thread.
Public void run()
{
Statements;
}
Create an object to my class, so that the run() method is available for execution.
Myclass obj=new Myclass();
Create a thread and attach it to the object.
Thread t=new Thread(obj);
or
To create a Thread, we can use the following forms:
Thread t1 = new Thread ();
Thread t2 = new Thread (obj);
Thread t3 = new Thread (obj, "thread-name");
Start running the threads.
t.start();
{
System.out.print (i + "\t");
}
}
}
class TDemo
{ public static void main(String args[])
{ MyThread obj = new MyThread ();
Thread t = new Thread (obj);
t.start ();
}
}
Output:
As a result, the numbers will be displayed starting from 1 to 99 using a for loop. If u want to
terminate the program in the middle, u can press Ctrl+C from the keyboard. This leads to
abnormal program termination. It means the entire program is terminated, not just the thread.
If we want to terminate only the thread that is running the code inside run() method, we should
devise our own mechanism.if we press Ctrl+C, we are abnormally terminating the program. This
is dangerous. Abnormal program termination may cause loss of data and lead to unreliable
results. So,we should terminate the thread only, not the program.hown can we terminate the
thread smoothly is the question now.
class TDemo
{
public static void main(String args[]) throws IOException
{
MyThread obj = new MyThread ();
Thread t = new Thread (obj);
t.start ();//stop the thread when enter key is pressed
System.in.read();
obj.stop=true;
}
}
Output:
0
2..
100
101
102.
{
MyThread obj=new MyThread();
Thread t1=new Thread(obj);
t1.start();
}
}
Output: java Sin
This is task1()
This is task2()
This is task3()
In this program, a single thread t1 is used to execute three tasks.
Multi Tasking Using Threads:
In multi taskin, several tasks are executed at a time. For this purpose, we need more than one
thread. For example, to perform 2 tasks, we can take 2 threads and attach them to the 2 tasks.
Then those tasks are simultaneously executed by the two threads. Using more than one thread is
called multi threading.
Program : Write a program to create more than one thread.
//using more than one thread is called Multi Threading
class Theatre extends Thread
{ String str;
Theatre (String str)
{ this.str = str;
}
public void run()
{ for (int i = 1; i <= 10 ; i++)
{ System.out.println (str + " : " + i);
try
{ Thread.sleep (2000);
}
catch (InterruptedException ie) { ie.printStackTrace ();
}
}
}
class TDemo1
{ public static void main(String args[])
{ Theatre obj1 = new Theatre ("Cut Ticket");
Theatre obj2 = new Theatre ("Show Chair");
Thread t1 = new Thread (obj1);
Thread t2 = new Thread (obj2);
t1.start ();
t2.start ();
}
}
Output:
In the preceding example, we have used 2 threads on the 2 objects of TDemo1 class. First we
have taken a String variable str in Theatre class. Then we passed two strings- cut ticket and show
chair into that variable from TDemo1 class. When t1. start () is executed, it starts execution run
() method code showing cut ticket. Note that in run () method, we used: Thread. sleep (2000) is
a static method in Thread class, which is used to suspend execution of a thread for some
specified milliseconds. Since this method can throw InterruptedException, we caught it in catch
block. When Thread t1 is suspended immediately t2. start () will make the thread t2 to execute
and when it encounters Thread.sleep(2000), it will suspend for specified time meanwhile t1 will
Y SUBBA RAYUDU M Tech
threads
are
simultaneously
}
else
{
}
}
}
class UnSafe
{
public static void main(String args[])
{
Reserve obj = new Reserve (1);
Thread t1 =new Thread (obj);
Thread t2 = new Thread (obj);
t1.setName ("First Person");
t2.setName ("Second Person");
t1.start ();
t2.start ();
}
}
Y SUBBA RAYUDU M Tech
}
Y SUBBA RAYUDU M Tech
else
{
}
}
}
}
class Safe
{ public static void main(String args[])
{ Reserve obj = new Reserve (1);
Thread t1 =new Thread (obj);
Thread t2 = new Thread (obj);
t1.setName ("First Person");
t2.setName ("Second Person");
t1.start ();
t2.start ();
}
}
Output:
/** Write a Java program that creates three threads. First thread displays Good
Morning every one second, the second thread displays Hello every two seconds and the
third thread displays Welcome every threeseconds. */
class A extends Thread
{
synchronized public void run()
{
try
{
while(true)
{
sleep(10);
System.out.println("good morning");
}
}
catch(Exception e)
{
}
}
}
class B extends Thread
{
synchronized public void run()
{
try
{
while(true)
{
Y SUBBA RAYUDU M Tech
sleep(20);
System.out.println("hello");
}
}
catch(Exception e)
{
}
}
class C extends Thread
{
synchronized public void run()
{
try
{
while(true)
{
sleep(30);
System.out.println("welcome");
}
}
catch(Exception e)
{
}
}
class ThreadDemo
{
public static void main(String args[])
Y SUBBA RAYUDU M Tech
{
A t1=new A();
B t2=new B();
C t3=new C();
t1.start();
t2.start();
t3.start();
}
}
Output:
Press Cntrl+C to exit
Good morning
Hello
Good morning
Welcome
Good morning
Hello
Good morning
Good morning
Hello
InterThread Communication:
Thread Communication: In some cases two or more threads should communicate with each
other. One thread output may be send as input to other thread. For example, a consumer thread is
waiting for a Producer to produce the data (or some goods). When the Producer thread completes
production of data, then the Consumer thread should take that data and use it.
In producer class we take a StringBuffer object to store data, in this case; we take some numbers
from 1 to 5. These numbers are added to StringBuffer object. Until producer completes placing
the data into StringBuffer the consumer has to wait. Producer sends a notification immediately
after the data production is over.
/** Write a Java program that correctly implements producer consumer problem using the
concept of interthread communication.*/
//java program for producer and consumer--inter thread communication
class Producer implements Runnable
{
Thread1 t;
Producer(Thread1 t)
{
this.t=t;
new Thread(this,"Producer").start();
}
public void run()
{
int i=0;
while (true)
{
t.put(i++);
}
}
}
class Consumer implements Runnable
{
Thread1 t;
Consumer(Thread1 t)
{
this.t=t;
new Thread(this,"Consumer").start();
}
Y SUBBA RAYUDU M Tech
}
}
Output:
Press Control+C to exit
Put:0
Get:0
Put:1
Get1
.
Y SUBBA RAYUDU M Tech
Deamon Threads:
Daemon threads are sometimes called "service" threads that normally run at a low priority and
provide a basic service to a program or programs when activity on a machine is reduced. An
example of a daemon thread that is continuously running is the garbage collector thread. This
thread, provided by the JVM, will scan programs for variables that will never be accessed again
and free up their resources back to the system. A thread can set the daemon flag by passing a true
boolean value to the setDaemon() method. If a false boolean value is passed, the thread will
become a user thread. However, this must occur before the thread has been started.
A deamon thread is a thread that executes continuously. Daemon threads are service providers
for other threads or objects. It generally provides a background processing.
To make a thread t as a deamon thread, we can use setDeamon() method as:
t.setDeamon(true);
To know if a thread is deamon or not, isDeamon is useful.
boolean x=t.isDaemon().
Write a example program for setting a thread as a daemon thread
public class DaemonDemo extends Thread
{
public void run()
{
for(int i=0;i<5;i++)
System.out.println(this.getName()+" :"+i);
}
public static void main(String args[])
{
DaemonDemo d1=new DaemonDemo();
Thread Groups:
Thread Group: A ThreadGroup represents a group of threads. The main advantage of taking
several threads as a group is that by using a single method, we will be able to control all
the threads in the group.
Thread groups offer a convenient way to manage groups of threads as a unit. This is particularly
valuable in situations in which you want to suspend and resume a number of related threads. For
example, imagine a program in which one set of threads is used for printing a document, another
set is used to display the document on the screen, and another set saves the document to a disk
file. If printing is aborted, you will want an easy way to stop all threads related to printing.
Thread groups offer this convenience.
Creating a thread group:
To add a thread to this group (tg):Thread t1 = new Thread (tg, targetobj, threadname);
To add another thread group to this group (tg):
ThreadGroup tg1 = new ThreadGroup (tg, groupname);
tg.getParent ();
t.getThreadGroup ();
}
}
class Cancellation extends Thread
{ public void run ()
{ System.out.println ("I am Cancellation Thread");
}
}
Output: