Pull to refresh

Comments 27

здравствуйте, автор. я пока нашел 4 ошибки и неточности формулировок.

1. Какие есть пулы и представляют они из себя что? Расширять можно ли их? Ответ:пулы бывают целых чисел: Byte, Short, Integer, Long

я думаю, никакой девелопер не ответит так. вместо этого он скажет: "ну, бывает ForkJoinPool, ThreadPoolExecutor и другие. "

3. Ответишь без труда ты, сколько будет создано объектов после выполнения кода: String str = new String(“Очень важная строка, вах!”)?Ответ: Два объекта.

неверный ответ, я думаю. правильный ответ: не знаю, это зависит от версии, состояния класслоадеров, gc. может создаться обьект ClassLoader, может Charset, может byte[], и это все помнить не очень осмысленно.

6. А вот эти пулы все — где хранятся-то они? Ответ: Естественно, пулы хранятся в Heap, а ссылки в Stack.

я думаю, неверно. какие ссылки, куда? почему в стеке, а не например, в полях обьекта?

11. Short занимает 2 байта, а Character также занимает 2 байта. Получается можем безопасно приводить эти типы друг другу мы?

неверно. Short занимает от 8 до 16 байт, в зависимости много от чего.

я пока нашел 4 ошибки и неточности формулировок

"Только ситхи все возводят в абсолют"

«У функционального интерфейса может быть только один абстрактный метод.»

Дополню список ошибок. Абстрактный метод у интерфейса, это как?

Вас смущает именно слово абстрактный? Оно взято, если не изменяет память, из документации Java. Почему нельзя без слова абстрактный? Потому, что вместе с функциональными интерфейсами в 8 версии Java добавили статические и дефолтные методы, которых может быть много.

Буду благодарен, если укажите мне на мои заблуждения и поясните что вас смутило.

Возможно, я немного коряво написал, поэтому нашел первоисточник, цитирую (docs.oracle.com):

Note: Methods in an interface (see the Interfaces section) that are not declared as default or static are implicitly abstract, so the abstract modifier is not used with interface methods. (It can be used, but it is unnecessary.)

Да, собственно смутило, что на русском обычно так не говорят. Но видимо, вы правы.

Даже любопытно, никогда не задумывался и не пробовал добавить к методу интерфейса abstarct :)

Здравствуйте. Слово "абстрактный" используется, чтобы подчеркнуть отличие от дефолтных методов, которых в функциональных интерфейсах может быть несколько.

Если бы на 40 вопрос от меня хотели бы такой подробный ответ, то я бы очень хотел знать к чему такие подсчеты, экстремальная экономия на серверах?))

На собеседованиях не всегда задают практические вопросы. Некоторые вопросы имеют цель показать общее знание кандидата в данной сфере. Это довольно спорный подход, но он встречается.

Не трогайте пулы руками, ни числовые, ни строковые, не вызывайте intern(). Это путь на тёмную сторону. Скорее всего при попытке "оптимизировать" вы сделаете только хуже, потому что современные версии виртуальных машин работают уже по-другому.

19 вопрос. Спокойно положился Integer в ArrayList<Number>

final List<Number> list = new ArraList<>();
list.add(10);
//да хоть так
list.add(new Integer(10)); //правда с 9-ой версии такая запись deprecated, поэтому можно и так
list.add(Integer.valueOf(10));

Речь наверное была об этом

final List<Number> numbers = new ArrayList<>();
final List<Integer> integers = new ArrayList<>();
numbers = integers; // ошибка

Возможно автор и имел в виду невозможность присвоения ссылки integers ссылке numbers. Но из предложения

И хотя Integer является наследником Number мы не сможем положить объект этого типа в коллекцию

я не вижу никакой двусмысленности. И речь идёт именно о том, чтобы положить объект Integer в коллекцию из Number.

Возможно я слишком конкретно интерпретирую слова автора ?‍♂️

Так я не говорю, что автор прав. Предполагаю, что могло бы быть)) Скорее всего речь была бы об этом.

Видите ли, сложно догадаться, что автор имел в виду, но: из того, что Integer наследник Number, никак не следует, что List<Integer> тоже наследник List<Number>. Или что он должен быть таким. Строго по спецификации — нет. не наследник. Именно поэтому numbers = integers; // ошибка

И по этой же причине никакого нарушения LSP из этого факта тоже не следует. Не наследники не обязаны соблюдать LSP.

Я уж не говорю про List<? super Integer> или List<? extends Number>, где все еще сложнее (и по-разному), один ковариантный, а другой контра.
Данные на перфокартах располагались обычно в 7 рядов (соответствующих семи битам байта).

