Some JDK APIs are obsolete and have preferred alternatives.
LinkedList
LinkedList
almost never out-performs ArrayList
or ArrayDeque
1. If you
are using LinkedList
as a list, prefer ArrayList
. If you are using
LinkedList
as a stack or queue/deque, prefer ArrayDeque
.
Migration gotcha: LinkedList
permits null
elements; ArrayDeque
rejects
them. The documentation for Deque
strongly discourages users from inserting
null
, even into implementations that permit it. So, if you are using a
LinkedList
for this purpose, you should likely stop, and you will need to
stop in order to migrate to ArrayDeque
.
Vector
Vector
performs synchronization that is usually unnecessary; prefer
ArrayList
.
If a synchronized collection is necessary, use Collections.synchronizedList
or
a data structure from java.util.concurrent
.
Hashtable
and Dictionary
This is a nonstandard class that predates the Java Collections Framework; prefer
LinkedHashMap
or HashMap
.
If synchronization is necessary, java.util.concurrent.ConcurrentHashMap
is
usually a good choice.
java.util.Stack
Stack
is a nonstandard class that predates the Java Collections Framework;
prefer ArrayDeque
.
If a synchronized collection is necessary, use a data structure from
java.util.concurrent
.
When migrating from Stack
to Deque
, note that the Stack
methods
push
/pop
/peek
/add
/iterator
correspond to the Deque
methods
addFirst
/removeFirst
/peekFirst
/addFirst
/descendingIterator
.
StringBuffer
StringBuffer
performs synchronization that is rarely necessary and has
significant performance overhead. Prefer StringBuilder
, which does not do
synchronization.
If synchronization is necessary, consider creating an explicit lock object and
using synchronized
blocks.
Enumeration
An ancient precursor to Iterator
.
SortedSet
and SortedMap
Replaced by NavigableSet
and NavigableMap
in Java 6.
Suppress false positives by adding the suppression annotation @SuppressWarnings("JdkObsolete")
to the enclosing element.
People generally choose LinkedList
because they want fast insertion and
removal. However, LinkedList
has slow traversal, and typically you need
to traverse the list to find the place to insert/remove. It turns out that
the cost of traversing to a location in a LinkedList
is approximately 4x
the cost of copying an element in an ArrayList
. Thus, LinkedList
’s
traversal cost dominates and results in poorer performance. More info:
https://stuartmarks.wordpress.com/2015/12/18/some-java-list-benchmarks/ ↩