You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: tutorial/05_Collections_Lists.adoc
+31-2Lines changed: 31 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -25,7 +25,7 @@
25
25
* про интерфейс Б можно сказать, что он *расширяет* интерфейс А (и опять-таки это синоним слова "наследник")
26
26
* интерфейс Б никогда не может являться наследником класса А (запрещено правилами Java).
27
27
28
-
== Иерерхия коллекций
28
+
== Иерархия коллекций
29
29
30
30
Коллекции Java образуют иерархию наследования. С ней можно ознакомиться, например, здесь: https://en.wikipedia.org/wiki/Java_collections_framework. Подобное изображение иерархий распространено среди программистов; в них наследник всегда рисуется ниже своего базового класса (интерфейса) и соединяется с ним стрелкой, ведущей в сторону базового класса (интерфейса).
31
31
@@ -89,6 +89,11 @@ public interface Iterator<E> {
89
89
90
90
[source,java]
91
91
----
92
+
public class SomeClass {
93
+
private static boolean condition(String s) {
94
+
return ...// Some condition
95
+
}
96
+
92
97
public static void foo(Collection<String> container) {
93
98
Iterator<String> it = container.iterator();
94
99
while (it.hasNext()) {
@@ -102,8 +107,32 @@ public interface Iterator<E> {
102
107
}
103
108
}
104
109
// However, it's possible...
105
-
container.removeIf(::condition);
110
+
container.removeIf(SomeClass::condition);
106
111
}
112
+
}
107
113
----
108
114
115
+
Что такое `ConcurrentModificationException`? Это исключение, связанное с так называемым контрактом итератора. Согласно этому контракту, во время работы итератора (от момента, когда он был создан, и до момента, когда на нём был вызван последний метод), запрещается менять коллекцию любым способом, за исключением вызова `remove` на итераторе.
116
+
117
+
Про метод `removeIf` см. раздел "Потоки и функции высшего порядка".
118
+
119
+
=== Интерфейс Collection и его реализация
120
+
121
+
По смыслу интерфейс `Collection` описывает объект, содержащий некоторое количество однотипных объектов. По контракту коллекции, туда можно добавлять элементы и удалять их, а также перебирать их с помощью итератора. Коллекция "как есть" (т.е. без расширений) не нумерует свои элементы, и не запрещает добавлять в коллекцию равные элементы.
122
+
123
+
Содержимое интерфейса описано здесь: https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html. Повторять это описание вряд ли имеет смысл; здесь мы лишь подчеркнём, что отдельного внимания заслуживают методы `stream()`, `parallelStream()`, `spliterator()` и `removeIf(predicate)`. Все они относятся к поддержке в Java функций высшего порядка, появившейся в версии 1.8 языка. Про неё см. раздел "Потоки и функции высшего порядка".
124
+
125
+
Коллекция "как есть" не имеет полных реализаций. Существует, однако, абстрактный класс `AbstractCollection`, обеспечивающий так называемый "скелет" реализации. Расширив этот абстрактный класс с помощью `extends`, мы можем создать собственную реализацию коллекции, добавив туда нужные для хранения данных поля и всего три метода:
126
+
127
+
* `iterator()` и `size()`, если мы хотим создать неизменяемую коллекцию. Итератор при этом должен поддерживать `next()` и `hasNext()`.
128
+
* `add()`, если мы хотим создать изменяемую коллекцию. Следует добавить также реализацию `remove()` в итераторе.
129
+
130
+
Некоторые методы -- в первую очередь `clear()` -- абстрактный класс `AbstractCollection` реализует заведомо неэффективно.
0 commit comments