• 0.00

  • -0.74

  • ,

Уровень 33. Ответы на вопросы к собеседованию по теме уровня.

Вопросы/дополнения/критика приветствуются.

1 Что такое JSON?
JSON (JavaScript Object Notation) — простой формат обмена данными, основанный на подмножестве языка программирования JavaScript.

2 В чем отличия Java и JavaScript?
Это 2 разных языка программирования, несмотря на схожесть их названий. Оба они имеют С-подобный синтаксис. Отличия следующие:
  • Java реализует ООП подход, основанный на классах, JavaScript — на прототипах;
  • Java имеет статическую типизацию, JavaScript — динамическую типизацию;
  • Java загружается из скомпилированного байт-кода; JavaScript интерпретируется напрямую из файла.

Your text to link...
  • ,

Заливка проекта на GitHub.

   Здравствуйте, уважаемые. И сразу к делу: я и мой знакомый хотим понемногу «въезжать» в процессы разработки. На данном этапе я хочу разобраться как адекватно залить проект на гитхаб, чтобы мы вдвоем могли с ним работать. Посему вопрос: как это сделать? В сети пока не нашел какого-то годного мануала. Подозреваю что плохо искал, но думаю такая тема будет так или иначе полезна всем начинающим разработчикам. Спасибо за ответы.

UPD.: Как я понял, это надо для начала разобраться как работать с Git?

Подбор сайтов для оттачивания навыков в программировании

  1. Codewars
  2. Codewars — отличный сервис для закрепления навыков программирования на Ruby, JavaScript, Java, Python, Clojure, CoffeeScript, C#, Haskell. Представлены как алгоритмические задачи, так и практические задачи, связанные с шаблонами проектирования. После каждой решенной задачи вы можете посмотреть на другие решения, рассортированные по рейтингу в зависимости от их красоты и использования лучших практик в программировании.
  3. Leetcode
  4. Leetcode — сайт с алгоритмическими задачками для подготовки к техническим собеседованиям в такие крупные фирмы, как Google и Facebook. Возле каждой задачи есть обсуждение, в котором так или иначе может фигурировать решение к этой задаче. Можно использовать различные языки программирования: C, C++, Java, Python, C#, JavaScript, Ruby, Bash.
  5. Programming Praxis
  6. Programming Praxis — блог, включающий целый ряд интересных задач, решения которых можно проверить на нескольких языках программирования.
  7. TopCoder
  8. TopCoder — активное сообщество программистов, которые любят решать головоломки. Много активных соревнований, некоторые из них включают денежные призы.
  9. C Puzzles
  10. C Puzzles предоставляет вам головоломки по программированию, характерные для языка Си (со всеми его причудами). Поскольку многие языки являются Си-подобными или напрямую выведенными из него, даже если вы не знаете язык Си как свой родной, велика вероятность, что вы поймете эти головоломки.
  11. Project Euler
  12. Цитата с главной страницы: «Project Euler — ряд бросающих вызов математических/программистских задач, которые предполагают наличие математической интуиции для их решения». Ресурс включает в себя как относительно простенькие, так и по-настоящему сложные задачки.
  13. Codeforces
  14. Полноценный русскоязычный аналог уже упомянутого Topcoder.
  15. Сборник задач от CppStudio
  16. Задачки в основном на проверку знаний С++, однако реализуемы и на других языках программирования.
  17. Timus Online Judge
  18. Timus Online Judge — это крупнейший в России архив задач по программированию с автоматической проверяющей системой. Основной источник задач для архива — соревнования Уральского федерального университета, Чемпионаты Урала, Уральские четвертьфиналы ACM ICPC, Петрозаводские сборы по программированию.
  • ,

Как стать программистом (часть 2)

Первая часть статьи: определяемся с пулом технологий
Третья часть статьи: дополнительные, но важные источники информации: форумы и книги.
Четвертая часть статьи: выбери среду разработки и установи на свою рабочую машину всё необходимое ПО

как стать программистом

Итак, ты определился с технологиями и целью. Что дальше?


Выбери 2-3 основных источника знаний по Java, а также с десяток дополнительных. Но не забывай «гуглить», если что-то не ясно.

В первую очередь тебе нужно изучить Java Core — основа языка, от неё уже можно отталкиваться. Настало время подумать, как именно ты будешь учиться.

Самостоятельно или с наставником?

Наставник
Наставник — это здорово, но вряд ли кто-то будет бесплатно с тобой возиться и учить. А если платно… Время хорошего разработчика стоит немало. Плохой же тебе не нужен — чему он тебя научит? Тем не менее, если у тебя есть человек, готовый тебя консультировать, заручись его поддержкой.

Может на курсы Java пойти? Очень многие в качестве основного источника знаний видят очные курсы. Их сейчас очень много, но найти среди них достойные сложно. Если они и есть в твоем городе, то, скорее всего, или очень дорогие, или совсем бесплатные. Вторые — это курсы при компаниях. Для совсем зеленых новичков таких курсов не бывает: они рассчитаны на тех, кто прочно знает Java Core (а мы его только учить собрались), и чтобы на них попасть нужно пройти тесты. На курсах проходит весьма жесткий отсев, а самых лучших выпускников компании зачисляют в свой штат.

Теперь перемоем косточки дорогим курсам Java.

стоимость платных курсов
Если повезет и тебе попадется отличный преподаватель-практик, они имеют смысл. Однако цена в таком случае будет очень высока. И еще: сможет ли этот наставник уделить достаточно внимания лично твоему коду? Не факт.

В последние годы появилась масса доступных курсов, они обойдутся слушателю примерно в 100 долларов за месяц. Допустим, ты решил на них пойти, какой специалист-преподаватель там тебя ждет? Размышления на эту тему снова загоняют нас на DOU: иди туда и снова оцени зарплаты Java-разработчиков. Скорее всего ты понимаешь, что учить программистов должен не джуниор, а хотя бы «просто» Software Engineer. Средняя зарплата, например, у киевского специалиста этого уровня — 2000 долларов. Допустим, в группу набрали 20 человек. Это само по себе не очень хорошо, слишком большая нагрузка на преподавателя: он просто не сможет физически уделить внимание коду каждого студента.

Чаще всего учебная группа состоит из десятка учащихся. Все вместе они платят 1000 долларов в месяц. Школа, которая ведет курсы, помимо специалиста, должна оплачивать аренду помещений, оборудование, коммунальные счета. И желательно хоть что-то заработать (вряд ли вы найдете много филантропов при платных школах). В самом лучшем случае учителю достанется долларов 500. При этом он тратит 2-3 вечера в неделю на лекции и еще массу времени на проверку задач. По идее, чтобы научиться программировать, человек должен писать программы каждый день, минимум — 5 раз в неделю. Сколько кода сгенерирует за неделю один ученик? А десять? Добросовестный преподаватель должен всё это проверить и проконсультировать студента, что правильно, а что не так. Это — прорва времени.

