Вопросы и задания для русскоязычной книги Thinking in Java (Философия Java) Брюса Эккеля. Какие книги стоит читать новичку по Java, кроме Эккеля (Философия Java)? Философия java 4 издание

16.11.2023 Windows 8

Программирование – одна из самых востребованных услуг в сфере IT. Множество людей начало познавать эту нелегкую отрасль и работать в этом направлении. Если читателю всегда было интересно программирование, но он не знал с чего начать, то книга «Философия Java» станет отличным стартовым пособником в этом деле. Автор Брюс Эккель, является настоящим профессионалом в компьютерных технологиях и с помощью понятного изложения, быстро объясняет основные принципы работы с программным кодом.

Язык Java считается одним из самых популярных языков для программирования во всем мире. Это обусловлено высокой гибкостью и возможностью его применения практически в любых сферах, связанных с играми, программным обеспечением и т. д. Книга для начинающих «Философия Java» поможет овладеть главными основами, а также ключевыми понятиями, что позволяет сделать превосходную базу для более глубокого и совершенного изучения науки программирования. Брюс Эккель проделал поистине колоссальный труд, приводя сотни живых примеров и досконально разъясняя все ключевые моменты в ходе своей книги. С помощью данного пособника любой пользователь, который хочет научиться языку Java, сможет заложить отличную базу знаний и, уже опираясь на них, начать углубленное изучение.

Автор рекомендует читать свою книгу всем новичкам и людям, которые только начали заниматься простейшим программированием на языке Java. «Философия Java» - это пособие по быстрому и качественному обучению азам работы с Java. В книге уделяется внимание всем мелочам, а также тонкостям, начиная интерфейсом и основными настройками, и заканчивая сложными комбинациями и приемами, которые показываются на реальном примере с использованием команд и понятных кодов с комментариями автора.

Брюс Эккель поможет обратить особое внимание на основное предназначение и философию использования Java для работы, бизнеса и других сфер. Также автор показывает множество примеров проблем, рассказывает про причины их возникновения и основные методы устранения неполадок в программном коде. Специалисты, работающие в сфере программирования, высоко оценили книгу «Философия Java», ведь она является развивающим учебником, который поможет узнать лучше язык Java. Хоть это и является специализированной литературой, ее гораздо проще читать, чем другие книги аналогичного направления

На нашем литературном сайте сайт вы можете скачать книгу «Философия Java» Брюс Эккель бесплатно в подходящих для разных устройств форматах - epub, fb2, txt, rtf. Вы любите читать книги и всегда следите за выходом новинок? У нас большой выбор книг самых разных жанров: классика, современная фантастика, литература по психологии и детские издания. К тому же мы предлагаем интересные и познавательные статьи для начинающих писателей и всех тех, кто хочет научиться красиво писать. Каждый наш посетитель сможет найти для себя что-то полезное и увлекательное.

В марте прошлого года обратился в филиал крупной международной компании в Самаре (да. наглости и амбиций у меня с детства в избытке). Знал на тот момент html, css, java, javascript (основы), pascal, visualbasic6, запросы mysql, php, общее представление: c++. Джаву я не знал вообще. Предложили работу верстальщика, но я отказался. Только программистом! Тогда дали список:

Брюс Эккель Thinking in Java (русский перевод 2го издания или оригинал 4го - прочел и то и другое)
-Стив Макконел - совершенный код.
-Банда четырех - Дизайн паттернов. (это почти азбука ООП)
-иметь максимально четкое представление разницы j2se и j2ee.

в декабре возникла необходимость работы. устроился в мелкую самарскую web-студию. сразу было ясно, что это мошенники, но нужны были любые работы, которые я смог бы показать будущим работодателям. платить не платили(хоть все уши обещаниями проели), но код к стандартам оформления приводили, а главное научили куда смотреть и что искать при ошибках, какие мелочи легко упустить.

Помимо литературы выше прошел курс intuit (сейчас понимаю, что он смехотворен по своему объему, но в принципе основы там есть)

В конце февраля я повторно выслал резюме и получил приглашение пройти собеседование. Всего собеседований оказалось 6 и длились 1.5 месяца. Два из них прошли по видеосвязи с Москвой. Вся картина напоминала кино "Приходите завтра". Но в конце-концов я получил предложение о работе. Договор был составлен на неполную занятость, т.к. на тот момент диплома у меня не было. В прошлом месяце я диплом получил и договор перезаключили на полный рабочий.

Текущая должность Soft-Engeneer. Оклад более чем устраивает. Вчера в связи с переходом на полный рабочий подняли на 30%.

Даже в той жуликовской конторе спрашивали примеры работ. Я предъявил работы, выполненные мною по фрилансу. Даже работы на других языках всегда значительно лучше отсутствия таковых.

Ps: Диплом синий по ФИЗИКЕ. я полностью самоучка, так что все в ваших руках. только еще английский со школы Free у меня (7 часов в неделю был). хотя американец, который к нам приезжал во время своей кругосветки его плохо знает. я еле половину понял из-за его акцента. но это в моем отделе не так критично. вся документация на английском - выучишь даже если не знал)))))

