Although we can use an array to store a group of elements of the same
type (either primitives or objects). The array, however, does not
support so-called dynamic allocation - it has a fixed length
which cannot be changed once allocated. Furthermore, array is a
simple linear structure. Many applications may require more complex data
structure such as linked list, stack, hash table, sets, or trees.
In Java, dynamically allocated data structures (such as
ArrayList
, LinkedList
, Vector
, Stack
, HashSet
, HashMap
, Hashtable
) are supported in a unified architecture called the Collection Framework, which mandates the common behaviors of all the classes.
A collection, as its name implied, is simply an object that holds a collection (or a group, a container) of objects. Each item in a collection is called an element. A framework,
by definition, is a set of interfaces that force you to adopt some
design practices. A well-designed framework can improve your
productivity and provide ease of maintenance.
The collection framework provides a unified interface
to store, retrieve and manipulate the elements of a collection,
regardless of the underlying and actual implementation. This allows the
programmers to program at the interfaces, instead of the actual
implementation.
java.util
) contains:- A set of interfaces,
- Implementation classes, and
- Algorithms (such as sorting and searching).
ArrayList
Arraylist class implements List interface and it is
based on an Array data structure. It is widely used because of the
functionality and flexibility it offers. Most of the developers choose Arraylist over Array as it’s a very good alternative of traditional java arrays. ArrayList is a resizable-array implementation of the
List
interface. It implements all optional list operations, and permits all elements, including null
.alist.add("Steve"); //This will add "Steve" at the end of List
To add the element at the specified location in ArrayList, we can specify the index in the add method like this:alist.add(3, "Steve"); //This will add "Steve" at the fourth position
Lets write the complete code:import java.util.*; class JavaExample{ public static void main(String args[]){ ArrayList<String> alist=new ArrayList<String>(); alist.add("Steve"); alist.add("Tim"); alist.add("Lucy"); alist.add("Pat"); alist.add("Angela"); alist.add("Tom"); //displaying elements System.out.println(alist); //Adding "Steve" at the fourth position alist.add(3, "Steve"); //displaying elements System.out.println(alist); } }
Output:[Steve, Tim, Lucy, Pat, Angela, Tom] [Steve, Tim, Lucy, Steve, Pat, Angela, Tom]
Methods in Java ArrayList:- forEach(Consumer action): Performs the given action for each element of the Iterable until all elements have been processed or the action throws an exception.
- retainAll(Collection c): Retains only the elements in this list that are contained in the specified collection.
- removeIf(Predicate filter): Removes all of the elements of this collection that satisfy the given predicate.
- contains(Object o): Returns true if this list contains the specified element.
- remove(int index): Removes the element at the specified position in this list.
- remove(Object o): Removes the first occurrence of the specified element from this list, if it is present.
- get(int index): Returns the element at the specified position in this list.
- subList(int fromIndex, int toIndex): Returns a view of the portion of this list between the specified fromIndex, inclusive, and toIndex, exclusive.
- spliterator(): Creates a late-binding and fail-fast Spliterator over the elements in this list.
- set(int index, E element): Replaces the element at the specified position in this list with the specified element.
- size(): Returns the number of elements in this list.
- removeAll(Collection c): Removes from this list all of its elements that are contained in the specified collection.
- ensureCapacity(int minCapacity): Increases the capacity of this ArrayList instance, if necessary, to ensure that it can hold at least the number of elements specified by the minimum capacity argument.
- listIterator(): Returns a list iterator over the elements in this list (in proper sequence).
- listIterator(int index): Returns a list iterator over the elements in this list (in proper sequence), starting at the specified position in the list.
- isEmpty(): Returns true if this list contains no elements.
- removeRange(int fromIndex, int toIndex): Removes from this list all of the elements whose index is between fromIndex, inclusive, and toIndex, exclusive.
- void clear(): This method is used to remove all the elements from any list.
- void add(int index, Object element): This method is used to insert a specific element at a specific position index in a list.
- void trimToSize(): This method is used to trim the capacity of the instance of the ArrayLis to the list’s current size.
- int indexOf(Object O): The index the first occurrence of a specific element is either returned, or -1 in case the element is not in the list.
- int lastIndexOf(Object O): The index the last occurrence of a specific element is either returned, or -1 in case the element is not in the list.
- Object clone(): This method is used to return a shallow copy of an ArrayList.
- Object[] toArray(): This method is used to return an array containing all of the elements in the list in correct order.
- Object[] toArray(Object[] O): It is also used to return an array containing all of the elements in this list in the correct order same as the previous method.
- boolean addAll(Collection C): This method is used to append all the elements from a specific collection to the end of the mentioned list, in such a order that the values are returned by the specified collection’s iterator.
- boolean add(Object o): This method is used to append a specificd element to the end of a list.
- boolean addAll(int index, Collection C): Used to insert all of the elements starting at the specified position from a specific collection into the mentioned list.
LinkedList
LinkedList implements the Collection interface. It uses a doubly linked list internally to store the elements. It can store the duplicate elements. It maintains the insertion order and is not synchronized. In LinkedList, the manipulation is fast because no shifting is required.import java.util.*;
public class TestJavaCollection2{
public static void main(String args[]){
LinkedList<String> al=new LinkedList<String>();
al.add("Ravi");
al.add("Vijay");
al.add("Ravi");
al.add("Ajay");
Iterator<String> itr=al.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
Output:
Consider the following example.
Output:
Consider the following example.
Output:
Set can be instantiated as:
Consider the following example.
Output:
Consider the following example.
Output:
Consider the following example:
Output:
Ravi Vijay Ravi Ajay
Vector
Vector uses a dynamic array to store the data elements. It is similar to ArrayList. However, It is synchronized and contains many methods that are not the part of Collection framework.Consider the following example.
import java.util.*;
public class TestJavaCollection3{
public static void main(String args[]){
Vector<String> v=new Vector<String>();
v.add("Ayush");
v.add("Amit");
v.add("Ashish");
v.add("Garima");
Iterator<String> itr=v.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
public class TestJavaCollection3{
public static void main(String args[]){
Vector<String> v=new Vector<String>();
v.add("Ayush");
v.add("Amit");
v.add("Ashish");
v.add("Garima");
Iterator<String> itr=v.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
Ayush Amit Ashish Garima
Stack
The stack is the subclass of Vector. It implements the last-in-first-out data structure, i.e., Stack. The stack contains all of the methods of Vector class and also provides its methods like boolean push(), boolean peek(), boolean push(object o), which defines its properties.Consider the following example.
import java.util.*;
public class TestJavaCollection4{
public static void main(String args[]){
Stack<String> stack = new Stack<String>();
stack.push("Ayush");
stack.push("Garvit");
stack.push("Amit");
stack.push("Ashish");
stack.push("Garima");
stack.pop();
Iterator<String> itr=stack.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
public class TestJavaCollection4{
public static void main(String args[]){
Stack<String> stack = new Stack<String>();
stack.push("Ayush");
stack.push("Garvit");
stack.push("Amit");
stack.push("Ashish");
stack.push("Garima");
stack.pop();
Iterator<String> itr=stack.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
Ayush Garvit Amit Ashish
Set Interface
Set Interface in Java is present in java.util package. It extends the Collection interface. It represents the unordered set of elements which doesn't allow us to store the duplicate items. We can store at most one null value in Set. Set is implemented by HashSet, LinkedHashSet, and TreeSet.Set can be instantiated as:
- Set<data-type> s1 = new HashSet<data-type>();
- Set<data-type> s2 = new LinkedHashSet<data-type>();
- Set<data-type> s3 = new TreeSet<data-type>();
HashSet
HashSet class implements Set Interface. It represents the collection that uses a hash table for storage. Hashing is used to store the elements in the HashSet. It contains unique items.Consider the following example.
import java.util.*;
public class TestJavaCollection7{
public static void main(String args[]){
//Creating HashSet and adding elements
HashSet<String> set=new HashSet<String>();
set.add("Ravi");
set.add("Vijay");
set.add("Ravi");
set.add("Ajay");
//Traversing elements
Iterator<String> itr=set.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
public class TestJavaCollection7{
public static void main(String args[]){
//Creating HashSet and adding elements
HashSet<String> set=new HashSet<String>();
set.add("Ravi");
set.add("Vijay");
set.add("Ravi");
set.add("Ajay");
//Traversing elements
Iterator<String> itr=set.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
Vijay Ravi Ajay
LinkedHashSet
LinkedHashSet class represents the LinkedList implementation of Set Interface. It extends the HashSet class and implements Set interface. Like HashSet, It also contains unique elements. It maintains the insertion order and permits null elements.Consider the following example.
import java.util.*;
public class TestJavaCollection8{
public static void main(String args[]){
LinkedHashSet<String> set=new LinkedHashSet<String>();
set.add("Ravi");
set.add("Vijay");
set.add("Ravi");
set.add("Ajay");
Iterator<String> itr=set.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
public class TestJavaCollection8{
public static void main(String args[]){
LinkedHashSet<String> set=new LinkedHashSet<String>();
set.add("Ravi");
set.add("Vijay");
set.add("Ravi");
set.add("Ajay");
Iterator<String> itr=set.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
Ravi Vijay Ajay
TreeSet
Java TreeSet class implements the Set interface that uses a tree for storage. Like HashSet, TreeSet also contains unique elements. However, the access and retrieval time of TreeSet is quite fast. The elements in TreeSet stored in ascending order.Consider the following example:
import java.util.*;
public class TestJavaCollection9{
public static void main(String args[]){
//Creating and adding elements
TreeSet<String> set=new TreeSet<String>();
set.add("Ravi");
set.add("Vijay");
set.add("Ravi");
set.add("Ajay");
//traversing elements
Iterator<String> itr=set.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
public class TestJavaCollection9{
public static void main(String args[]){
//Creating and adding elements
TreeSet<String> set=new TreeSet<String>();
set.add("Ravi");
set.add("Vijay");
set.add("Ravi");
set.add("Ajay");
//traversing elements
Iterator<String> itr=set.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
}
}
Ajay Ravi Vijay