Это мы ведем к тому, что нанимать хорошего специалиста на недорогие курсы — абсолютно нерентабельно. В самом лучшем случае, Once in a blue moon, как говорят «у них» или «когда рак на горе свистнет», как говорят у нас, ты попадешь на «фаната», которому жутко нравится не только программировать, но и преподавать. Поэтому он нашел себе такую не слишком выгодную подработку. Не денег ради, кайфу ради.

Следующий вариант — онлайн-курсы, платные или бесплатные.

online courses
Большинство платных онлайн-курсов — это те же самые «очные», только лекции проходят через интернет. Недостатки практически идентичные — не лучшие преподаватели, крайне мало времени уделяется практическим занятиям студента и проверке его кода. А вот бесплатные курсы можешь использовать в качестве дополнительных источников. Их можно найти, например, на Youtube — они представляют собой видеоуроки. Если знаешь английский, попробуй найти пару-тройку курсов на западных ресурсах, например, Coursera.

Неплохие видеоуроки Java на Youtube:
www.youtube.com/playlist?list=PLY4rE9dstrJzKUZHdGgECOjJLaZBcUdCC
Новичкам от почти новичка: www.youtube.com/channel/UCK5d3n3kfkzlArMccS0TTXA
Еще курс, немного не структурирован, но многие темы разобраны неплохо: www.youtube.com/channel/UCg1x1VDcSzviGGH995gHnjw
Когда немного освоишься в программировании, какие-то темы можно смотреть здесь: habrahabr.ru/company/golovachcourses/blog/218841/
habrahabr.ru/company/golovachcourses/blog/215275/

В этих статьях приведен план обучения (может пригодиться) и ссылки на записи видеолекций оффлайновых курсов. Несколько нудноваты, но местами полезны, информации — тонна.

Онлайн-курсы Java для начинающих

На английском языке, все рассчитаны на тех, кто ещё не программировал.
courses.caveofprogramming.com/courses/java-for-complete-beginners
www.coursera.org/learn/java-programming
www.edx.org/course/introduction-programming-java-part-1-uc3mx-it-1-1x-0

И тут одна загвоздочка…

Курсов и видеороликов много, из них можно почерпнуть очень много всего полезного. Однако при самостоятельном обучении возникает одно «но», очень принципиальное «но». Дело в том, что в программировании самое важное — программировать, то есть писать программы, а не изучать теорию. При самостоятельном обучении придется подбирать себе задачи самому, чтобы усвоить те или иные принципы. Новичку это непросто. Допустим, ты нашел источник упражнений: некоторые книги и бесплатные курсы содержат условия задач. Отлично, поехали решать!.. И тут кроется самая большая сложность: кто будет проверять правильность решения? Ты, наверное, удивишься, но даже если программа запускается и выдает правильный ответ, это вовсе не значит, что она работает правильно! Это может быть сладкой иллюзией. Что же делать? Новые технологии и всемирная паутина знают ответ на этот вопрос. И этот ответ — javarush.ru

javarush

Интерактивные курсы Java с автоматической проверкой задач



Мы разработали самый классный курс для изучения Java. И многие уже знают как он называется — JavaRush. Мы им гордимся, поскольку он из таких новичков, как ты, которые растеряно задают вопрос «что же делать, куда бежать, столько информации вокруг!» помогает делать программистов, готовых к первой работе. Самые главные «фичи» курса:

  • В нем есть продуманная структура. Поскольку его создавал практик, который отлично ориентируется в реалиях рынка, том, что нужно знать и уметь, в курсе отобрано только самое главное и в нужном порядке! Это очень важно для новичка. Для тебя, наверное, тоже, раз ты читаешь эту статью и пытаешься понять, как тебе действовать.
  • Курс на 80% состоит из практических заданий. За время обучения тебе придется решить более 1200 задач. Какие бывают задачи на JavaRush:

1. Маленькие «учебные» на закрепление пройденного в лекциях.
2. Хитрые задачи «на вырост». По уровню сложности они не отличаются от задач на закрепление, но специально помещены в курсе раньше, чем определенный кусок теории, необходимый для их решения. Это мобилизирует и заставляет человека гуглить и искать недостающий пазл теории. Всё как в настоящей работе.
3. Головоломные. Эти ребята заставляют включать голову на полную. Тебе нужно найти не теорию для решения, но само решение, алгоритм. Короче, хорошенько подумать. Это как задачи на сообразительность или задачи повышенной сложности из учебников.
4. Мини-проекты. Полезные большие задачи, разбитые на подзадачи для понимания, каким образом ведется разработка крупных проектов. Ты сам сделаешь несколько игр и полезных программ, которые можно применять в реальной жизни и дорабатывать.

  • И — самое важное — в курсе есть автоматическая проверка правильности решений! Вы можете решать задачи на странице курса или в IDE (интегрированная среда разработки, если еще не знаешь, что это такое, скоро узнаешь). Причем проверка эта происходит в считанные секунды. Это просто огромное преимущество JavaRush!
  • Курс на русском языке и лекции в нем поданы в виде текстового квеста, в котором ты будешь переходить с уровня на уровень, наращивая скиллы — скучно не будет!
  • В курсе даны ссылки на полезные дополнительные материалы, однако скилл гугления также намеренно прокачивается.
  • Вокруг JavaRush за 4 года существования образовалось огромное сообщество. В нем люди обсуждают задачи, решения, проблемы, делятся информацией.
  • Специальный сайт для решения и обсуждения задач: help.javarush.ru/
  • Основной курс состоит из 40 уровней, 10 из них — полностью бесплатны. Во время первого этапа обучения ты поймешь, подходит ли тебе JavaRush, так что тебе никто не продаст «кота в мешке», ты будешь точно знать, что покупаешь. К тому же цена всего курса очень доступна. Столько же ты заплатишь за два месяца обучения на «дешевых очных курсах». Ссылка на подписки на курс с ценами.
  • После прохождения курса (или большей его части) ты можешь записаться на стажировку — это совместная работа над настоящим серьезным проектом. Они проходят регулярно, и для этого тебе не нужно будет переезжать куда-либо. Успешное прохождение стажировки — красивая и не пустая строчка в твоем резюме со ссылкой на готовый проект.

Подробная статья о JavaRush — javarush.ru/24.html

Первую часть статьи читайте здесь
Третью часть статьи читайте здесь.
Четвертую часть статьи читайте здесь.
  • ,

Как стать программистом (часть 1)

как стать программистом
Итак, ты испытываешь острое желание стать программистом. Куда теперь бежать?

