What is the maximum size of HashSet
, Vector
, LinkedList
? I know that ArrayList
can store more than 3277000 numbers.
However the size of list depends on the memory (heap) size. If it reaches maximum the JDK throws an OutOfMemoryError
.
But I don't know the limit for the number of elements in HashSet
, Vector
and LinkedList
.
The HashSet capacity is doubled when the load factor (0.75) is reached. As the documentation explains: The load factor is a measure of how full the hash table is allowed to get before its capacity is automatically increased.
Constructs a new, empty set; the backing HashMap instance has default initial capacity (16) and load factor (0.75).
LinkedList is the implementation of list and deque interface. LinkedHashSet on other hand is the implementation of set interface and it inherits Hashset class. LinkedList internally implements or we can say uses doubly linked list to store the elements.
By default, an creates a list of initial capacity 10, while LinkedList only constructs an empty list without any initial capacity.
There is no specified maximum size of these structures.
The actual practical size limit is probably somewhere in the region of Integer.MAX_VALUE
(i.e. 2147483647, roughly 2 billion elements), as that's the maximum size of an array in Java.
HashSet
uses a HashMap
internally, so it has the same maximum size as that HashMap
uses an array which always has a size that is a power of two, so it can be at most 230 = 1073741824 elements big (since the next power of two is bigger than Integer.MAX_VALUE
).HashMap
stops resizing, then it will still allow you to add elements, exploiting the fact that each bucket is managed via a linked list. Therefore the only limit for elements in a HashMap
/HashSet
is memory.Vector
uses an array internally which has a maximum size of exactly Integer.MAX_VALUE
, so it can't support more than that many elementsLinkedList
doesn't use an array as the underlying storage, so that doesn't limit the size. It uses a classical doubly linked list structure with no inherent limit, so its size is only bounded by the available memory. Note that a LinkedList
will report the size wrongly if it is bigger than Integer.MAX_VALUE
, because it uses a int
field to store the size and the return type of size()
is int
as well.Note that while the Collection
API does define how a Collection
with more than Integer.MAX_VALUE
elements should behave. Most importantly it states this the size()
documentation:
If this collection contains more than
Integer.MAX_VALUE
elements, returnsInteger.MAX_VALUE
.
Note that while HashMap
, HashSet
and LinkedList
seem to support more than Integer.MAX_VALUE
elements, none of those implement the size()
method in this way (i.e. they simply let the internal size
field overflow).
This leads me to believe that other operations also aren't well-defined in this condition.
So I'd say it's safe to use those general-purpose collections with up to Integer.MAX_VLAUE
elements. If you know that you'll need to store more than that, then you should switch to dedicated collection implementations that actually support this.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With