Javatpoint Logo
Javatpoint Logo

Differences Between Vectors and Arrays in Java

In the world of Java programming, data structures play a crucial role in storing and manipulating data efficiently. Two commonly used data structures for this purpose are vectors and arrays. While both are used to store collections of elements, they have distinct differences that make them suitable for different scenarios. In this section, we will explore the dissimilarities between vectors and arrays in Java.

Java Array

An array in Java is a fixed-size, homogeneous data structure that stores elements of the same type. Arrays have a static length, meaning the size is determined at the time of declaration and cannot be changed during runtime.

They offer direct access to elements using an index, which makes array operations fast and efficient.

File Name: ArrayExample.java

Output:

Element at index 0: 1
Element at index 1: 2
Element at index 2: 3

Java Vector

A vector is a dynamic and resizable array-like data structure that belongs to the Java Collections Framework. Vectors can grow or shrink in size dynamically, allowing for flexibility in managing the number of elements they contain.

Vectors are part of the java.util package and implement the List interface, providing various methods for manipulation. Let's go through some simple examples for both arrays and vectors in Java to illustrate their differences.

File Name: VectorExample.java

Output:

Element at index 0: 1
Element at index 1: 2
Element at index 2: 3

Comparison of Programs

In the array example, we declare and initialize an array with a fixed size. We then assign values to its elements and access them using indices.

In the vector example, we have used the Vector class from the java.util package. Vectors are dynamic and can grow or shrink as needed. We add elements using the add() method and access them using the get() method.

Both examples output the elements present in the array or vector, demonstrating the basic operations associated with each data structure.

Size Flexibility

Array

Once an array is created, its size remains constant, and we cannot change it dynamically. To resize an array, we need to create a new array and copy the elements from the old array to the new one.

Arrays in Java (Fixed Size):

File Name: ArrayExample.java

Output:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at ArrayResizeErrorExample.main(ArrayResizeErrorExample.java:12)

In the above example, attempting to resize the array by creating a new array with a different size will result in a compilation error.

The following program overcome the compilation error.

File Name: ArrayExample.java

Output:

Element at index 0: 1
Element at index 1: 2
Element at index 2: 3
Element at index 3: 4
Element at index 4: 5

Vector

Vectors are dynamic and can be resized during runtime using methods like add() and remove(). The Vector class automatically handles the resizing of the underlying array, providing a convenient way to manage the size of the collection.

Let's create examples to demonstrate the size flexibility of arrays and vectors in Java.

Vectors in Java (Resizable):

File Name: VectorExample.java

Output:

Element at index 0: 1
Element at index 1: 2
Element at index 2: 3
Element at index 3: 4
Element at index 4: 5

In this example, the Vector is dynamically resized by adding two more elements to it after the initial elements have been added. Vectors can grow or shrink in size during runtime, providing flexibility in managing the number of elements they contain.

Synchronization

Array

Arrays in Java are not synchronized, meaning they are not thread-safe. If multiple threads are accessing or modifying an array concurrently, we may encounter data inconsistencies.

Arrays in Java (Not Synchronized):

File Name: ArrayThreadExample.java

Output:

Element at index 0: 0
Element at index 1: 0
Element at index 2: 0

In this example, two threads concurrently modify the array without any synchronization. As a result, data inconsistencies may occur, and the final values of the array elements can vary.

Vector

Vectors are synchronized by default, ensuring that multiple threads can safely access and modify them. While synchronization introduces overhead, it can be beneficial in situations where thread safety is a concern.

Let's create examples to demonstrate the synchronization differences between arrays and vectors in a multithreaded scenario.

Vectors in Java (Synchronized):

File Name: VectorThreadExample.java

Output:

Element at index 0: 2
Element at index 1: 1

In this example, the Vector class automatically handles synchronization. As a result, even when multiple threads are modifying the vector concurrently, the data remains consistent, ensuring thread safety.

Performance

Array

Arrays generally offer better performance for simple operations due to their fixed size and direct element access. For scenarios where the size is known and remains constant, arrays are a more efficient choice.

Arrays in Java (Better Performance):

File Name: ArrayPerformanceExample.java

Output:

Element at index 0: 0
Element at index 1: 1
Element at index 2: 2
Element at index 3: 3
Element at index 4: 4
Element at index 5: 5
Element at index 6: 6
Element at index 7: 7
Element at index 8: 8
Element at index 9: 9
Time taken for array assignment: 70000 nanoseconds

In this example, we time the array element assignment operation, and it's relatively fast due to the direct element access and the fixed size of the array.

Vector

Vectors, being dynamic and synchronized, may incur additional overhead, making them slightly slower than arrays for certain operations. However, the convenience of dynamic resizing and thread safety can outweigh the performance trade-offs in specific use cases.

Let's create examples to demonstrate the performance differences between arrays and vectors in terms of simple operations.

Vectors in Java (Potential Overhead):

File Name: VectorPerformanceExample.java

Output:

Element at index 0: 0
Element at index 1: 1
Element at index 2: 2
Element at index 3: 3
Element at index 4: 4
Element at index 5: 5
Element at index 6: 6
Element at index 7: 7
Element at index 8: 8
Element at index 9: 9
Time taken for vector addition: 1600000 nanoseconds

In this example, we time the vector element addition operation. It generally takes more time due to the potential overhead associated with dynamic resizing and synchronization in the Vector class. The specific performance characteristics may vary based on the use case and environment.

Java Vector Vs. Array

Here's a tabular representation of the differences between vectors and arrays in Java:

Feature Array Vector
Definition It is fixed-size, homogeneous data structure. It is dynamic and resizable array-like data structure.
Size Its size is static (determined at declaration). It is dynamic in size (can be resized during runtime).
Resize Operations It requires creating a new array and copying elements. It is resizable with methods like add() and remove().
Interface It is not a part of the Java Collections Framework. It is a part of the Java Collections Framework (implements List interface).
Synchronization Not synchronized (not thread-safe). Synchronized by default (thread-safe).
Performance It is generally faster due to fixed size and direct access. It may have slightly more overhead due to dynamic resizing and synchronization.
Package No specific package (part of the core language). java.util package (part of the Java Collections Framework).
Usage Recommendation It is suitable for scenarios with a fixed and known size. It is suitable when dynamic resizing and thread safety are required.

Understanding these distinctions can help developers choose the appropriate data structure based on the specific requirements of their Java applications.

Conclusion

In summary, both vectors and arrays have their strengths and weaknesses, and the choice between them depends on the specific requirements of the task at hand. Arrays are suitable for scenarios where a fixed-size, fast-access collection is needed, while vectors provide flexibility and thread safety at the cost of some performance overhead. Understanding these differences is crucial for making informed decisions when designing and implementing Java applications.







Youtube For Videos Join Our Youtube Channel: Join Now

Feedback


Help Others, Please Share

facebook twitter pinterest

Learn Latest Tutorials


Preparation


Trending Technologies


B.Tech / MCA