На этот вопрос существует множество ответов в сети. Некогда мы уже писали статью об этом. Тем не менее, судя по вопросам, которые нам задают в социальных сетях, новички часто теряются в обилии информации и не знают, с чего конкретно начинать. В принципе, мы на JavaRush только тем и занимаемся, что помогаем ответить на этот вопрос. Однако для тех, кто совсем растерялся, мы решили составить приблизительный план действий.

Для начала определись с пулом технологий


  1. Выбери 2-3 основных источника знаний, а также с десяток дополнительных. Но не забывай «гуглить», если что-то не ясно.
  2. Выбери среду разработки и установи на свою рабочую машину всё необходимое ПО.
  3. Определись с тем, что еще учить и где черпать информацию.

А теперь обо всем по порядку.

Для начала определись с языком и пулом технологий

Если ты совсем-совсем ничего не знаешь о программировании, у тебя есть два варианта (на самом деле — больше, но мы тут не для того, чтобы тебя запутать).

Путь первый. Попробовать что-то максимально простое на базовом уровне, и уже потом — определиться.

HTML CSS JS
Например, язык разметки сайтов HTML. Базовое знание HTML — полезный навык для любого айтишника. Однако сам по себе этот язык дает новичку очень смутное представление о программировании как таковом. Разметка — это не вполне программирование, и чтобы дойти от создания страничек до настоящих задач, которые решают не верстальщики, а программисты, нужно изучить очень многое. Тем не менее, получить представление об HTML и его наводящем красоту вечном спутнике CSS — очень просто.

Интерактивные курсы можно найти здесь:

www.codecademy.com/learn/web
htmlacademy.ru/program

В обоих курсах есть платный и бесплатный контент. Бесплатного для начала вполне достаточно.
Не слишком сложно будет изучить основы JavaScript. Это уже самый настоящий язык программирования. Мегапопулярный причем, правда, с одним «но» — это самый популярный «второй язык», то есть такой, который большинство программистов используют как вспомогательный. Основным он является для так называемых «Фронтендщиков», тех программистов, которые создают и привносят интерактивность в интернет-странички.

Справедливости ради заметим: простота JavaScript — палка о двух концах. На начальном уровне всё очень просто, но, запрограммировать относительно сложное многострочное приложение на JavaScript — задача не из легких. Так что его нельзя назвать универсальным языком. Тем не менее, вот тебе пара ссылок на хорошие JavaScript-ресурсы. Пригодятся если не сразу, то немного позднее.

learn.javascript.ru/intro
www.codecademy.com/learn/javascript

Хорошим «учебным» языком сегодня считается Python. Он достаточно прост в освоении, отличается читаемым кодом решает широкий круг проблем, позволяя сфокусироваться на задаче, без постоянных треволнений о том, как в этом самом программировании всё устроено. В какой-то момент эта особенность («высокоуровневость») может сыграть с новичком злую шутку, и он будет пытаться искать у доброй «змейки» руки и ноги, которых нет.

python
У Python’а есть и другие недостатки, например, медлительность при исполнении программ. И еще масса всяких подводных камней, которые становятся очевидны позднее, когда программист достаточно «набьет руку» на простейших задачах.

Есть еще очень популярный PHP, но вряд ли стоит с него начинать: язык и правда распространён, но к нему у профессионалов масса претензий. Упомянем и Ruby — язык чем-то похожий на Python, но не самый простой для понимания. PHP, Ruby и Python решают примерно одни и те же задачи.

В принципе, если ты уверен на все 200%, что хочешь писать только сайты и ничего более, пул HTML + CSS + JavaScript + Python/PHP/Ruby тебе подходит. Хотя на самом деле, эти прекрасные технологии даже Web не полностью охватывают. Всякие сложные бизнес-программы, которые прячутся за сайтами очень часто написаны на более универсальных языках. Таких как Java или C#.

Помимо всего остального, рекомендуем обязательно посмотреть популярный Гарвардский курс по основам программирования CS50 (мы его перевели на русский недавно, посмотреть можно здесь). Он идеально подходит для новичков.

А что если тебе, обучившись, захочется не сайты клепать, а писать игры, создавать приложения под мобильные устройства, программировать микропроцессоры, или создавать огромные корпоративные программы? А вдруг робототехникой увлечешься? Наукой? Да мало ли, куда занесет… Вспомни, так ли редко жизнь вносила в твои планы свои коррективы? Вот почему мы считаем более рациональным и правильным второй путь.

Путь второй. Изучить универсальный и востребованный язык программирования, умение работать с которым хорошо оплачивается.

Java
Вышеупомянутый Python в какой-то мере подходит, но есть куда более мощные в своей универсальности языки. Среди них — Java, C#, C++. Первые два во многом похожи и решают похожие задачи. По сути, они решают какие угодно задачи. Web, десктопные и мобильные (с оговорками, о которых позднее) приложения, работа с консолью и графикой. Учебный код на них тоже вполне комфортно писать. Какой выбрать? В принципе, любой из них хорош. Но давай действовать рационально (это очень полезно для программиста!). Вбиваем в Google что-то вроде «самые востребованные языки программирования» и смотрим на результат.

Вот несколько интересных ссылок:

dou.ua/lenta/articles/language-rating-jan-2016/
hh.ua/article/13333
itdistrict.ru/kakoy-yazyik-programmirovaniya-samyiy-vostrebovannyiy-v-2016-godu/
dev.by/lenta/main/top-15-samyh-vostrebovannyh-yazykov-programmirovaniya-v-2015-m
www.3dnews.ru/926356

В первой статье подведен итог традиционного опроса разработчиков (6181 человек, 91,5% респондентов проживает в Украине, 8,5% — за ее пределами), посвященного востребованности языков программировании.
Во второй — опрос HR-менеджеров (это те, кто персонал подбирают), о том, какие специалисты в сфере разработки им больше всего нужны.

Последние три статьи содержат выводы экспертов, речь идет о глобальном рынке труда.

Если тебе лень переходить по ссылкам, вот выжимка из статей:

Судя по источникам, самым востребованным языком является Java. Также в лидерах числятся кое-где JavaScript и PHP. JavaScript по причине его распространённости в вебе и потому, что его очень часто используют в качестве «второго» языка (это тоже отображено в исследовании из первой ссылки). Причина распространения PHP следующая: очень много сайтов было написано именно на этом языке, их нужно как-то поддерживать, поэтому специалисты всё ещё нужны. Однако их количество, согласно тому же исследованию и здравому смыслу (язык имеет массу недостатков, с этим тезисом согласно большинство разработчиков), продолжает сокращаться. Стало меньше и тех, кто пишет на C#, в то время как количество людей, использующих Java, возросло, JavaScript — тоже. Выросло и число программистов на Python, но процент опрошенных по рынку пока невелик: 8%, в то время как доля Java составляет 26.3%.

