Java Collections Framework

Java Collections Framework (JCF) provides a set of classes and interfaces for storing and manipulating groups of objects. The framework introduces a new approach to handling collections in Java, offering greater flexibility and performance compared to traditional methods like arrays.


Why a New Approach?

Java Collections Framework (JCF) improves upon traditional methods of storing and managing groups of objects by offering:

  • Dynamic Resizing: Collections can grow and shrink as needed.
  • Rich Functionality: Enhanced operations for searching, sorting, and modifying elements.
  • Type Safety: Generics allow only specific types of objects in a collection, reducing runtime errors.

1. Array of Names and Numbers

While you can use arrays, ArrayList is preferred for its flexibility.

Using Array:

String[] names = {"Alice", "Bob", "Charlie"};
int[] numbers = {1, 2, 3};

// Accessing elements
System.out.println(names[0]); // Alice
System.out.println(numbers[1]); // 2

Using ArrayList:

import java.util.ArrayList;

ArrayList<String> namesList = new ArrayList<>();
namesList.add("Alice");
namesList.add("Bob");
namesList.add("Charlie");

// Accessing elements
System.out.println(namesList.get(0)); // Alice
System.out.println(namesList.size()); // 3

2. Maintaining a Stack

A stack is a LIFO data structure. You can use the Stack class or Deque for stack operations.

Using Stack:

import java.util.Stack;

Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);

// Accessing elements
System.out.println(stack.peek()); // 3 (top element)

// Removing elements
System.out.println(stack.pop()); // 3
System.out.println(stack.size()); // 2

3. Maintaining a Linked List

A linked list provides efficient insertions and deletions.

Using LinkedList:

import java.util.LinkedList;

LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("A");
linkedList.add("B");
linkedList.add("C");

// Inserting elements
linkedList.addFirst("Start");
linkedList.addLast("End");

// Accessing elements
System.out.println(linkedList.get(1)); // B

// Removing elements
linkedList.remove("C");
System.out.println(linkedList.size()); // 4

4. Maintaining a Tree

A tree structure maintains elements in sorted order. You can use TreeSet or TreeMap.

Using TreeSet:

import java.util.TreeSet;

TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(5);
treeSet.add(1);
treeSet.add(3);

// Accessing elements
System.out.println(treeSet); // [1, 3, 5]

// Removing elements
treeSet.remove(3);
System.out.println(treeSet); // [1, 5]

5. Maintaining a HashMap

A HashMap stores key-value pairs for fast access.

Using HashMap:

import java.util.HashMap;

HashMap<String, Integer> map = new HashMap<>();
map.put("Alice", 25);
map.put("Bob", 30);

// Accessing values
int age = map.get("Alice"); // returns 25
System.out.println(age);

// Checking if a key exists
System.out.println(map.containsKey("Bob")); // true

// Removing a key-value pair
map.remove("Bob");
System.out.println(map); // {Alice=25}

6. Using the Algorithms

The Collections class provides utility methods for algorithms.

Sorting and Searching:

import java.util.ArrayList;
import java.util.Collections;

ArrayList<String> list = new ArrayList<>();
list.add("Charlie");
list.add("Alice");
list.add("Bob");

// Sorting the list
Collections.sort(list);
System.out.println(list); // [Alice, Bob, Charlie]

// Searching for an element
int index = Collections.binarySearch(list, "Bob");
System.out.println(index); // 1

Summary

The Java Collections Framework offers various data structures such as ArrayList, LinkedList, Stack, TreeSet, and HashMap, each suited for different use cases. These collections are dynamic, type-safe, and come with built-in methods to simplify operations like sorting, searching, and manipulating elements. Using JCF enhances code efficiency and readability compared to traditional array-based approaches.