Э, те перфокарты, которые я прекрасно помню, имели 12 рядов. И вы легко сможете загуглить фото такой перфокарты сами. И это как минимум две разные системы — ЕС ЭВМ и М-222 (при этом ряды в разном направлении, но короткий таки все равно 12 дырок).

Спасибо за статью, сохранил в заметки. Перед собесами самое то:)

Абсолютно не согласен про инкапсуляцию. Инкапсуляция про скрытие внутренностей объекта и представление интерфейса для взаимодействия сс ними как с одним целым. Например, кот - сложный организм, который инкапсилуирует органы и управляет ими, предоставляя функционал - ловлю мышек

Здравствуйте. Есть несколько разных определений понятий ООП. Это одно из них.
Например, в статье по ссылке http://www.tonymarston.co.uk/php-mysql/abstraction.txt приведены несколько определений, причем сильно отличающихся друг от друга.

Вы не совсем правильно понимаете, инкапсуляция это на скрытие данных, а просто объединение данных и методов. А скрытие данных это data hiding и инкапсуляция возможна без него, например в js. Или может быть наоборот, инкапсуляции нет а скрытие есть, помоему в haskell.

Я вот всю жизнь считал, что инкапсуляция это не про сокрытие данных, а про сокрытие внутреннего состояния. Т.к. если изменяемого состояния нет, то и инкапсулировать нечего.

Поэтому в хаскеле и нет инкапсуляции, ибо изменять нечего. А в js или питоне - есть, хотя, технически, данные там спрятать довольно сложно.

1)Какие есть пулы и представляют они из себя что? Расширять можно ли их?

Пулы потоков из первого, что приходит в голову. Объяснение про пул character до большинства юнглингов доходит с трудом, т.к. батя коллекцию перфокарт от деда где-то потерял. Расширять бывает можно, но от пула зависит. Пул коннектов к постргесу, например, без плясок не особо расширишь :)

3) Ответишь без труда ты, сколько будет создано объектов после выполнения кода:

String str = new String(“Очень важная строка, вах!”)?

От нуля до бесконечности, в зависимости от фантазии авторов конкретной JVM.

7) Размер памяти стека, меньше памяти кучи

А чо, и вправду -Xmx не может быть меньше -Xss?

Стековая память быстрее памяти кучи

Вы меняли на вашей JVM? Разница существенна? Интуиция подсказывает, что при отсутствии gc выделение в куче должно быть за O(1). И с большой вероятностью уже в кэше процессора. Т.е. от выделения на стеке в большинстве случаев не должно сильно отличаться.

9) А что такое сигнатура метода и контракт метода?

Сигнатура: название метода и параметры. Всё, больше там ничего нет

Скалисты подсказывают, что количество одних только списков параметров на JVM в военное время может достигать трёх.

Про LSP и прочие контракты (например, в виде пред- и постусловий и прочего АОП на собеседовании, наверное, лучше не вспоминать).

17) Я вижу Силу в тебе. Про ClassLoader расскажешь ты мне.

Всего их три вида: загрузчик класса bootstrap, загрузчик класса расширений и системный загрузчик.

Ну, это нормально, если в 2022 году юнглинг не слышал про java applets или JavaEE. Но как собеседующий мог пропустить maven и прочие штуки с кастомными класслоадерами?

18) JRE (java Runtime Environment) — минимально-необходимая реализация виртуальной машины для исполнения Java-приложений. Если нужно просто запустить программу, то понадобится только JRE.
В JRE входит: JVM, ClassLoader и стандартного набора библиотек и классов Java

Ну там побольше инструментов обычно. Как минимум средства для управления сертификатами и политиками. А в старых версиях как правило и интеграция с браузерами. Ну и вендоры вольны добавить от себя все, что хотят. А стандартные класслоадеры и стандартные библиотеки от JVM вообще слабо отделимы.

19) Я не буду тебя спрашивать про SOLID. Лучше скажи, в нашей любимой Java нарушения этих принципов есть ли?

Да, допустим, нарушается принцип подстановки Барбары Лисков в коллекциях. У нас есть ArrayList параметризованный Number. И хотя Integer является наследником Number мы не сможем положить объект этого типа в коллекцию.

Хотя в джаве Integer и является подтипом Number, то ArrayList<Integer>, если я правильно понимаю, подтипом ArrayList<Number> уже не является. Т.е. LSP в данном случае нарушаться не может, т.к. он тут в принципе не применим.

Простите, дальше мне лень, но там точно такие же вопросы из серии "угадай, что имел ввиду автор".

P. S.: Я не настоящий джавист сварщик, и на "уровень юнглинг" наверняка не тяну

Отлично, на паре вопросов даже пришлось сбегать на SO уточнить кое-что

Sign up to leave a comment.