Далее — опрос рекрутеров. Из него тоже можно сделать однозначный вывод, что самые востребованные разработчики сегодня — те, кто владеет языком программирования Java. Их назвали нужными все опрошенные HR-ы без исключения. Вторыми по востребованности по мнению специалистов по найму являются те, кто программирует на C#.

Ссылки на статьи, в которых описаны мировые тенденции не внесли никакого разнообразия в стройную картину: Java, Java и снова Java.

Или вот еще подробный видеоролик, в котором умудренный программист поясняет, какой язык и для чего нужен. Сам программирует на C#, C, Python. В качестве первого языка рекомендует Java: www.youtube.com/watch?v=T70qJndjYi0

Популярность языка связана в первую очередь с его спецификой: именно на Java реализуется множество бизнес-приложений, он универсален и не зависит от платформы, на которой запускается программа. Язык отлично подходит для создания больших и маленьких программ. Кроме того, на основе Java создан Android. Java существует уже довольно давно, и за время, прошедшее с её рождения, язык оброс множеством полезных библиотек, и при этом активно развивается и обновляется. Так что для работы с Java нужны специалисты и для разработки новых продуктов, и для поддержки/обновления уже существующих.

Ну хорошо, допустим, Java. Как платят специалистам по этому языку?

как платят программистам
Чтобы это выяснить, есть много прекрасных сайтов, например, DOU. Кроме всего прочего на этом сайте собирается статистика о том, сколько зарабатывают специалисты по разработке и другие «айтишники» в Украине. Итак, переходим по ссылке, выбираем там, например, город Киев и должность Junior Developer (или просто Developer), выбираем Java и сравниваем с другими языками. Если ты живешь не в Киеве, не переживай: мы отслеживали разницу стоимости работы в разных городах и в статье «Путь программиста», приводили таблицу с приблизительными данными. Скопируем её сюда, вот она:

сравнение зарплат
Это — докризисная таблица. В настоящий момент ситуация несколько изменилась, киевские зарплаты остались примерно на том же уровне, а вот московские приблизились к киевским.
Если ты изучил ссылку с DOU, то, вероятно, заметил, что Java-программисты — не только самые востребованные, но также и одни из самых высокооплачиваемых специалистов.

А, может, Java — это слишком сложно?

… На самом деле, нет. Есть языки, которые на первом этапе обучения покажутся проще. Однако у Java есть огромный жирный плюс: он массовый, нужный и присутствует на рынке уже много лет. Соответственно материалов для обучения, лекций, книг, форумов как для новичков, так и для матерых программистов — великое множество. Комьюнити очень помогает учебе. Главное во всем этом разнообразии не запутаться и подобрать учебные материалы. Об этом мы напишем в следующем пункте.
Ты решил, что точно хочешь разрабатывать игры и прочитал, что большинство суперхитов написано на C++. Так может сразу его и учить, этого старейшину мира универсальных языков? Можно попробовать, но идея не лучшая: С++ чрезвычайно сложен для новичка. А вот после подготовки на Java ты без проблем сможешь перейти на C++, если захочешь.

Кстати, далеко не все «большие» игры написаны на C++. Знаменитый Minecraft, например, создан на Java.

Краткие выводы


Выводы
  • Самые востребованные разработчики пишут на Java и потребность в них постоянно растет;
  • У Java-разработчиков высокие зарплаты;
  • Java — универсальный язык. На нем можно писать почти что угодно. Игры в том числе;
  • Java относительно прост в изучении;
  • После Java несложно перейти на C#, совсем просто изучить JavaScript, Ruby, Python. После Java программист готов к подробному знакомству со сложным С++;
  • Android основан на Java;
  • Реализация многопоточности в Java доставляет. Если ты новичок, ты, скорее всего, пока не понимаешь, как это классно. Просто запомни эту фразу=);
  • Подавляющее большинство программистов владеет JavaScript в качестве второго языка.

Исходя из всего вышеперечисленного, наш рекомендуемый пул технологий для изучения на начальном уровне:

Основной язык: Java. Учим ту его часть, которую называют Java Core;
Дополнительно: HTML, CSS, JavaScript. Подключай их постепенно, начиная со второго-третьего месяца учёбы для отвлечения и отдыха от Java.

Вторую часть статьи читайте здесь.
Третью часть статьи читайте здесь.
Четвертую часть статьи читайте здесь.
  • ,

Уровень 21. Ответы на вопросы к собеседованию по теме уровня.

1. Перечислите методы класса Object
equals()
hashCode()
toString()
getClass()
notify()
notifyAll()
wait()
wait(long timeOut)
wait(long timeOut, int nanos)

2. Зачем нужны методы equals & hashCode?
используются для сравнения объектов.
Цель метода equals – определить идентичны ли объекты внутри, сравнив внутреннее содержание объектов.
Тк equals работает медленно, сначала сравниваются хэш коды объектов, и, в том случае, если хэш коды равны, идет проверка по equals

3. Что будет, если переопределить equals, но не переопределить hashCode?
изначально hashCode — случайное число.
Коллекции в Java перед тем как сравнить объекты с помощью equals всегда ищут/сравнивают их с помощью метода hashCode(). И если у одинаковых объектов будут разные hashCode, то объекты будут считаться разными — до сравнения с помощью equals просто не дойдет.

4. Зачем нужны методы wait, notify, notifyAll?
Иногда в программе может оказаться такая ситуация, что нить вошла в блок кода synchronized, заблокировала монитор и не может работать дальше, т.к. каких-то данных еще не хватает: например, файл который она должна обработать еще не загрузился или что-нибудь в таком духе. Для решения этой проблемы и был придуман метод wait(). Вызов этого метода приводит к тому, что нить освобождает монитор и «становится на паузу».
Для снятия с паузы используются методы notify, notifyAll. Метод notify «размораживает» одну случайную нить, метод notifyAll – все «замороженные» нити данного монитора.

5. Как правильно клонировать объект?
Два типа клонирования.
Для клонирования объекта по умолчанию нужно:
а) Добавить интерфейс Cloneable своему классу
б) Переопределить метод clone и вызвать в нем базовую реализацию:

class Point implements Cloneable
{
 int x;
 int y;

 public Object clone()
 {
  return super.clone();
 }
}


Или можно написать реализацию метода clone самому:
class Point 
{
 int x;
 int y;

 public Object clone()
 {
  Point point = new Point();
  point.x = this.x;
  point.y = this.y;
  return point;
 }
}


