- PVSM.RU - https://www.pvsm.ru -
На вопрос «С какой книги начать изучение Java?» очень часто отвечают: Thinking in Java Брюса Эккеля.
Но вот беда — эта книга (4-е издание) не содержит в конце каждой из глав вопросы и практикум…
Именно того, что способствует наиболее эффективному изучению языка!
Обучаясь по этой книги, я делал небольшие заметки по поводу моментов, которые были для меня новыми или интересными. Причем оформлял их в виде коротких вопросов. После прочтения каждой главы пробегался по этому списку и придумывал себе задачки, аналогичные коду, приведенному в главе.
Почему бы не поделиться этими заметками-вопросами с Вами?
Приведен список составленных на данный момент вопросов.
Вопросы типа «Что такое внутренний класс?» отсутствуют. Такие определения, на мой взгляд, четко формируются по мере чтения главы и не требуют скучного и банального вопроса для подкрепления.
А также отсутствуют вопросы, наподобие «что такое stack? каковы особенности его работы?». Они являются базовыми для многих языков и для всего программирования в целом. Поэтому старался их избегать.
В целом, я старался формулировать вопросы о различных интересных тонкостях и нюансах, которые требуют периодического повторения.
2. Могут ли контейнеры использоваться для хранения примитивов?
3. Какой метод добавления элементов в контейнер ArrayList является предпочтительным:
Arrays.asList или Collections.addAll и почему?
4. Перечислите несколько методов, доступных при работе с ArrayList.
5. Что возвращает метод remove(), вызванный для контейнера типа Queue?
6. Какие операции производятся быстрее при работе с LinkedList по сравнению с ArrayList?
7. Какие типы контейнеров можно реализовывать с помощью LinkedList?
8. Чем семейство контейнеров Set отличается семейства контейнеров List? (спасибо MrD [1] за правку)
9. Произойдет ли исключение при попытке добавить в Set элемент, который уже в нем присутствует?
10. Чем контейнер PriorityQueue отличается от Queue?
11. Для чего используется Comparator в применении к PriorityQueue?
12. Что означают префиксы «Tree» и «Hash», «LinkedHash», например, для типа контейнера Set (TreeSet, HashSet, LinkedHashSet)
13. Поддерживает ли контейнер типа «Map» интерфейс Iterable?
14. Работает ли синтаксис foreach для контейнера типа «Map»?
15. В чем заключается основное преимущество использования итератора для доступа к элементам контейнера?
16. Какие новые возможности предоставляются итератором ListIterator по сравнению с обычным итератором?
// Fruit.java
public class Fruit {
private int weight = 0;
public Fruit(int weight) {
this.weight = weight;
}
public void printWeight() {
System.out.println("Weight is: " + weight);
}
}
// Apply.java
import java.util.*;
public class Apply {
public static void main(String[] args) {
List<Fruit> fruits = Arrays.asList(new Fruit(10), new Fruit(20));
// a
System.out.println("Task a: ");
for (Fruit f : fruits) {
f.printWeight();
}
// b
System.out.println("Task b: ");
Iterator<Fruit> it = fruits.iterator();
while(it.hasNext()) {
it.next().printWeight();
}
}
}
11.2. Класс Fruit из 11.1 поместите в контейнер map. Пусть в качестве ключа будет указано имя владельца, в качестве значения – объект типа Fruit. Реализуйте перебор каждого объекта Fruit по ключу и вызов метода printWeight() для найденного объекта: с помощью foreach; с помощью iterator.
import java.util.*;
import java.util.Map.Entry;
public class Apply {
public static void main(String[] args) {
// Используем HashMap, так как сортировка не нужна
Map<String, Fruit> fruit = new HashMap<String, Fruit>();
fruit.put("Bob", new Fruit(10));
fruit.put("Mary", new Fruit(20));
// перебор с помощью foreach
System.out.println("With foreach");
for (String key : fruit.keySet()) {
fruit.get(key).printWeight();
}
// перебор с использованием итератора
System.out.println("With iterator");
Iterator<Entry<String, Fruit>> it = fruit.entrySet().iterator();
while (it.hasNext()) {
it.next().getValue().printWeight();
}
}
}
11.3. Используя Comparator для PriorityQueue обеспечьте сортировку строковых переменных по размеру.
// StringComparator.java
import java.util.Comparator;
public class StringComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
if (s1.length() < s2.length()) {
return -1;
}
if(s1.length() > s2.length()) {
return 1;
}
return 0;
}
}
// PriorityQueue.java
import java.util.Comparator;
import java.util.PriorityQueue;
public class PriorityQueueUse {
public static void main(String[] args) {
Comparator<String> comparator = new StringComparator();
PriorityQueue<String> queue = new PriorityQueue<String>(10, comparator);
queue.add("abcde");
queue.add("abc");
queue.add("abcdefghi");
queue.add("a");
// Элементы в очереди НЕ размещены в порядке возрастания длины String
System.out.println("Before removing:");
System.out.println(queue);
// Но элементы удаляются из очереди В порядке возрастания длины String
System.out.println();
System.out.println("Look at removing order: ");
while (queue.size() != 0)
{
System.out.println(queue.remove());
}
}
}
Перевод упражнений из оригинала книги:
11.4. Создайте новый класс Gerbil с полем int gerbilNumber. Пусть поле инициализируется конструктором. Создайте также метод hop(), который печатает «Gerbil’s number which is hopping is: » и значение переменной gerbilNumber. Разместите объекты Gerbil в контейнер ArrayList. Реализуйте метод get() для прохода по списку с вызовом метода hop() для каждого из этих объектов.
11.5. Модифицируйте SimpleCollection.java так, чтобы использовать метод Set для переменной «с». Модифицируйте innerclasses/Sequence.java таким образом, чтобы туда можно было бы добавлять любое количество элементов.
11.6. Напишите класс Generator, в котором есть список имен героев ваших любимых фильмов (объекты типа String). Пусть каждый объект этого списка возвращается посредством метода next(). При достижении конца созданного списка необходимо вернуться обратно в начало списка.
Используйте класс Generator для заполнения контейнеров типа ArrayList, LinkedList, HashSet, LinkedHashSet, TreeSet. Напишите универсальный метод, который выводил бы содержание каждого из массивов.
11.7. Модифицируйте ListFeatures.java таким образом, чтобы в нем использовались объекты типа Integers вместо объектов типа Pets. Объясните различия в результатах работы, возникшие из-за этой модификации.
11.8. Повторите упражнение 11.7 для ListFeatures.java, но замените Pets на Strings.
11.9. Создайте класс, который генерирует инициализированный массив объектов другого класса. С помощью этого массива заполните контейнер типа List. Создайте еще один контейнер, используя subList() для List. Затем удалите элементы, которые вы извлекли с помощью subList(), из контейнера, из которого вы их извлекали.
11.10. Шутливое упражнение на использование различных контейнеров и их методов (придумано самостоятельно)
Пусть у нас есть список из расходов, изначально состоящий из 3-х элементов: «food», «medicine», «entertainment». Необходимо записать эти элементы в контейнер List, причем порядок их следования не должен измениться.
Вопросы и упражнения будут впоследствии добавляться за один раз целиком для каждой из глав. О каждом таком добавлении будет написано в конце статьи.
Предлагаю Вам тоже принять участие в составлении вопросов и практикума по главам книги!
Прошу желающих принять участие написать мне в «диалог». Сразу сообщу, что вопросы и упражнения по главам, идущим до №10 публиковать не буду (материал уже изучен).
Полезная информация:
В англоязычном оригинале Thinking in Java после параграфов даются упражнения (Спасибо, iflista [4])
В англоязычной книге «Annotated Solution Guide for Thinking in Java» приводятся решения этих упражнений (Спасибо, WraithOW [5]).
Ссылки:
Образовательный материал и задания по Java с сайта Oracle (eng)
docs.oracle.com/javase/tutorial/java/index.html [6]
Автор: HotFire
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/55082
Ссылки в тексте:
[1] MrD: http://habrahabr.ru/users/mrd/
[2] docs.oracle.com/javase/1.5.0/docs/api/java/lang/Iterable.html: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Iterable.html
[3] quarantino: http://habrahabr.ru/users/quarantino/
[4] iflista: http://habrahabr.ru/users/iflista/
[5] WraithOW: http://habrahabr.ru/users/wraithow/
[6] docs.oracle.com/javase/tutorial/java/index.html: http://docs.oracle.com/javase/tutorial/java/index.html
[7] soundie: http://habrahabr.ru/users/soundie/
[8] Источник: http://habrahabr.ru/post/212707/
Нажмите здесь для печати.