Часто вам нужно добавлять новые элементы в коллекцию.
Поскольку вы хороший и осторожный разработчик, вы хотите, чтобы все было как можно более неизменным. Поэтому добавление нового элемента в неизменяемые коллекции будет означать, что вам необходимо создать новую неизменяемую коллекцию, которая содержит все элементы исходных коллекций плюс новый элемент.
Вы можете создавать неизменяемые коллекции, используя библиотеку guava, а также используя новейшую библиотеку pCollection .
В следующем примере мы создадим 2 неизменяемых списка, один неизменяемый из guava и один постоянный из pCollection.
Они оба будут содержать 10.000 целых чисел изначально.
Мы создадим 20 000 неизменяемых списков, по одному для каждого типа, и измерим время.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
package com.marco.pcollections;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.pcollections.PCollection;import org.pcollections.TreePVector;import com.google.common.collect.ImmutableList;public class PcollectionVSImmutable { public static void main(String[] args) { Map<Integer, ImmutableList<Object>> allImmutable = new HashMap<Integer, ImmutableList<Object>>(); Map<Integer, PCollection<Integer>> allPersistent = new HashMap<Integer, PCollection<Integer>>(); List<Integer> bigList = new ArrayList<Integer>(); for (int i = 0; i < 10000; i++) { bigList.add(new Integer(i)); } ImmutableList<Integer> immutable = ImmutableList.copyOf(bigList); PCollection<Integer> persistent = TreePVector.from(bigList); long start = System.currentTimeMillis(); for (int i = 10000; i < 30000; i++) { allPersistent.put(new Integer(i), persistent.plus(new Integer(i))); } System.out.println("creating 20.000 pCollections takes : " + (System.currentTimeMillis() - start) + "ms"); start = System.currentTimeMillis(); for (int i = 10000; i < 30000; i++) { allImmutable.put(new Integer(i), ImmutableList.builder().addAll(immutable).add(new Integer(i)).build()); } System.out.println("creating 20.000 Guava ImmutableList takes : " + (System.currentTimeMillis() - start) + "ms"); System.out.println("All immutable size : " + allImmutable.size() + " allPersistent size : " + allPersistent.size()); }} |
Выход :
|
1
2
3
|
creating 20.000 pCollections takes : 29mscreating 20.000 Guava ImmutableList takes : 18347msAll immutable size : 20000 allPersistent size : 20000 |
| Ссылка: | Простой бенчмаркинг: неизменные коллекции и постоянные коллекции от нашего партнера по JCG Марко Кастильего из блога « Удалить дубликаты и исправление дурных имен» . |