6. Зачем нужен метод finalize() и как он работает?
Если ты помнишь, то finalize() – это специальный метод, который вызывается у объекта перед тем, как сборщик мусора его уничтожит.
Основная цель этого метода – освободить используемые внешние не-Java ресурсы: закрыть файлы, потоки ввода-вывода и т.п.

finalize() работает нестабильно.
Этот метод не оправдывает возложенных на него надежд. Java-машина может отложить уничтожение объекта, как и вызов метода finalize на сколько угодно. Более того, она вообще не гарантирует, что этот метод будет вызван. В куче ситуаций ради «оптимизации» он не вызывается.

7. В чем отличие final, finally, finalize?
  • final — модификатор
  • Поля не могут быть изменены, методы переопределены
  • Классы нельзя наследовать
  • Этот модификатор применяется только к классам, методам и переменным (также и к локальным переменным)
  • Аргументы методов, обозначенные как final, предназначены только для чтения, при попытке изменения будет ошибка компиляции
  • Переменные final не инициализируются по умолчанию, им необходимо явно присвоить значение при объявлении или в конструкторе, иначе – ошибка компиляции
  • Если final переменная содержит ссылку на объект, объект может быть изменен, но переменная всегда будет ссылаться на тот же самый объект
  • Также это справедливо и для массивов, потому что массивы являются объектами, – массив может быть изменен, а переменная всегда будет ссылаться на тот же самый массив
  • Если класс объявлен final и abstract (взаимоисключающие понятия), произойдет ошибка компиляции
  • Так как final класс не может наследоваться, его методы никогда не могут быть переопределены

finally — блок в связке try-catch-finally, код в котором выполнится независимо от того вылетело ли исключение в блоке try или нет. Используется для освобождения ресурсов…

finalize- метод в классе Object см 6.

8. Что такое try-with-resources?
Это специальная конструкция try, называемая try-with-resources, в которой Обрати внимание – после try следуют круглые скобки, где объявляются переменные и создаются объекты. Эти объекты можно использовать внутри блока try, обозначенного скобками {}. Когда выполнение команд блока try закончится, независимо от того – нормально оно закончилось или было исключение, для объекта, созданного внутри круглых скобок (), будет вызван метод close();

9. Чем отличаются методы wait(1000) и sleep(1000)?
sleep() приостанавливает поток на указанное. состояние меняется на TIMED_WAITING, по истечению — RUNNABLE

wait() меняет состояние потока на WAITING
может быть вызвано только у объекта владеющего блокировкой, в противном случае выкинется исключение IllegalMonitorStateException. при срабатывании метода блокировка отпускается, что позволяет продолжить работу другим потокам ожидающим захватить ту же самую блокировку. в случае wait(int) с аргументом состояние будет TIMED_WAITING

10. В чем отличие i++ и ++i ?
++i, i сначала увеличивается на 1, затем участвует в выражении.
i++, i сначала участвует в выражении, затем увеличивается на 1.

Программирование – тяжёлая работа или лёгкий способ срубить денег?

Хорошая мотивирующая (или наоборот?) статья.
Выложил, что бы побольше людей ее прочитало. Автор не против. :)


! Статья про enterprise :) Не android.

Как стать Java разработчиком?

1. Нужно ли это Мне?

Видимо, самый важный пункт. В связи с экономическим кризисом, многие люди пытаются найти способ обеспечить себя финансово. А тут появляется “IT”, в котором все получают много денег за то, что могут написать 10 строк кода. К тому же, “программирование – это легко”.

К сожалению, это не так. Как бы не пытались основатели различных курсов объяснить, что любой может стать разработчиком за 3 месяца, это не так.

В первую очередь, необходимо помнить, что разработчик программного обеспечения – это инженер. Поэтому и требования соответствующие.

Во-вторых нужно понимать, что именно представляет из себя работа программиста? Прежде всего – это перманентное решение проблем. У Вас не будет момента, когда все проблемы будут решены. Это процесс постоянный. Во-вторых – это огромное количество рутинной работы, выполнять которую по 3-4 часа в день без любви к делу, если не невожможно, то уж точно требует огромного усилия над собой.

Итак, если Вы чувствуете, что разработка программного обеспечения – это то, чем бы вы хотели заниматься более 40% времени своей жизни, то идём дальше.

2. Что именно необходимо для того, чтобы называться Java-разработчиком?

Для того, чтобы Вы с гордостью могли назвать Себя Java Developer с больше буквы “J” необходимо иметь, хотя бы, общее понимание следующих вещей:

Синтаксис языка, а именно – Java Core;
Основы Объекто-ориентированного программирования;
Основы баз данных (SQL);
JDBC;
Servlets + JSP;
ORM (например, Hibernate);
Любой популярный Web – Framework (например, Spring);
HTML, CSS, JavaScript;
VCS (GIT, SVM или подобное).
Теперь, пройдёмся по пунктам:


Java Core

Сюда входит знание и понимание иерархии классов в Java, методы класса Object и, конечно Collection Framework. Какие интерфейсы, кто и кого имплементирует и т.д.

Вот эту картинку, java-разработчик должен нарисовать в 3 утра под арт-обстрелом:



В изучении Java Core помогут такие книги, как:

Java 8. Полное руководство (Шилтд)
Философия Java (Эккель)
И конечно же, никуда не деться от

Java Platform API Specification

Здесь материала крайне много, поэтому лучше не прыгать между книгами, а взяться за одну и “долбить” её “до посинения”.

ООП

От новичка не требуется больше, чем знание и понимание трёх принципов ООП (некоторые считают, что их 4, но тут уж как попадёте и это не так существенно).

Умение на практическом примере объяснить каждый из них.

Основы баз данных и SQL

MySQL 5.0 (Виктор Гольцман)

Эта книга легко и доступно объясняет базовые понятия с илюстрацей примеров и пошаговыми инструкциями.

JDBC

Кроме понимания того, что такое база данных, необходимо понимать, как Ваше Java приложение с ней взаимодейтсвует.

JDBC 4.1 Specification наиболее полно раскрывает все особенности работы JDBC.

Servlets + JSP

В книгах по Шилтда и Эккель Servlet-ы описываются “вскольз”, для более глубокого понимания, что же это такое необходимо изучить что-то по-серьёзнее.

Java Servlet Specification
и
JavaServer Pages Specification
Эти две спецификации дают исчерпывающее понимание тих технологий.

Как JDBC, так и Servlets используются разработчиками в повседневной работе только в редких случаях. Но они лежат в основе всех популярных Framework-ов и понимание того, как эти framework-и утроены “внутри” поможет Вам избежать очень многих глупых ошибок, которые допускают те, кто изучал только framework-и.

Hibernate

Книга, которая является гордостью мира Java – это Java Persistence with Hibernate.

