Новый Суперблиц На Java-Хардкоре

Итак, вчера мы с тобой Давайте играть в Java-версии «Интеллектуального казино против знатоков», и при этом, при всем уважении к хабровцам, победили зрители! Победителем этого этапа стал Сергей СерЦе Целовальникова, решившего три задачи.

Как и обещали, мы дарим ему небольшой приз: VIP-билет на JPoint! Но радости в сторону.

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

Мы принимаем эту плату, и поэтому сегодня у нас есть вариант на чистом Java! никаких пружин, электронных писем или шаблонов.

Это будет настоящее испытание для настоящих фанатов хардкора! Ниже — ответы на вчерашний тур и суперблиц! Телезритель из Санкт-Петербурга сегодня играет против экспертов Андрей апангин Пангин .



Новый суперблиц на Java-хардкоре

Но сначала ответы на вчерашние задачи .

Разные аспекты от Николая Гарбузова

Будет ли компилятор компилировать следующий аспект AJC? Если да, то что он выведет на консоль при компиляции?
  
  
  
  
  
  
  
  
  
   

public aspect QuizAspect { public static int count(int i) { return i++; } before (int n) : execution(public int QuizAspect.count(int)) && args(n) && if(QuizAspect.count(1)>1) { System.out.println("QuizAspect " + n); } }

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

В этом случае вызов метода Quiz.count во время выполнения приведет к ошибке StackOverflowError!

Вы можете подумать, что выражение в if() начнет вычисляться при компиляции кода, но это не так.

(не путайте аспекты с метапрограммированием) Этот аспект будет вставлять код рекомендации только внутри метода count, добавьте если() этому коду.

Высказывания Владимира Ситникова
В чем подвох удаления комментариев Java с этим выражением? Назовите 3 причины, почему этого делать не следует. (мы предполагаем, что исходник написан обычными буквами) -

Pattern.compile("/\\*(?:[^*]|\\*[^/])*\\*/")

Отвечать
  1. Если это Java-строка и она якобы содержит комментарий, то она работать не будет.
  2. Если комментарий заканчивается двумя звездочками и косой чертой, он не сработает.
  3. Если комментарий большой, мы получим StackOverflowError, поскольку регулярные выражения Java используют возврат.
Исправить это можно двумя способами:
  • Притяжательный квантификатор:

    Pattern.compile("/\\*(?:[^*]|\\*(?!/))*+\\*/")

  • Независимая группа:

    Pattern.compile("/\\*(?>,[^*]|\\*(?!/))*\\*/")

Весенние контексты от Николая Алименкова
Есть 2 контекста Spring: 1. XML с компонентом

<util:list id="myList"> <value>3</value> <value>4</value> </util:list>

2. b.xml с корзиной

<util:list id="myList"> <value>6</value> </util:list>

Что печатает этот фрагмент кода:

System.out.println(new ClassPathXmlApplicationContext("a.xml", "b.xml").

getBean("myList"));

И как заставить его выдавать ошибку, не меняя логику кода? Отвечать Отобразит 6 , и вы можете принудительно выдать ошибку, установив разрешитьBeanDefinitionOverriding для контекста установлено значение false.

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

ООМ от Никиты Сальникова-Тарновского

Ниже представлены 2 программы.

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

Но один из них выбрасывает java.lang.OutOfMemoryError, а второй нет. Почему?

public class OOM1 { private static final int SIZE = (int) (Runtime.getRuntime().

maxMemory() * 0.55); public static void main(String[] args) { { byte[] bytes = new byte[SIZE]; System.out.println(bytes.length); } byte[] bytes1 = new byte[SIZE]; System.out.println(bytes1.length); System.out.println("I allocated memory successfully"); } } public class OOM2 { private static final int SIZE = (int) (Runtime.getRuntime().

maxMemory() * 0.35); public static void main(String[] args) { { byte[] bytes = new byte[SIZE]; System.out.println(bytes.length); } byte[] bytes1 = new byte[SIZE]; System.out.println(bytes1.length); byte[] bytes2 = new byte[SIZE]; System.out.println(bytes2.length); System.out.println("I allocated memory successfully"); } }

Отвечать В обоих случаях javac понимает, что переменная bytes не будет использоваться после окончания внутреннего блока.

Поэтому второй созданный массив, который мы поместили в переменную bytes1, будет занимать тот же слот, что и переменная bytes. Как следствие, после выполнения присваивания байт1 < - new bytes[SIZE], the value that was in the bytes variable becomes unavailable and the GC can delete it. Thus, OOM2 requires only 70% of the heap, and not 105%.

Обновление 1 Здесь интересный анализ от Черемин по теме этого задания.

Обновление 2 Для тех у кого есть оба варианта киньте OOM: для воспроизведения ошибки запустите свою JVM с опцией -server Groovy от Баруха Садогурского и Весна от Жени Борисова Но здесь нас ждет облом.

Джбарух И Евгений Борисов попросил меня сохранить интригу и не публиковать ответы на свои проблемы до тех пор, пока не появится JPoint. Они сказали, что каждый, кто хочет узнать ответы, должен прийти к ним.

отчеты .

Если вы хотите узнать ответы, попробуйте написать им личное сообщение.

Может, они тебя пожалеют! Суперблиц от Андрея Пангина Пришло время настоящего хардкора! Знатоки поднимают глаза, и на их экранах появляется улыбающийся мужчина.

апангин .

Он кагбе машет всем экспертам и осыпает их тысячами поцелуев.

Вопрос первый

Что не так с этим кодом? Как это исправить?

public static double[] getRandomVector(int size) { double[] vector = new double[size]; Arrays.parallelSetAll(vector, i -> Math.random()); return vector; }

Вопрос второй
Как может быть, что публичный метод работает заметно быстрее, чем идентичный приватный?

public class Modifiers { static final Inner inner = new Inner(); static class Inner { int x = 1; int getX1() { return x; } int getX2() { return getX1(); } int getX3() { return getX2(); } int getX4() { return getX3(); } int getX5() { return getX4(); } int getX6() { return getX5(); } int getX7() { return getX6(); } int getX8() { return getX7(); } int getX9() { return getX8(); } private int getPrivate() { return getX9(); } public int getPublic() { return getX9(); } } @Benchmark public int testGetPrivate() { return inner.getPrivate(); } @Benchmark public int testGetPublic() { return inner.getPublic(); } }

Вопрос третий
Можно ли создать класс в Java (именно класс, а не интерфейс) без единого конструктора, пусть даже приватного?
Такие вот дела! Напишите свои ответы ниже в комментариях.

под спойлером .

У вас есть 12 часов.

Первый, кто решит все три задачи, получит специальный приз от Андрея и Одноклассников.

Остальные, решившие все три задачи, получат памятные призы от JUG.ru. Удачи! ОБНОВЛЯТЬ: Выиграл Лэни .

Его ответы вы можете найти в комментариях ниже! Вот как его наградили:

Новый суперблиц на Java-хардкоре

Теги: #java #спортивное программирование #Ненормальное программирование #задачи #пятница #пятница #хардкор #телезрители против экспертов #телезрители против экспертов #не давать работать вообще

Вместе с данным постом часто просматривают: