This is a topic on which I did a lot of study and research on internet as it was a favorite question to be asked from Java Collections. It may be a long read but then at the end of it, It's worth it.
Sometimes
It means that if you want to index elements or add and remove elements at the end of the array, use either a
Sometimes
Vector
is better; sometimes ArrayList
is better; sometimes you don't want to
use either. I hope you weren't looking for an easy answer because the answer
depends upon what you are doing. There are four factors to consider:- API
- Synchronization
- Data growth
- Usage patterns
API
In The Java Programming Language (Addison-Wesley, June 2000) Ken Arnold, James Gosling, and David Holmes describe theVector
as an analog to the ArrayList
. So, from an API perspective, the two
classes are very similar. However, there are still some major differences
between the two classes. Synchronization
Vectors
are synchronized. Any method that
touches the Vector
's
contents is thread safe. ArrayList
, on the other hand, is unsynchronized, making them, therefore, not
thread safe. With that difference in mind, using synchronization will incur a
performance hit. So if you don't need a thread-safe collection, use the ArrayList
. Why pay the price of synchronization
unnecessarily? Data growth
Internally, both theArrayList
and Vector
hold onto their contents using an Array
. You need to keep this fact in mind
while using either in your programs. When you insert an element into an ArrayList
or a Vector
, the object will need to expand its
internal array if it runs out of room. A Vector
defaults to doubling the size of its
array, while the ArrayList
increases its array size by 50 percent. Depending on how you use
these classes, you could end up taking a large performance hit while adding new
elements. It's always best to set the object's initial capacity to the largest
capacity that your program will need. By carefully setting the capacity, you
can avoid paying the penalty needed to resize the internal array later. If you
don't know how much data you'll have, but you do know the rate at which it
grows, Vector
does possess a slight advantage since
you can set the increment value. Usage patterns
Both theArrayList
and Vector
are good for retrieving elements from a
specific position in the container or for adding and removing elements from the
end of the container. All of these operations can be performed in constant time
-- O(1). However, adding and
removing elements from any other position proves more expensive -- linear to be
exact: O(n-i), where n is the number of elements and i is the index of the element added or
removed. These operations are more expensive because you have to shift all
elements at index i and
higher over by one element. So what does this all mean? It means that if you want to index elements or add and remove elements at the end of the array, use either a
Vector
or an ArrayList
. If you want to do anything else to the
contents, go find yourself another container class. For example, the LinkedList
can add or remove an element at any
position in constant time -- O(1).
However, indexing an element is a bit slower -- O(i) where i
is the index of the element. Traversing an ArrayList
is also easier since you can simply use
an index instead of having to create an iterator. The LinkedList
also creates an internal object for
each element inserted. So you have to be aware of the extra garbage being
created.
Vectors
in Detail:
Vector implements a dynamic array. It is similar to ArrayList, but with
two differences: Vector is synchronized, and it contains many
legacy methods that are not part of the collections framework. With the release
of Java 2, Vector was reengineered to extend AbstractList and
implement the List interface, so it now is fully compatible with
collections.
Here are
the Vector constructors:
Vector( )
Vector(int size)
Vector(int size, int incr)
Vector(Collection c)
Vector(int size)
Vector(int size, int incr)
Vector(Collection c)
The first
form creates a default vector, which has an initial size of 10. The second form
creates a vector whose initial capacity is specified by size. The third
form creates a vector whose initial capacity is specified by size and
whose increment is specified by incr. The increment specifies the number
of elements to allocate each time that a vector is resized upward. The fourth
form creates a vector that contains the elements of collection c. This
constructor was added by Java 2.
All
vectors start with an initial capacity. After this initial capacity is reached,
the next time that you attempt to store an object in the vector, the vector
automatically allocates space for that object plus extra room for additional
objects. By allocating more than just the required memory, the vector reduces
the number of allocations that must take place. This reduction is important,
because allocations are costly in terms of time. The amount of extra space
allocated during each reallocation is determined by the increment that you
specify when you create the vector. If you don't specify an increment, the
vector's size is doubled by each allocation cycle.
Vector defines these protected data members:
int capacityIncrement;
int elementCount;
Object elementData[ ];
int elementCount;
Object elementData[ ];
The
increment value is stored in capacityIncrement. The number of elements
currently in the vector is stored in elementCount. The array that holds
the vector is stored in elementData.
Because Vector
implements List, you can use a vector just like you use an ArrayList
instance. You can also manipulate one using its legacy methods. For
example, after you instantiate a Vector, you can add an element to it by
calling addElement( ). To obtain the element at a specific location,
call elementAt( ). To obtain the first element in the vector, call firstElement(
). To retrieve the last element, call lastElement( ). You can obtain
the index of an element by using indexOf( ) and lastIndexOf( ).
To remove an element, call removeElement( ) or removeElementAt( ).
The
following program uses a vector to store various types of numeric objects. It
demonstrates several of the legacy methods defined by Vector. It also
demonstrates the Enumeration interface.
//Demonstrate various Vector operations.
import java.util.*;
class VectorDemo {
public static void main(String args[]) {
// initial size is 3, increment is 2
Vector v = new Vector(3, 2);
System.out.println("Initial size: " + v.size());
System.out.println("Initial capacity: " +
v.capacity());
v.addElement(new Integer(1));
v.addElement(new Integer(2));
v.addElement(new Integer(3));
v.addElement(new Integer(4));
System.out.println("Capacity after four additions: " +
v.capacity());
v.addElement(new Double(5.45));
System.out.println("Current capacity: " +
v.capacity());
v.addElement(new Double(6.08));
v.addElement(new Integer(7));
System.out.println("Current capacity: " +
v.capacity());
v.addElement(new Float(9.4));
v.addElement(new Integer(10));
System.out.println("Current capacity: " +
v.capacity());
v.addElement(new Integer(11));
v.addElement(new Integer(12));
System.out.println("First element: " +
(Integer)v.firstElement());
System.out.println("Last element: " +
(Integer)v.lastElement());
if(v.contains(new Integer(3)))
System.out.println("Vector contains 3.");
// enumerate the elements in the vector.
Enumeration vEnum = v.elements();
System.out.println("\\nElements in vector:");
while(vEnum.hasMoreElements())
System.out.print(vEnum.nextElement() + " ");
System.out.println();
}
}
import java.util.*;
class VectorDemo {
public static void main(String args[]) {
// initial size is 3, increment is 2
Vector v = new Vector(3, 2);
System.out.println("Initial size: " + v.size());
System.out.println("Initial capacity: " +
v.capacity());
v.addElement(new Integer(1));
v.addElement(new Integer(2));
v.addElement(new Integer(3));
v.addElement(new Integer(4));
System.out.println("Capacity after four additions: " +
v.capacity());
v.addElement(new Double(5.45));
System.out.println("Current capacity: " +
v.capacity());
v.addElement(new Double(6.08));
v.addElement(new Integer(7));
System.out.println("Current capacity: " +
v.capacity());
v.addElement(new Float(9.4));
v.addElement(new Integer(10));
System.out.println("Current capacity: " +
v.capacity());
v.addElement(new Integer(11));
v.addElement(new Integer(12));
System.out.println("First element: " +
(Integer)v.firstElement());
System.out.println("Last element: " +
(Integer)v.lastElement());
if(v.contains(new Integer(3)))
System.out.println("Vector contains 3.");
// enumerate the elements in the vector.
Enumeration vEnum = v.elements();
System.out.println("\\nElements in vector:");
while(vEnum.hasMoreElements())
System.out.print(vEnum.nextElement() + " ");
System.out.println();
}
}
The
output from this program is shown here:
Initial size: 0
Initial capacity: 3
Capacity after four additions: 5
Current capacity: 5
Current capacity: 7
Current capacity: 9
First element: 1
Last element: 12
Vector contains 3.
Elements in vector:
1 2 3 4 5.45 6.08 7 9.4 10 11 12
Initial capacity: 3
Capacity after four additions: 5
Current capacity: 5
Current capacity: 7
Current capacity: 9
First element: 1
Last element: 12
Vector contains 3.
Elements in vector:
1 2 3 4 5.45 6.08 7 9.4 10 11 12
With the
release of Java 2, Vector adds support for iterators. Instead of relying
on an enumeration to cycle through the objects (as the preceding program does),
you now can use an iterator. For example, the following iterator-based code can
be substituted into the program:
// use an iterator to display contents
Iterator vItr = v.iterator();
System.out.println("\\nElements in vector:");
while(vItr.hasNext())
System.out.print(vItr.next() + " ");
System.out.println();
Iterator vItr = v.iterator();
System.out.println("\\nElements in vector:");
while(vItr.hasNext())
System.out.print(vItr.next() + " ");
System.out.println();
Because
enumerations are not recommended for new code, you will usually use an iterator
to enumerate the contents of a vector. Of course, much legacy code exists that
employs enumerations. Fortunately, enumerations and iterators work in nearly
the same manner.
The Iterators returned by Vector's
iterator and listIterator methods are fail-fast: if the Vector is
structurally modified at any time after the Iterator is created, in any way
except through the Iterator's own remove or add methods, the Iterator will
throw a ConcurrentModificationException. Thus, in the face of concurrent
modification, the Iterator fails quickly and cleanly, rather than risking
arbitrary, non-deterministic behavior at an undetermined time in the future.
The Enumerations returned by Vector's elements method are not fail-fast.
Source: Books & Internet.
0 comments:
Post a Comment