Отдельное спасибо этому форуму. я учился фактически здесь - ежедневно учил все топики, что попадутся)

Как я понимаю на русском языке "Философия Java" Брюса Эккеля представлена в 6 видах (если не считать совсем старых изданий) :

spoiler

1. Брюс Эккель. Философия Java. Перевод с 3-его "английского" издания. Ориг.название "Thinking in
Java". Издательство Питер. Количество страниц 976. Год выпуска 2003. Книга посвящена java 1.4.
Вроде не совсем полное издание (а может и полное), но с нормальным переводом.

2. Брюс Эккель. Философия Java. Перевод с 4-его "английского" издания. Ориг.название Thinking in Java.
Количество страниц 640. Год выпуск 2009. Издательство Питер. Обрезанное в 2 раза издание с

3. Брюс Эккель. Философия Java. Перевод с 4-его "английского" издания. Ориг.название Thinking in Java.
Количество страниц 640. Год выпуск 2011. Издательство Питер. Обрезанное в 2 раза издание с
ужасным переводом. Книга посвящена java 1.5.

4. Брюс Эккель. Философия Java. Перевод с 4-его "английского" издания. Ориг.название Thinking in Java.
Количество страниц 640. Год выпуск 2013. Издательство Питер. Обрезанное в 2 раза издание с
ужасным переводом. Книга посвящена java 1.5.

5. Брюс Эккель - Философия Java. Перевод с 4-го "английского" издания. Год издания - 2015.
Издательство "Питер". Количество страниц - 1165. Книга посвящена java 1.5. Так называемое полное
издание. Вроде перевод не очень.

6. Брюс Эккель - Философия Java. Перевод с 4-го "английского" издания. Год издания - 2017.
Количество страниц 1168. Перевод хороший. Книга посвящена java 1.5.

7. Двухтомник по Core Java: Java Библиотека профессионала. Кей С. Хорстманн, Гари Корнелл.
Том 1: Основы. Том 2: Расширенные средства программирования. Год выпуска 2014-2015 (девятое
издание, java 1.7). До девятого издания включительно этот двухтомник выходил под авторством Кей С.
Хорстманн и Гари Корнелл, потом его стал издавать только Кей С. Хорстманн.

8. Тот же двухтомник, но под авторством Кей С. Хорстманна. Том 1: Основы. Том 2: Расширенные средства
программирования. Год выпуска 2017 (десятое издание, java 1.8).

Также у Хорстманна есть 2 маленькие книжки (продолжаю нумерацию):

9. Java SE 8. Базовый курс. Ориг.название Core Java for the Impatient. Кей С. Хорстманн, 464 стр., 2016.

10. Java SE 8. Вводный курс. Java SE 8 for the Really Impatient. Кей С. Хорстманн, 208 стр., 2014.

Поправьте, если я не прав или что-то упустил касаемо вышеуказанных книг. Что можете сказать хорошего/плохого об этих книгах? Что читать, а что не стоит? Какие еще книги по Java можно почитать (на русском или английском)? Огласите весь список, пожалуйста.

Глава 11. Коллекции объектов

Вопросы
1. Что такое интерфейс Collection?

Ответ

Интерфейс Collection - корневой интерфейс, описывающий общую функциональность всех последовательных контейнеров (с. 301).


2. Могут ли контейнеры использоваться для хранения примитивов?

Ответ

Примитивы в качестве элементов контейнера выступать не могут. В контейнер можно поместить только ссылки на объекты. Однако механизм автоупаковки (Autoboxing) автоматически преобразует примитив в объектный тип. Следовательно программист может «забыть» про вышеупомянутое ограничение.
(ответ дан совместно с MrD)


3. Какой метод добавления элементов в контейнер ArrayList является предпочтительным:
Arrays.asList или Collections.addAll и почему?

Ответ

Collections.addAll является предпочтительным в силу его большей производительности (с. 282).


4. Перечислите несколько методов, доступных при работе с ArrayList.

Ответ

«contains(Object o)» – проверить наличия элемента в массиве.
«indexOf(Object o)» – получить индекс элемента.
«subList(index1, index2)» - скопировать часть элементов в новый контейнер.
«containsAll(Object o)» - проверка наличия элементов в контейнере.


5. Что возвращает метод remove(), вызванный для контейнера типа Queue?

Ответ

Метод Queue.remove() не только удаляет головной элемент очереди, но и возвращает его строковое значение.


6. Какие операции производятся быстрее при работе с LinkedList по сравнению с ArrayList?

Ответ

Вставка и удаления элементов из середины списка в случае использования LinkedList осуществляется быстрее (с. 291).


7. Какие типы контейнеров можно реализовывать с помощью LinkedList?

Ответ

Стек, очередь, двустороннюю очередь.


8. Чем семейство контейнеров Set отличается семейства контейнеров List? (спасибо MrD за правку)

Ответ

В семействе контейнеров Set данные могут храниться только в одном экземпляре (с. 294)


9. Произойдет ли исключение при попытке добавить в Set элемент, который уже в нем присутствует?

