Top 10 questions about Java Collections--reference

reference
from:http://www.programcreek.com/2013/09/top-10-questions-for-java-collections/

The following are the most popular questions of Java collections asked and
discussed on Stackoverflow. Before you look at those questions, it‘s a good idea
to see the class
hierarchy diagram
.

1. When to use LinkedList over ArrayList?

ArrayList is
essentially an array. Its elements can be accessed directly by index. But if the
array is full, a new larger array is needed to allocate and moving all elements
to the new array will take O(n) time. Also adding or removing
an element needs to move existing elements in an array. This might be the most
disadvantage to use ArrayList.

LinkedList is
a double linked list. Therefore, to access an element in the middle, it has to
search from the beginning of the list. On the other hand, adding and removing an
element in LinkedList is quicklier, because it only changes the list
locally.

In summary, the worst case of time complexity
comparison is as follows:

                   | Arraylist | LinkedList
------------------------------------------
get(index) | O(1) | O(n)
add(E) | O(n) | O(1)
add(E, index) | O(n) | O(n)
remove(index) | O(n) | O(n)
Iterator.remove() | O(n) | O(1)
Iterator.add(E) | O(n) | O(1)

Despite the running time, memory usage should be considered too especially
for large lists. InLinkedList, every node needs at least two
extra pointers to link the previous and next nodes; while
inArrayList, only an array of elements is needed.

More
comparisons between list
.

2. Efficient equivalent for removing elements while iterating the
Collection

The only correct way to modify a collection while iterating is using Iterator.remove().
For example,




Iterator<Integer> itr = list.iterator();
while(itr.hasNext()) {
// do something
itr.remove();
}

One most frequent incorrect code is




for(Integer i: list) {
list.remove(i);
}

You will get a ConcurrentModificationException by
running the above code. This is because an iterator has been generated
(in for statement) to traverse over the list, but at
the same time the list is changed byIterator.remove().
In Java, "it is not generally permissible for one thread to modify a collection
while another thread is iterating over it."

3. How to convert List to int[]?

The easiest way might be using ArrayUtils in Apache Commons Lang library.




int[] array = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));

In JDK, there is no short-cut. Note that you can not
use List.toArray(), because that will
convert List toInteger[]. The
correct way is following,




int[] array = new int[list.size()];
for(int i=0; i < list.size(); i++) {
array[i] = list.get(i);
}

4. How to convert int[] into List?

The easiest way might still be
using ArrayUtils in Apache Commons Lang library, like
below.




List list = Arrays.asList(ArrayUtils.toObject(array));

In JDK, there is no short-cut either.




int[] array = {1,2,3,4,5};
List<Integer> list = new ArrayList<Integer>();
for(int i: array) {
list.add(i);
}

5. What is the best way to filter a Collection?

Again, you can use third-party package, like Guava or Apache Commons Lang to fullfil
this function. Both provide a filter() method
(in Collections2 of
Guava and in CollectionUtils of
Apache). The filter()method will return elements that match a
given Predicate.

In JDK, things become harder. A good news is that in Java 8, Predicate will
be added. But for now you have to use Iterator to
traverse the whole collection.




Iterator<Integer> itr = list.iterator();
while(itr.hasNext()) {
int i = itr.next();
if (i > 5) { // filter all ints bigger than 5
itr.remove();
}
}

Of course you can mimic the way of what Guava and Apache did, by introducing
a new interfacePredicate. That might also be what most advanced
developers will do.




public interface Predicate<T> {
boolean test(T o);
}
 
public static <T> void filter(Collection<T> collection, Predicate<T> predicate) {
if ((collection != null) && (predicate != null)) {
Iterator<T> itr = collection.iterator();
while(itr.hasNext()) {
T obj = itr.next();
if (!predicate.test(obj)) {
itr.remove();
}
}
}
}

Then we can use the following code to filter a collection:




filter(list, new Predicate<Integer>() {
public boolean test(Integer i) {
return i <= 5;
}
});

6. Easiest way to convert a List to a Set?

There are two ways to do so, depending on how you
want equal defined. The first piece of code puts a list into
HashSet.
Duplication is then identified mostly by hashCode(). In most
cases, it will work. But if you need to specify the way of comparison, it is
better to use the second piece of code where you can define your own
comparator.




Set<Integer> set = new HashSet<Integer>(list);




Set<Integer> set = new TreeSet<Integer>(aComparator);
set.addAll(list);

7. How do I remove repeated elements from ArrayList?

This question is quite related to the above one.
If you don‘t care the
ordering of the elements in the ArrayList,
a clever way is to put the list into a set to remove duplication, and then to
move it back to the list. Here is the code




ArrayList** list = ... // initial a list with duplicate elements
Set<Integer> set = new HashSet<Integer>(list);
list.clear();
list.addAll(set);

If you DO care about the ordering, order can be preserved by putting a list
into a LinkedHashSet which is in the standard JDK.

8. Sorted collection