Многие разработчики, которые используют другие технологии (в частности C#), читают эту книгу для того, чтобы глубже понять что такое ORM и какие проблемы оно решает.

Если Вы умеете созлать отношения one-to-one, one-to-many и many-to-one и написать простой запрос на HQL – ваших знаний хватит для уровня новичка.

Web – Framework (например, Spring)

После того, как освоено всё, что есть выше можно уже замахнуться на Spring. Для начала написать простое CRUD приложение, а потом узнать, что такое Spring Pet Clinic. Теперь Ваших знаний будет достаточно для того, чтобы с пониманием происходящего создавать более-менее пристойное приложение, которое ходит в базу данных, что-то там делает и т.д. и т.п.

Поздравляю, теперь Вы можете написать то, что можно уже и “потрогать” и показать.

Через 5-6 месяцев, Вы захотите удалить этот код и сделать так, чтобы никто не знал, что именно Вы его автор, но пока это хорошо :)

HTML, CSS, JavaScript

Здесь всё просто и не интересно. Обычная вёрстка, которая для back-end разработчика не представляет особго интереса. Это хлеб front-end-щиков.

Но базовое понимание всего этого быть должно.

HTML Academy

HTML Book

Основы JavaScript

Этого Вам хватит с головой.

VCS

Любой проект, в котором работает больше 0 разработчиков не делается без СКВ (системы контроля версий). GIT – наиболее удобная и часто применяемая, конкурирует с ней SVN. Будете знать одну из них – и будет Вам счастье.

По итогу модно сказать, что порого входа в Java крайне высок. Количество необходимых знаний для того, чтобы устроиться на работу или начать писать более-менее солидные приложения просто огромно. Но на выходе получаете просто невероятные перспективы.

Важно понимать, что спрос на новичков крайне низкий, несмотря на все попытки показать, что программистов не хватает. Не хватает высококвалифицированных разработчиков с опытом работы от 3-х лет, а новичков с избытком.

Для того, чтобы зацепиться и “войти в IT” Вам поможет адский труд в течение от 6 месяцев до 1 года. Но если это Ваше и Вы готовы для этого вложить такое количество усилий, то дерзайте.

Удачи Вам!

От себя хотел бы добавить, что реально для изучения java core ничего лучше javarush, по-крайней мере в рунете — нет. ИМХО.

Всем удачи еще раз.


Статья: proselyte.net/how-to-become-java-developer/
Автор: proselyte.net/faq/

Удаление записи в Map.

Всем добрый день.

Никак не могу найти ответы на свои вопросы. А именно удаление записи в Map.

С появления коллекций(в лекциях) нас учили удалять их через итератор. Но я прочитал, что значение Map можно удалить путем удаления ключа...map.remove(key);

for (Map.Entry<String, Date> pair: map.entrySet())
{
map.remove(pair.getKey());
}

Почему это не работает??? Ведь foreach НЕЯВНО использует итератор

Вопросы на собеседование Hibernate

Данная статья является переводом и улучшением зарубежных статей (список ресурсов перечислен в конце статьи). Ответы на некоторые вопросы расширены, представлены ссылки на сторонние ресурсы которые содержат ответы которые могут возникнуть в процессе чтения.

1) Что такое Hibernate?

Это фреймворк для объектно-реляционного отображения сущностей в традиционные реляционные базу данных.
Основные возможности фреймворка:
1) Автоматическая генерация и обновление таблиц в базах данных;
2) Поскольку основные запросы к базе данных (сохранение, обновление, удаление и поиск) представлены как методы фрейморка, то значительно сокращается код, который пишется разработчиком;
3) Обеспечивает использование SQL подобного языка (HQL — hibernate query language). Запросы HQL могут быть записаны рядом объектами данных (POJO классы подготовленные для работы с базой данных).

2) Как Hibernate помогает в программировании?

Hibernate реализует ряд фичь которые значительно упрощают работу разработчика.
— Одной из таких фичь является то, что hibernate позволяет разработчику избежать написания большинства SQL запросов (они уже реализованы, вам надо просто использовать методы которые предоставляет фреймворк).
— Под бортом у Hibernate есть куча полезных инструментов которые значительно ускоряют работу приложения, самыми примечательными из них являются двухуровневое кэширования и тонкие настройки lazy и fetch изъятия.
— Сам генерирует таблицы в базу данных.

3) Способы конфигурации работы с Hibernate.

Существует четыре способа конфигурации работы с Hibernate:
— используя аннотации;
— hibernate.cfg.xml;
— hibernate.properties;
— persistence.xml.
Самый частый способ конфигурации: через аннотации и файл persistence.xml, что касается файлов hibernate.properties и hibernate.cfg.xml, то hibernate.cfg.xml главнее (если в приложение есть оба файла, то принимаются настройки из файла hibernate.cfg.xml). Конфигурация аннотациями, хоть и удобна, но не всегда возможна, к примеру, если для разных баз данных или для разных ситуаций вы хотите иметь разные конфигурацию сущностей, то следует использовать xml файлы конфигураций.

4) Какие ключевые интерфейсы использует Hibernate?

Существует пять ключевых интерфейсов которые используются в каждом приложении связанном с Hibernate:
— Session interface;
— SessionFactory interface;
— Configuration interface;
— Transaction interface;
— Query and Criteria interfaces.

5) Какая роль интерфейса Session в Hibernate?

Session — это основной интерфейс, который отвечает за связь с базой данных. Так же, он помогает создавать объекты запросов для получение персистентных объектов. (персистентный объект — объект который уже находится в базе данных; объект запроса — объект который получается когда мы получаем результат запроса в базу данных, именно с ним работает приложение). Обьект Session можно получить из SessionFactory:
Session session = sessionFactory.openSession();
Роль интерфейса Session:
— является оберткой для jdbc подключения к базе данных; (https://ru.wikipedia.org/wiki/Java_Database_Connectiv..)
— является фабрикой для транзакций (согласно официальной документации transaction — аllows the application to define units of work, что, по сути, означает что транзакция определяет границы операций связанных с базой данных).
— является хранителем обязательного кэша первого уровня.

6) Какая роль интерфейса SessionFactory в Hibernate?

Именно из объекта SessionFactory мы получаем объекты типа Session. На все приложение существует только одна SessionFactory и она инициализируеться вместе со стартом приложения. SessionFactory кэширует мета-дату и SQL запросы которые часто используются приложением во время работы. Так же оно кэширует информацию которая была получена в одной из транзакций и может быть использована и в других транзакциях.
Обьект SessionFactory можно получить следующим обращением:
SessionFactory sessionFactory = configuration.buildSessionFactory();

7) Какие типы коллекций представлены в Hibernate?

Bag, Set, List, Map, Array.

8) Что собой являет коллекция типа Bag и зачем она используется?

