Arrays and Collections
In this lesson we will go over arrays and important collections including ArrayLists, Stacks, and Queues.
Elements
Definition: An element is the value stored at a particular position within an array.
Example: Suppose an array of integers: [5,3,2,6], The 2nd element (index 1) in the array is 3.
Arrays
Definition: An array is a fixed-size, ordered collection of elements of the same type stored in contiguous memory locations.
Example
int[] scores = {95, 87, 74, 100}; System.out.println(scores[2]); // prints 74 scores[2] = 80; // update the third element System.out.println(scores[2]); // prints 80 System.out.println(scores.length); // prints 4
Key Characteristics:
Fixed Size: Once created, the length of an array cannot be changed.
Indexed Access: Elements are accessed using a zero-based index (Indices start at 0).
Homogeneous Data: All elements must be of the same data type.
Direct Lookup: Java can access any element immediately using its index.
[!WARNING] Accessing an index outside the valid range (
0
toarray.length - 1
) will cause aArrayIndexOutOfBoundsException
.Example:
int[] numbers = {1, 2, 3}; System.out.println(numbers[3]); // ERROR: valid indices are 0,1,2
Collections
[!NOTE] Collections in Java are dynamic data structures that can grow or shrink in size, unlike arrays which have a fixed length. They are part of the Java Collections Framework (JCF), which provides a set of interfaces and classes for storing and manipulating groups of objects. However, even though most of these are beyond the scope of this lesson, learning them is encouraged.
Main Interfaces in JCF:
List: Ordered, allows duplicates (e.g.,
ArrayList
,LinkedList
).Set: Unordered, unique elements only (e.g.,
HashSet
,TreeSet
).Queue: Ordered for processing, typically FIFO (e.g.,
LinkedList
,PriorityQueue
,ArrayDeque
).Map: Key-value pairs (e.g.,
HashMap
,TreeMap
,LinkedHashMap
).
Diagram Placeholder: (Java Collections Framework hierarchy diagram)
ArrayList
import java.util.ArrayList;
ArrayList<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
System.out.println(names.get(1)); // prints Bob
names.remove("Alice"); // removes Alice
System.out.println(names); // prints [Bob, Charlie]
What it is
A list that behaves like a flexible array. You can add or remove items and the list adjusts its size for you.
Keeps items in the order you insert them.
Core operations you’ll use a lot
add(item)
,add(index, item)
: put items in the list.get(index)
: read an item by its position.set(index, item)
: replace an item at a position.remove(index)
/remove(object)
: delete by position or by value.size()
: how many items are in the list.
When to use it
You want a list of things that you’ll read by their position (first, second, third…).
You don’t know the final amount of items up front.
You care about keeping the original insertion order.
Mini‑exercise
Make a list of three favorite movies. Replace the second one, then remove the last one.
Stack
[!TIP] A
Stack
follows the LIFO (Last In, First Out) rule. Think of a stack of plates; the last plate placed is the first one taken off.
import java.util.Stack;
Stack<Integer> stack = new Stack<>();
stack.push(10);
stack.push(20);
stack.push(30);
System.out.println(stack.pop()); // prints 30
System.out.println(stack.peek()); // prints 20
What it is
A container that lets you work with the top item only.
Great for “undo” features, backtracking, and processing nested structures (like matching parentheses).
Core operations
push(item)
: put an item on top.pop()
: take the top item off and return it.peek()
: look at the top item without removing it.isEmpty()
: check if there are any items.
When to use it
You need to reverse a recent action or remember a path of steps.
You’re parsing expressions or checking for balanced brackets.
Mini‑exercise
Push three integers. Pop once. What’s left on top?
Queue
[!TIP] A
Queue
follows the FIFO (First In, First Out) rule. Think of a line at the grocery store; the first person in line is the first one served.
import java.util.LinkedList;
import java.util.Queue;
Queue<String> queue = new LinkedList<>();
queue.add("first");
queue.add("second");
queue.add("third");
System.out.println(queue.poll()); // prints "first"
System.out.println(queue.peek()); // prints "second"
What it is
A line of items where you add to the back and take from the front.
Helpful whenever tasks must be handled in the order they arrive.
Core operations
add(item)
/offer(item)
: put an item at the back.remove()
/poll()
: take the front item (usepoll()
to avoid exceptions when empty).peek()
: look at the front item.isEmpty()
: check if there are any items.
When to use it
Processing tasks or jobs in arrival order (printing, requests, customer service tickets).
Breadth‑first search in graphs and trees.
Mini‑exercise
Enqueue three strings, dequeue one, then check which string is at the front.
Summary
Use ArrayList for lists that need to resize automatically.
Use Stack when you need LIFO behavior.
Use Queue when you need FIFO behavior.
Arrays are still useful when working with a fixed number of elements.
Last updated
Was this helpful?