Difference between List and ArrayList in Java

Top App Developers in USA

Top Blockchain Development Companies in USA

Most-Trusted Android App Development Companies

8 min read

Difference between List and ArrayList in Java

Share on
Facebook | Linkedin
December 20th, 2023

The Java Collections Framework provides many useful data structures for organizing and manipulating data. Two commonly used collections are List and ArrayList. While both represent indexed collections of objects, there are some key differences in how they are implemented under the hood.

A list is an interface that specifies methods and properties that lists should have. It allows for creating linked-list data structures where elements are stored in nodes connected by pointers. ArrayList in Java is a class that implements the List interface. It provides a dynamic array that expands as items are added. ArrayLists are backed by a standard array that grows and shrinks as needed.

In this article, The App Founders will look at how ArrayList in Java works compared to the general List interface. Understanding these distinctions will help any traditional or Hybrid App Development Agency select the most appropriate list implementation for their application’s needs.

ArrayLists Extend Lists

ArrayLists Extend Lists

The ArrayList in Java extends AbstractList and implements the List interface. This means that ArrayList inherits from AbstractList and implements all the methods defined in the List interface.

The key difference between ArrayList and a regular array is that ArrayList is resizable dynamically, while arrays have a fixed size that needs to be defined on initialization. By extending AbstractList, ArrayList provides a resizable array implementation of the List interface, which has the advantages of both a regular array and a List.

This is important because the List interface does not care about the backing data structure. By extending AbstractList, ArrayList can use a resizable array as the backing data structure while exposing only List interface methods to clients. This provides much flexibility since the underlying array can grow and shrink transparently behind the scenes.

So, ArrayList in Java combines the benefits of both arrays and Lists.

Resizable Array Backing

Resizable Array Backing

One of the key differences between List and ArrayList in Java is in their internal implementations. An ArrayList is backed by a dynamic array that grows and shrinks as elements are added and removed. This provides fast O(1) access times to elements by index since the array is contiguous in memory.

However, a List is an interface that various data structures like linked lists and vectors can implement. The backing data structure of a List can be an array, a linked list, a hash table, or some other collection. This allows the developer to choose the right implementation for their use case.

For example, LinkedList provides O(1) add and remove times at the expense of slower O(n) access by index since elements are scattered in memory based on the linked list pointers. An ArrayList is better for random access, while a LinkedList is better for frequent insertions and deletions.

The array backing an ArrayList starts with a default capacity (usually 10 elements). As more elements are added, the capacity grows by 50% to accommodate. This amortized resizing allows fast O(1) adds most of the time. The tradeoff is the potential cost of copying the array contents to a new bigger array if the capacity needs to increase.

Therefore, ArrayLists provide fast random access with their resizable array backing, while Lists can have different structural implementations depending on the exact class used.

Access Time Complexity

Access Time Complexity

When accessing elements, ArrayLists have O(1) constant time complexity for get/set operations, while standard Lists have O(n) linear time complexity.

This is because ArrayLists use a resizable array as their backing data structure. Getting or setting the element at an index is just accessing that index in the array, a constant time operation.

In contrast, Lists are backed by linked nodes. To access an element at a particular index, the List has to traverse each node from the head until it reaches the desired index. This is an O(n) operation since it depends on the number of elements in the List.

Therefore, if you need fast random access to elements by index, ArrayLists are superior with their O(1) access time. But if you mainly add/remove from the ends of the List, the O(n) access time may not be a major performance concern.

Add/Remove Time Complexity

Add/Remove Time Complexity

One of the main differences between ArrayList and List in Java Development Frameworks is the time complexity for adding and removing elements. An ArrayList has amortized constant time, O(1), for add and remove operations, while a List has linear time, O(n).

An ArrayList can achieve O(1) time for adding and removing because a resizable array backs it. When an element is added, the array grows dynamically to accommodate it. There can be some overhead to growing the backing array, but amortized over many operations, the cost per add or remove is O(1).

On the other hand, a List implementation like LinkedList is backed by nodes that link to each other in a chain. To add an element, the List has to iterate to the insertion point, which takes O(n) time. The same goes for removing an element – the List must search linearly for the node to remove.

So, if you need constant time add/remove, ArrayList in Java is a better choice. But if you frequently add and remove from the front or middle of the List, LinkedList will be more efficient. The difference highlights the importance of choosing the right implementation for your use case.

Memory Overhead

Memory Overhead

ArrayList requires more memory than a basic List implementation because it manages an array that grows dynamically as elements are added.

When creating an ArrayList, it allocates an initial array to store elements. The default size is 10. As more elements are added, it checks if the array is full and creates a larger array to replace the old one. The size grows by 50% each time (e.g., 10, 15, 22, 33, etc).

All the existing elements must be copied into this new array, which takes time and uses additional memory. Even if no more elements are added, the larger array remains allocated.

A basic list like LinkedList stores the elements in nodes without managing a separate array. There is no unused buffer space. It grows precisely with the number of elements added.