There are a couple of ways to maintain a sorted collection in Java. All of
them provide a collection in natural ordering or by the specified comparator.
By natural ordering, you also need to implement theComparable interface
in the elements.

  1. Collections.sort() can
    sort a List.
    As specified in the javadoc, this sort is stable, and
    guarantee n log(n) performance.

  2. PriorityQueue provides
    an ordered queue. The difference
    between PriorityQueue andCollections.sort() is
    that, PriorityQueue maintain an order queue at all
    time, but you can only get the head element from the queue. You can not
    randomly access its element
    like PriorityQueue.get(4).

  3. If there is no duplication in the collection, TreeSet is
    another choice. Same as PriorityQueue, it maintains the
    ordered set at all time. You can get
    the lowest and highest elements from
    theTreeSet. But you still cannot randomly access its
    element.

In a short, Collections.sort() provides a
one-time ordered
list. PriorityQueue and TreeSet maintain
ordered collections at all time, in the cost of no indexed access of
elements.

9. Collections.emptyList() vs new instance

The same question applies
to emptyMap() and emptySet().

Both methods return an empty list,
but Collections.emptyList() returns a list
that is immutable. This mean you cannot add new elements to the
"empty" list. At the background, each call
of Collections.emptyList()actually won‘t create a
new instance of an empty list. Instead, it will reuse the existing empty
instance. If you are familiar Singleton in
the design pattern, you should know what I mean. So this will give you better
performance if called frequently.

10 Collections.copy

There are two ways to copy a source list to a destination list. One way is to
use ArrayList constructor




ArrayList<Integer> dstList = new ArrayList<Integer>(srcList);

The other is to
use Collections.copy() (as below). Note the
first line, we allocate a list at least as long as the source list, because in
the javadoc of Collections, it says The
destination list must be at least as long as the source list.




ArrayList<Integer> dstList = new ArrayList<Integer>(srcList.size());
Collections.copy(dstList, srcList);

Both methods are shallow copy. So what is
the difference between these two methods?

  • First, Collections.copy() won‘t
    reallocate the capacity of dstList even
    if dstList does not have enough space to contain
    all srcList elements. Instead, it will throw
    anIndexOutOfBoundsException.
    One may question if there is any benefit of it. One reason is that it
    guarantees the method runs in linear time. Also it makes suitable when you
    would like to reuse arrays rather than allocate new memory in the constructor
    of ArrayList.

  • Collections.copy() can only
    accept List as
    both source and destination,
    while ArrayList acceptsCollection as
    the parameter, therefore more general.

Top 10 questions about Java Collections--reference,布布扣,bubuko.com

时间: 2024-10-12 14:00:01

Top 10 questions about Java Collections--reference的相关文章

Top 10 Questions about Java Exceptions--reference

reference from:http://www.programcreek.com/2013/10/top-10-questions-about-java-exceptions/ This article summarizes the top 10 frequently asked questions about Java exceptions. 1. Checked vs. Unchecked In brief, checked exceptions must be explicitly c

Top 10 tough core Java interview questions answers programming

Tough core Java interview questions and answersWhat is tough core java interview question ? Why do people look for tough Java questions before going for interview? well I don't thing I need to answer these tough questions because its pretty natural t

Top 10 Methods for Java Arrays

作者:X Wang 出处:http://www.programcreek.com/2013/09/top-10-methods-for-java-arrays/ 转载文章,转载请注明作者和出处 The following are top 10 methods for Java Array. They are the most voted questions from stackoverflow. 0. Declare an array String[] aArray = new String[5

【翻译】Java Array的排名前十方法(Top 10 Methods for Java Arrays)

这里列举了Java Array 的前十的方法.他们在stackoverflow最大投票的问题. The following are top 10 methods for Java Array. They are the most voted questions from stackoverflow. 0.声明一个数组 0. Declare an array String[] aArray = new String[5]; String[] bArray = {"a", "b&

Top 10 Mistakes Java Developers Make--reference

This list summarizes the top 10 mistakes that Java developers frequently make. #1. Convert Array to ArrayList To convert an array to an ArrayList, developers often do this: List<String> list = Arrays.asList(arr); Arrays.asList() will return an Array

Top 10 Mistakes Java Developers Make(转)

文章列出了Java开发者最常犯的是个错误. 1.将数组转换为ArrayList 为了将数组转换为ArrayList,开发者经常会这样做: ? 1 List<String> list = Arrays.asList(arr); Arrays.asList()会返回一个ArrayList,但这个ArrayList是Arrays的私有静态类,不是java.util.ArrayList.java.util.Arrays.ArrayList有set(), get(), contains()方法,但没有任

Yet Another 10 Common Mistakes Java Developers Make When Writing SQL (You Won’t BELIEVE the Last One)--reference

(Sorry for that click-bait heading. Couldn't resist ;-) ) We're on a mission. To teach you SQL. But mostly, we want to teach you how to appreciate SQL. You'll love it! Getting SQL right or wrong shouldn't be about that You're-Doing-It-Wrong? attitude

Top 10 JavaScript traps for a C# developer

Top 10 JavaScript traps for a C# developer 27 May 2014   | .NET · Code · Javascript Tags: .net · C# · javascript If you are an experienced C# developer, coming into JavaScript world for application development, you will end up making few common mista

Java Interview Reference Guide--reference

Part 1 http://techmytalk.com/2014/01/24/java-interview-reference-guide-part-1/ Posted on January 24, 2014 by Nitin Kumar JAVA Object Oriented Concepts Java in based on Object Oriented concepts, which permits higher level of abstraction to solve any p