Своей реализации тип коллекции Bag очень напоминает Set, разница состоит в том, что Bag может хранить повторяющиеся значения. Bag хранит непроиндексированный список элементов. Большинство таблиц в базе данных имеют индексы отображающие положение элемента данных один относительно другого, данные индексы имеют представление в таблице в виде отдельной колонки. При объектно-реляционном маппинге, значения колонки индексов мапится на индекс в Array, на индекс в List или на key в Map. Если вам надо получить коллекцию объектов не содержащих данные индексы, то вы можете воспользоваться коллекциями типа Bag или Set (коллекции содержат данные в неотсортированном виде, но могут быть отсортированы согласно запросу).

9) Какая разница в работе методов load(); и get();?

Метод load(); обычно используется когда в не уверен что запрашиваемый объект уже находится в базе данных. Если объект не найден, то метод кидает исключение Если объект найден — метод возвращает прокси объект, который является ссылкой на объект находящийся в базе данных (запрос в базу данных еще не был осуществлен, своего рода lazy изъятие), непосредственный запрос к базе данных когда мы непосредственно обращаемся к необходимому объекту через прокси объект.
Метод get(); используется тогда, вы на 100 процентов не уверены есть ли запрашиваемый объект в базе данных. В случае обращение к несуществующему объекту, метод get(); вернет null. В случае нахождения объект, метод get(); вернет сам объект и запрос в базу данных будет произведен немедленно.

10) Что такое Lazy fetching(изъятие) в Hibernate?

Тип изьятия Lazy, в Hibernate, связан с листовыми(дочерними) сущностями и определяют политику совместного изъятия, если идет запрос на изъятие сущности родителя.
Простой пример:
Есть сущность Дом. Он хранит информацию о своем номере, улице, количество квартир и информацию о семьях которые живут в квартирах, эти семьи формируют дочернюю сущность относительно сущности Дом. Когда мы запрашиваем информацию о Доме, нам может быть совершенно ненужным знать информацию семьях которые в нем проживают, тут нам на помощь приходит lazy(ленивое) изъятие(fetching) которая позволяет сконфигурировать сущность Дом, чтобы информацию о семьях подавалась только по востребованию, это значительно облачает запрос и ускоряет работу приложения.

©dev-bay
  • ,

Побайтовая работа с файлами

Special for Spiker

Начнем'c.
В 18 уровне начались первые задачи побайтного чтения файлов:
Прочитать файл, далее найти минимальные/максимальные байты или вывести в упорядоченном виде и т.п.

Народ тут весьма ушлый. Знают про коллекции и про то, что они могут сортировать, вставлять.
Коллекции — мощный механизм. И многие не применяли их вообще до JavaRush-а.
Оно, конечно, похвально изучать их и пытаться приткнуть куда не попадя.

И так. Возьмем задачу, которой нет в заданиях (чтобы не было спойлеров при решении), но есть сильно похожие:

Ввести с консоли имя файла
Считать все байты из файла.
Не учитывая повторений — отсортировать их по байт-коду в убывающем порядке.
Вывести на экран
Закрыть поток ввода-вывода

Пример байт входного файла
44 83 44

Пример вывода
83 44


Мы дополнительно завели переменные startTime и finishTime — чтобы засечь время выполнения программы.
Для вычисления использовал i3-3GHz/8Gb RAM/HDD WD Blue-1Tb/Win7-64/jdk-8u73-windows-x64

(примеры программ в вариантах 1-2 взяты из форума info.javarush, они чуть модифицированы только для сортировки в возрастающем порядке — то есть они РЕАЛЬНЫЕ!!)

Решаем в лоб:
// Вариант 1. Загоняем в коллекцию и сортируем используя ее метод Collections.sort 
public class Solution {
    public static void main(String[] args) throws Exception {
        FileInputStream inputStream = new FileInputStream(new BufferedReader(new InputStreamReader(System.in)).readLine());
        long startTime = System.currentTimeMillis();
        
        ArrayList<Integer> listData = new ArrayList<Integer>();
        while (inputStream.available() > 0) listData.add(inputStream.read());
        inputStream.close();
        ArrayList<Integer> result = new ArrayList<Integer>(new HashSet<Integer>(listData));
        Collections.sort(result);

        while (!result.isEmpty()) {
            System.out.print(result.get(result.size()-1) + " ");
            result.remove(result.get(result.size()-1));
        }

        long finishTime = System.currentTimeMillis();
        System.out.println("\nвремя работы=" + (finishTime-startTime) + "ms.");
    }
}

Решает все замечательно! Тест (если бы был — прошелся бы на ура).
Но в жизни мало файлов содержащих только строчку «Мама мыла раму».
Давайте скормим нашей программе файл в 46Мб (по нынешним меркам вроде и не особо много).
Что такое, программа выполняется 220 секунд.
Попытка скормить с вечера 1Gb файл (размер MPEG4 фильма не в самом лучшем качестве) не увенчалась успехом.
Программа утром все еще читала — а мне идти на работу уже.

В чем проблема? Наверное в использовании
ArrayList<Integer>
у которого внутри 1 миллиард элементов. Каждый элемент его занимает 16 байт минимум (Заголовок: 8 байт + Поле int: 4 байта + Выравнивание для кратности 8: 4 байта). Итого мы добровольно загоняем в память 16 Gb данных при размере оперативы в 8.

Будем делать лучше. Нырнем в коллекции глубже. И ура, нашлось то, что нам нужно.

Встречаем TreeSet

Это множество:
-не допускает хранение двух одинаковых элементов (а значит мы будем хранить в памяти все 255 элементов, вместо миллиарда!)
-при манипуляциях со своими элементами автоматом упорядочивает (само сортирует — вот он, верх совершенства!)

Получаем:
// Вариант 2. Загоняем в ТreeSet который сам сортирует (лютый win!)
public class Solution {
    public static void main(String[] args) throws Exception {
        FileInputStream inputStream = new FileInputStream(new BufferedReader(new InputStreamReader(System.in)).readLine());

        byte[] arrBytes = new byte[256];
        long startTime = System.currentTimeMillis();

        SortedSet<Integer> list = new TreeSet<Integer>();
        while(inputStream.available()>0) list.add(inputStream.read());
        inputStream.close();

        while (!list.isEmpty())        {
            System.out.print(list.last() + " ");
            list.remove(list.last());
        }

		long finishTime = System.currentTimeMillis();
        System.out.println("\nвремя работы=" + (finishTime-startTime) + "ms.");
    }
}


Имеем на выходе:
46Мб файл 176 секунд.
1Gb файл — 3 часа 5 минут.
Прогресс на лицо. Мы смогли «дождаться» результатов, да и 46Мб файл заметно быстрее обрабатывается.