So, ArrayList trades some extra memory overhead for the ability to access elements by index and resize dynamically. The memory overhead is usually not a concern for small to medium-sized lists. But a LinkedList will be more efficient for adding/removing heavy use cases for very large lists.

Use Case Differences

Use Case Differences

The On-Demand App Development Agency uses ArrayLists and Lists extensively in Java programming. However, they each have advantages that make them preferable in certain situations. Deciding when to use an ArrayList vs a List depends on your needs and web app development techniques.

Some cases where ArrayList is preferable over List:

  • You need to access elements frequently by index. ArrayLists have faster O(1) access than O(n) for Lists.
  • You will be iterating over all elements frequently. ArrayLists have better cache locality, which improves performance.
  • You need to dynamically add/remove elements. ArrayLists easily grow and shrink as needed.
  • You don’t need synchronization for multithreaded access. ArrayLists are not thread-safe.

Some examples where List may be a better choice:

  • You rarely need indexed access to elements. Lists allow O(1) access to head and tail elements.
  • You have fixed-sized data. Lists avoid resize costs as elements are added.
  • You need synchronization for multithreaded access. Lists can be wrapped with a synchronized list.
  • You frequently add/remove at the head or tail of the List. Linked lists allow O(1) adds at ends.
  • You want guaranteed ordering. Linked lists maintain insertion order.
  • You want efficient data shifts. Linked lists minimize element copy operations.

So, in short, prefer ArrayList when you need dynamic arrays with fast random access. Use List for fixed-size data and when you need synchronized, ordered data without indexed access.

Thread Safety

Thread Safety

One key difference between Lists and ArrayLists in Java is that ArrayLists are not thread-safe, while some Lists like CopyOnWriteArrayList are thread-safe.

A thread-safe collection allows concurrent access from multiple threads without any external synchronization needed. ArrayLists do not provide any internal synchronization, so if multiple threads access and modify an ArrayList, you’ll need to add your synchronization via something like the Collections.synchronizedList method.

ArrayLists are not thread-safe because a resizable array backs them, and manipulation of this underlying array is not atomic. So, one thread could be resizing the array while another is writing to it, leading to unpredictable behavior.

On the other hand, CopyOnWriteArrayList provides a thread-safe variant of ArrayList by using copy-on-write techniques. Every mutation, like add/set, creates a new copy of the underlying array. This avoids having multiple threads contend for access to the same array. Reads can continue from the old version while writes grab the latest snapshot, providing thread-safety.

So, if you need concurrent access to an ArrayList from multiple threads, you’ll have to synchronize it externally. But some Lists like CopyOnWriteArrayList provide internal thread-safety via copy-on-write. So, choose the right implementation for your use case based on thread safety requirements.

Fixed vs Variable Size

Fixed vs Variable Size

Another one of the key differences between ArrayLists and Lists is that ArrayLists in Java have a variable size, while Lists can be fixed size.

ArrayLists are built on top of a dynamically resizing array, so the size of the ArrayList grows and shrinks automatically as elements are added and removed. You don’t need to specify the size of the ArrayList ahead of time – it handles resizing itself as needed.

In contrast, Lists like LinkedList have a fixed size. When you create a LinkedList, it has a size of 0. As you add elements, the size grows. But the size won’t shrink if you remove elements later. The List keeps occupying the same amount of memory.

To resize a fixed-sized List like LinkedList, you need to explicitly create a new List of the desired size and copy the elements over. This can be inconvenient compared to ArrayLists, which can shrink and grow automatically behind the scenes.

The variable size of ArrayLists makes them very convenient for use cases where the number of elements is unknown or likely to change frequently. The size adapts seamlessly. Lists are better suited when you know the capacity upfront and want to prevent resizing overhead.

Conclusion

Both Lists and ArrayLists in Java are useful data structures.

So when should you use each one?

If you need constant-time access to elements by index, use an ArrayList. If you’ll be frequently adding and removing elements from the beginning, middle, or end of the

The key is understanding how they work under the hood and selecting the right app development tools based on your specific use case. Both Lists and ArrayLists have their place in Java programming.

Related Blogs

Our Story

in Numbers

250+

Satisfied

Customers

1m+

Work hours

5 yrs

Work hours

98%

customer

retention rate

Hard to trust? Trustpilot

Disclaimer:

All company logos and trademarks appearing on our website are the property of their respective owners. We are not affiliated, associated, endorsed by, or in any way officially connected with these companies or their trademarks. The use of these logos and trademarks does not imply any endorsement, affiliation, or relationship between us and the respective companies. We solely use these logos and trademarks for identification purposes only. All information and content provided on our website is for informational purposes only and should not be construed as professional advice. We do not guarantee the accuracy or completeness of any information provided on our website. We are not responsible for any errors or omissions, or for the results obtained from the use of this information. Any reliance you place on such information is strictly at your own risk.