Stack Implementation using Array List

In our couple of previous articles, we have seen a different implementation of Stack such as
In this article, we will discuss how to implement Stack using ArrayList.

Why an ArrayList? 

The primary advantage of using an ArrayList for stack implementation is its dynamic resizing capability. An ArrayList automatically grows when it reaches its capacity, ensuring that our stack won't run out of space (unless we exhaust available memory). 

Stack Implementation using Array List in Java

Here's a simple demonstration of a stack implemented using an ArrayList:
import java.util.ArrayList;

public class StackUsingArrayList<T> {
    private ArrayList<T> stackList;

    // Constructor to initialize the stack
    public StackUsingArrayList() {
        stackList = new ArrayList<>();

    // Function to check if the stack is empty
    public boolean isEmpty() {
        return stackList.isEmpty();

    // Function to push an element onto the stack
    public void push(T value) {

    // Function to pop an element from the stack
    public T pop() {
        if (isEmpty()) {
            System.out.println("Stack is empty");
            return null;
        return stackList.remove(stackList.size() - 1);

    // Function to get the top element of the stack without popping it
    public T peek() {
        if (isEmpty()) {
            System.out.println("Stack is empty");
            return null;
        return stackList.get(stackList.size() - 1);
Testing the Stack:
public class Main {
    public static void main(String[] args) {
        StackUsingArrayList<Integer> stack = new StackUsingArrayList<>();

        System.out.println("Top element: " + stack.peek()); // Outputs: 30
        System.out.println("Popped element: " + stack.pop()); // Outputs: 30
        System.out.println("Top element after pop: " + stack.peek()); // Outputs: 20
Top element: 30
Popped element: 30
Top element after pop: 20


Implementing a stack using an ArrayList in Java is straightforward and takes advantage of the dynamic resizing and various in-built methods of the ArrayList. However, remember that while dynamic resizing offers flexibility, it comes with the cost of occasional resizing operations, which can be computationally expensive. As always, choose your data structure based on the specific requirements and constraints of your application.