Идем дальше. Давайте попытаемся отказаться от коллекций (это будет для некоторых мучительно больно). Будем использовать простые массивы (это так примитивно).
Заметим одну важную вещь. Кол-во встречающихся байт можно загнать в массив длиной 256.
Так просто будем увеличивать на единицу соответствующий считанному байту элемент массива.

Массив — побайтно

// Вариант 3. Считываем массив побайтно.
public class Solution {
    public static void main(String[] args) throws Exception {
        FileInputStream inputStream = new FileInputStream(new BufferedReader(new InputStreamReader(System.in)).readLine());

        long[] arrBytes = new long[256];
        long startTime = System.currentTimeMillis();
        
        while (inputStream.available() > 0) arrBytes[inputStream.read()]++;

		inputStream.close();
        // Выводим отсортированный по байт-коду в обратном порядке
        for (long i = 255; i >= 0 ; i--)
            if (arrBytes[(int) i] > 0) System.out.print(i + " ");

			long finishTime = System.currentTimeMillis();
        System.out.println("\nвремя работы=" + (finishTime-startTime) + "ms.");
    }
}


Имеем на выходе:
46Мб файл 158 секунд.
1Gb файл — 2 часа 55 минут.
Опять улучшение, но небольшое. И мы сделали все простыми инструментами. Не использовали микроскоп для забивания гвоздей.

Теперь лирическое отступление.
Вспомним устройство компьютера.
Память ОЗУ (DRAM) где обычно выполняется программа и хранятся переменные имеет высокую скорость доступа, но небольшой размер.
Память на жестком/flash диске (HDD или Flash-накопители) где обычно хранятся файлы, наоборот имеет низкую скорость доступа, но большой размер.
Так что когда мы побайтно читаем 1Gb файл (то есть миллиард раз обращаемся к HDD) — мы тратим много времени на работу с низкоскоростным устройством
(по песчинке перекладываем песок с кузова КамАЗа в песочницу).

Попробуем еще улучшить.

Вывалим сразу ВЕСЬ КамАЗ с песком за один раз!

// Вариант 4. Считываем массив сразу целиком за раз в память.
public class Solution {
    public static void main(String[] args) throws Exception {
        FileInputStream inputStream = new FileInputStream(new BufferedReader(new InputStreamReader(System.in)).readLine());

        long[] arrBytes = new long[256];
        long startTime = System.currentTimeMillis();
        
        byte fileImage[]=new byte[inputStream.available()];
        long fileSize=fileImage.length;
        inputStream.read(fileImage);
        for (int i = 0; i <fileSize ; i++) arrBytes[fileImage[i] & 0b11111111]++;

		inputStream.close();
        // Выводим отсортированный по байт-коду в обратном порядке
        for (long i = 255; i >= 0 ; i--)
            if (arrBytes[(int) i] > 0) System.out.print(i + " ");

		long finishTime = System.currentTimeMillis();
        System.out.println("\nвремя работы=" + (finishTime-startTime) + "ms.");
    }
}

небольшое, но опять таки важное отступление
Заметим:
1. индекс у arrBytes определен в пределах 0..255,
2. fileImage — массив байт, элементы которого имеют значение -128..127
Поэтому для подсчета байт будем использовать конструкцию
arrBytes[fileImage[i] & 0b11111111]++;

которая банально сбросит бит знака и вернет нам значение в диапазоне 0..255

И так, результаты:
46Мб файл 0.13 секунд (меньше секунды).
1Gb файл — 9 секунд.
Мы сделали это! Мы невероятно круты! Ускорились с 3 часов до 9 секунд.

Все, можно откинуться в кресле и попить чайку. А теперь еще один эксперимент —
попробуем файл в 32 Gb (например, HD фильм). Получим в результате треск
работающего HDD с вываливанием программы в Windows. КамАЗ вывалив кузов с песком сломал песочницу!

Что будем делать? Вспомним еще один факт. Файлы в ОС хранятся обычно порциями (кластерами) по 2-64Кб
(зависит от типа файловой системы, настроек и т.п.). Будем считывать порциями, для примера в 64000 байт.
Попытаемся разгрузить КамАЗ экскаватором достаточно большими порциями:

Используем буфер.
// Вариант 5. Считываем массив кусками.
public class Solution {
    public static void main(String[] args) throws Exception {
        FileInputStream inputStream = new FileInputStream(new BufferedReader(new InputStreamReader(System.in)).readLine());

        long[] arrBytes = new long[256];
        long startTime = System.currentTimeMillis();
        
        int  bufferSize = 64000;
        byte buffer[]   = new byte[64000];

        while (inputStream.available() > 0) {
            if (inputStream.available() < 64000) bufferSize = inputStream.available();
            inputStream.read(buffer, 0, bufferSize );
            for (int i = 0; i <bufferSize ; i++) arrBytes[ buffer[i] & 0b11111111 ]++;
        }

		inputStream.close();
        // Выводим отсортированный по байт-коду в обратном порядке
        for (long i = 255; i >= 0 ; i--)
            if (arrBytes[(int) i] > 0) System.out.print(i + " ");

		long finishTime = System.currentTimeMillis();
        System.out.println("\nвремя работы=" + (finishTime-startTime) + "ms.");
    }
}

В итоге получили:
46Мб файл 0.08 секунд (меньше секунды).
1Gb файл — 0.9 секунд(меньше секунды).
32Gb файл — 31 секунда.

Заметим для 1 Gb файла мы улучшили производительность с нескольких часов до долей секунд!!!

На этом скромном факте закончим эксперимент и улучшение начального кода. Мы достигли прогресса во многом — нас радуют новые показатели расхода памяти и времени работы. Также мы не подтягиваем в данном случае бесполезные коллекции из стандартной библиотеки.

P.S. Кто-то скажет пример надуманный и т.п. Но полно похожих задач — проанализировать огромный объем элементов, имеющих конечное число состояний.
Например изображения (RGB — обычно хранятся в 24 байтах, в нашем случае long[] arrRGB = new long[256*256*256] занял бы в памяти всего 64Мб),
музыка (амплитуда обычно оцифровывается в 16 или 24 бита) или дискретные показатели датчиков и т.п.
  • ,

Какой нужен английский язык для работы?

Всем привет!
Начитался статей и вакансий про необходимость (да и собственная цена будет выше) знания английского для работы в нормальных айтишных конторах с нормальными зп. Призадумался на эту тему. Мой вери пур соу-соу точно не подойдет.
Но вот какой на самом деле язык там нужен: бытовой разговорный, строго технический или еще какой — не ясно.
Имеющие опыт, подскажите.

Задал чуть ранее этот вопрос тут, но ответы мне не понравились…