There are times in our developer lives when we just settle with a range of implementations without thinking of the reasons behind it, or without having any valid argument in order to use one implementation over another.
Some time ago I was having a discussion with a friend [which is a big data developer] about the importance of choosing the right collection. He gave an example on how using the wrong implementation a job took over 3 hours, after changing the implementation of the collection used the same job needed 5 minutes to complete.
Below can be seen a table with basic information about different implementations of collections
Implementation | Ordered | Sorted | Syncronized | Nulls | Notes |
---|---|---|---|---|---|
HashMap | ✗ | ✗ | ✗ | One null key andno null values | |
Hashtable* | ✗ | ✗ | ✓ | No null keys and no null values | |
TreeMap | ✗ | ✓ | ✗ | Accepts nulls as keys and value | |
LinkedHashMap | ✓ | ✗ | ✗ | Accepts nulls as keys and value | Faster iterations than HashMap but slower inserts and remove |
HashSet | ✗ | ✗ | ✗ | Accepts null | |
TreeSet | ✗ | ✓ | ✗ | Accepts null | |
LinkedHashSet | ✓ | ✗ | ✗ | Accepts null | |
ArrayList | ✓ | ✗ | ✗ | Accepts null | Fast iterations |
Vector | ✓ | ✗ | ✓ | Accepts null | |
LinkedList | ✓ | ✗ | ✗ | Accepts null | Fast iterations and deletion |
PriorityQueue | ✗ | ✓ | ✗ | Accepts null |
* There is not a typo: Hashtable is the special kid that does not have camel case
PS: This is just a quick review for more about how each works, I suggest visiting the API.