Ответ

Исключения не произойдет.


10. Чем контейнер PriorityQueue отличается от Queue?

Ответ

Элементы в PriorityQueue можно сортировать по определенным правилам.


11. Для чего используется Comparator в применении к PriorityQueue?

Ответ

Comparator позволяет задавать правила сортировки элементов PriorityQueue.


12. Что означают префиксы «Tree» и «Hash», «LinkedHash», например, для типа контейнера Set (TreeSet, HashSet, LinkedHashSet)

Ответ

Префикс «Tree» означает, что элементы контейнера хранятся в отсортированном порядке
(например, в алфавитном порядке или по возрастанию) Префикс «Hash» означает, что контейнер реализует хэширование для ускорения выборки. Префикс «LinkedHash» означает, что контейнере элементы хранятся в порядке вставки, и при этом обеспечивается быстрый доступ (c. 309)


13. Поддерживает ли контейнер типа «Map» интерфейс Iterable?

14. Работает ли синтаксис foreach для контейнера типа «Map»?

Ответ

Для контейнера типа «Map» синтаксис foreach не работает, потому что им не поддерживается интерфейс iterable


15. В чем заключается основное преимущество использования итератора для доступа к элементам контейнера?

Ответ

Итератор может быть использован для контейнеров различного типа (с. 290).


16. Какие новые возможности предоставляются итератором ListIterator по сравнению с обычным итератором?

Ответ

ListIterator предоставляет последовательный доступ к элементам не только из начала в конец контейнера, но и наоборот (с. 290).

Упражнения

11. 1. Создайте класс Fruit. Класс должен содержать поле int weight, конструктор с инициализацией этого поля и метод printWeight(), печатающий значение weight.
В методе main добавьте несколько объектов Fruit в контейнер List. Вызовите printWeight() для каждого из объектов следующими способами:
А) с помощью метода get();
Б) с помощью итератора.

Ответ

// 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 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 it = fruits.iterator(); while(it.hasNext()) { it.next().printWeight(); } } }

11.2. Класс Fruit из 11.1 поместите в контейнер map. Пусть в качестве ключа будет указано имя владельца, в качестве значения – объект типа Fruit. Реализуйте перебор каждого объекта Fruit по ключу и вызов метода printWeight() для найденного объекта: с помощью foreach; с помощью iterator.

Ответ

Спасибо quarantino за компактный вариант решения с итератором.
класс Fruit - см. задание 11.2

Import java.util.*; import java.util.Map.Entry; public class Apply { public static void main(String args) { // Используем HashMap, так как сортировка не нужна Map fruit = new HashMap(); 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> 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 { @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 comparator = new StringComparator(); PriorityQueue queue = new PriorityQueue(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, причем порядок их следования не должен измениться.

1) Мы вдруг поняли, что забыли добавить в список расходы на выплату кредитов. Необходимо разместить запись «taxes» между «food» и «medicine» без использования индексов записей напрямую.
2) Жена притащила дополнительный отдельный список расходов с записями: «coat», «restaurant». Делать нечего: прибавить расходы в конец списка (чтобы не обольщалась).
3) Однако, теща притащила нам еще пару пунктиков: «theater», «home decoration» и «medicine». Может быть, какой-то из этих пунктов у Вас уже был. На всякий случай копируем содержание первого контейнера в новый контейнер типа Set и после, не задумываясь, добавляем эти пунктики в конец списка.
4) Не долго думая, мы создали ассоциативный динамический список расходов map, где Integer – планируемые затраты на каждый из пунктов расходов (суммы выбирайте самостоятельно).
5) Мы резко разбогатели решили увеличить сумму всех затрат на 30%. Напишите метод, который это сделает за вас.
6) Стоп! Довольно с нас «home decoration!» И, пожалуй, на coat уходит слишком много. Занесите эти пункты в новый List и передайте методу, который, считав этот лист, в контейнере Map отыщет соответствующие статьи расходов и уменьшит их на … 80%!
7) Свалим-ка часть расходов на тещу. Причем, сделаем ей сюрприз! Сгенерим два случайных числа, которые будут определять начальный и конечный индексы, все расходы между которыми будут записаны в отдельный список List (который впоследствии будет теще подсунут). Не забудем обновить Map, выкинув из него соответствующие статьи расходов.
8) Напишем метод, который определит, на что уходит самая малая сумма расходов, напечатаем название этих расходов и с гордостью удалим этот элемент из списка.
9) Однако, к нам подвалили дополнительные расходики: «food» и «restaurant», оформленные в виде очередного массива! Проверим, есть ли они в нашем списке эти пункты? И если хотя бы один расход есть, то ни в коем случае не будем их добавлять! Если же ничего этого нет, то (ничего не поделаешь), добавляем сразу оба эти пункта (как я проголодался!).
10) Мы сошли с ума! Прочитаем из списка Map все Integer суммы оставшихся у нас расходов, запишем их в «какой-нибудь» контейнер, который сам их нам рассортирует по возрастанию, потом в ярости перемешаем и удалим с проходом в обратном порядке, неистово применив для этого специальный итератор.