Комментарии 57
Т.е на них ответы сюда не писать лучше? А то некрасиво получится)
Пишите все, но под спойлер!
Пиши под спойлер, и мы никому не скажем, что ты прав :)
Ну а чего писать ) И так же ясно что
Даже у какого то телезрителя Алименкова задача сложнее! (
Заголовок спойлера
только кложур заэвалуэйтится повторно :)
Даже у какого то телезрителя Алименкова задача сложнее! (
Возникает закономерный вопрос
А сколько там кложуров?
some groovy
Кложур там только в списке только в 1 месте, AST proof
А почему так, вкратце описано на относительно новом няшном груви-сайте
Ну в а сорцах, в groovy.lang.GString#writeTo можно посмотреть что будет, если там будет кложур, принимащий одну переменую
А почему так, вкратце описано на относительно новом няшном груви-сайте
Ну в а сорцах, в groovy.lang.GString#writeTo можно посмотреть что будет, если там будет кложур, принимащий одну переменую
Да сразу понятно же чем троллить будешь! В этом и беда)
Все, но ваши — после конфы :)
Без единого разрыва
package\u0020ru.nullpointer.jugtest;
public
class
Hello{
public
static
void
main(String
args[]){
System.out.println("Hello\u0020world");
}
}
Вторая задача от Владимира Ситникова (NetCracker)
Регулярка не учитывает /* */ в стрингах
Написать Hello world без пробелов можно с помощью
Написать Hello world без пробелов можно с помощью
System.out.println("Hello"+(char)32+"World");
Регулярки - зло
package ru.nullpointer.jugtest;
import java.util.regex.Pattern;
public class CommentCleaner {
public static void main(String args[]) {
String source = "/***/";
Pattern p = Pattern.compile("/\\*(?:[^*]|\\*[^/])*\\*/");
String result = p.matcher(source).replaceAll("");
if (!result.isEmpty()) {
throw new OHSHIException();
}
}
static class OHSHIException extends RuntimeException {
OHSHIException() {
super("OH SHI--");
}
};
}
Не могу удержаться -- задача №4
Очевидно, что java переиспользует слоты переменных на стеке (в регистрах), когда можно понять, что переменная дальше по коду функции не используется. В обоих случаях аллоцированные массивы перестают быть нужными сразу после вычисления их длины для передачи в println() — поэтому, в идеале, в обоих случаях максимальное необходимое количество памяти не превышает размера одного массива. Почему в одном случае все-таки вылетает исключение?
Я могу предположить, что есть некоторое количество слотов на стеке, ниже которого нет смысла оптимизировать (тем более, что main вызывается лишь однажды, поэтому о реальной оптимизации C1/C2 речь, скорее всего, не идет — почти наверняка тут мы работаем в интерпретируемом режиме). Методом научного тыка можно обнаружить, что вот такой код
выполняется без ошибок. В то время, как вот такой
Падает с OOM.
Отсюда можно предположить, что на моей версии джавы (1.6.0_45), во видимому, два последних (то есть последних используемых) слота на стеке java не трогает, но если их становится больше, то делаются какие-то попытки переиспользовать предыдущие.
P.S. Любопытно, что вот такой код
Падает с OOM, но если заменить a= 0; на a=args.length — то выполняется успешно. Опять же, можно предположить, что константная переменная просто заменяется на свое значение, без реального размещения ее на стеке, а переменная с хоть сколь либо динамическим значением все-таки размещается — и вытесняет со стека размещенный там byte[]
Я могу предположить, что есть некоторое количество слотов на стеке, ниже которого нет смысла оптимизировать (тем более, что main вызывается лишь однажды, поэтому о реальной оптимизации C1/C2 речь, скорее всего, не идет — почти наверняка тут мы работаем в интерпретируемом режиме). Методом научного тыка можно обнаружить, что вот такой код
public static void main( final String[] args ) {
{
final byte[] bytes = new byte[SIZE];
System.out.println( bytes.length );
}
final byte[] a = {}; // <=== !!!
final byte[] bytes = new byte[SIZE];
System.out.println( bytes.length );
System.out.println( "I allocated memory successfully" );
}
выполняется без ошибок. В то время, как вот такой
public static void main( final String[] args ) {
final byte[] a = {};
{
final byte[] bytes = new byte[SIZE];
System.out.println( bytes.length );
}
final byte[] bytes = new byte[SIZE];
System.out.println( bytes.length );
System.out.println( "I allocated memory successfully" );
}
Падает с OOM.
Отсюда можно предположить, что на моей версии джавы (1.6.0_45), во видимому, два последних (то есть последних используемых) слота на стеке java не трогает, но если их становится больше, то делаются какие-то попытки переиспользовать предыдущие.
P.S. Любопытно, что вот такой код
public static void main( final String[] args ) {
{
final byte[] bytes = new byte[SIZE];
System.out.println( bytes.length );
}
int a = 0; // <== constant
final byte[] bytes = new byte[SIZE];
System.out.println( bytes.length );
System.out.println( "I allocated memory successfully" );
}
Падает с OOM, но если заменить a= 0; на a=args.length — то выполняется успешно. Опять же, можно предположить, что константная переменная просто заменяется на свое значение, без реального размещения ее на стеке, а переменная с хоть сколь либо динамическим значением все-таки размещается — и вытесняет со стека размещенный там byte[]
грязный, грязный извращенец!
Ну интересно же было разобраться! А потом уж что, сидеть на этом знании как Кащей над злате? ;)
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
а мы с Лёшей сейчас это обсудим!
Конечно, реклама для лохов, но Лёшу зачем с «будущим Java» вместе поставили? Придётся, видимо, Лёшей пожертвовать в угоду будущему.
когда программа хорошая (а она хорошая!), все время кто-то интересный тебе идет параллельно с кем-то другим, тоже интересным.
Скажи лучше, есть ли слоты, в которые тебе не на что пойти?
Скажи лучше, есть ли слоты, в которые тебе не на что пойти?
На 13:50-14:40 я бы всем пожертвовал. Можно про профилирование послушать, но опционально. Скорее всего пойду в экспертную зону №1, может, там полезнее будет.
На 12:50-13:40 в принципе можно бы было всё пропустить, если б было что-то из вечерних докладов в параллели (Куксенко или Чуйко, например: оба интересны и тоже одновременно идут). Катехизис прекрасен, я не спорю, но я смотрел его на ютюбе и Алексей пишет, что будет почти то же самое. А «Сжимай меня полностью», как я понимаю, новый доклад (поправьте, если ошибаюсь), его жалко. Возможно, Фолькера послушаю. Ну или уж Алексея уважу, если места хватит :-)
И да, на 10:30-11:20 я бы тоже пропустил, если б в параллель шёл почти любой из остальных докладов :-)
На 12:50-13:40 в принципе можно бы было всё пропустить, если б было что-то из вечерних докладов в параллели (Куксенко или Чуйко, например: оба интересны и тоже одновременно идут). Катехизис прекрасен, я не спорю, но я смотрел его на ютюбе и Алексей пишет, что будет почти то же самое. А «Сжимай меня полностью», как я понимаю, новый доклад (поправьте, если ошибаюсь), его жалко. Возможно, Фолькера послушаю. Ну или уж Алексея уважу, если места хватит :-)
И да, на 10:30-11:20 я бы тоже пропустил, если б в параллель шёл почти любой из остальных докладов :-)
ты как-то очень сложно все расписал: "… я бы пропустил, если б… ". Я в итоге ничего не понял :)
легче написать на что ты хочешь пойти. Потому что по комментарию похоже, что ты готов не пойти никуда.
Ага, а деньги я печатаю, и мне ничего не стоит прилететь из Новосиба в Москву и оплатить участие ради того, чтобы пойти никуда =)
Если интересно, то вот куда я хочу в порядке убывания приоритета:
Если бы эти семь не пересекались, я был бы счастлив. Дальше так:
Твои доклады в топ-14 не попали, извиняй =)
Если интересно, то вот куда я хочу в порядке убывания приоритета:
- Круглый стол. Будущее Java-платформы
- Сжимай меня полностью
- CompletableFuture уже здесь
- Тайны — в наших головах, а не в JVM
- Где моя память, чувак?!
- Круглый стол. HighLoad
- Железные счётчики на страже производительности
Если бы эти семь не пересекались, я был бы счастлив. Дальше так:
- Лучший отладчик — сделанный своими руками
- Катехизис java.lang.String
- Packed Objects, Object Layout & Value Types — a Survey
- Непрерывное профилирование Java-приложений в ходе эксплуатации
- Выражаемся регулярно
- Круглый стол. Рефакторинги и технический долг
- Круглый стол. Рабочие инструменты Java-разработчика
Твои доклады в топ-14 не попали, извиняй =)
Ну да, я сначала тоже с циклами начал экспериментировать. Но там слишком много вариантов получается — и чтобы их грокнуть, чтобы построить какую-то вменяемую модель, нужно было лезть в дизасм или исходники JVM. А мне лень — я хотел простое объяснение для конкретного примера. Потому что общая идея что ссылка живет не до завершения метода, а насколько JVM мозгов хватит — она давно известна, как раз из дискуссий по ранней финализации, на которую Алексей ссылается. И вопрос был лишь в том, чем два отличаются от трех. И — неожиданно — оказалось, что два отличаются от трех ровно на один.
НЛО прилетело и опубликовало эту надпись здесь
Задача №2
Регулярка не учитывает контекст — например, применив ее сюда
будем немного расстроены результатом.
P.S. Вместо пробела можно использовать unicode escape типа \uXXXX, например.
String stringLiteral = " /* this is not a comment but a string literal */ ";
будем немного расстроены результатом.
P.S. Вместо пробела можно использовать unicode escape типа \uXXXX, например.
ASPECTJ адок
Скомпилируется то нормально, только при вызове count очевидно получим StackOverflow, дергаем же метод снова прямо из аспекта.
У Вас по Java только 1 задача, остальные имеют к языку лишь опосредованное отношение.
Предпоследняя задача
В java не скомпилится.
Третья о спринге
Если не хочется проставлять
Всегда можно написать свой BeanPostProcessor, который будет разруливать такие ситуации
context.setAllowBeanDefinitionOverriding(false);
Всегда можно написать свой BeanPostProcessor, который будет разруливать такие ситуации
Задача №4
Обе программы выдадут и выдают OOM в JDK 1.8.0.25 32-bit. Получается условие задачи заведомо неверное, так как автор считает, что одна из программ не выбросит OOM, хотя на практике обе бросают.
окей, тогда почему обе бросают?
Давайте считать, что для 32-битной JVM предполагается запускать её с опцией -server.
>"C:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe" -server OOM1
358862028
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at OOM1.main(OOM1.java:9)
>"C:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe" -server OOM2
228366745
228366745
228366745
I allocated memory successfully
Последняя – от Евгения Борисова
Первый вариант — заимплементить SmartLifecycle.stop(Runnable) и назначить обоим одинаковые фазы.
Второй — использовать ApplicationEventMulticaster (например, SimpleApplicationEventMulticaster) с соответствующим taskExecutor (например, ThreadPoolExecutor) и повесить обоих на ContextCloseEvent.
В теории оба варианта должны сработать)
Второй — использовать ApplicationEventMulticaster (например, SimpleApplicationEventMulticaster) с соответствующим taskExecutor (например, ThreadPoolExecutor) и повесить обоих на ContextCloseEvent.
В теории оба варианта должны сработать)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Простые задачи на Java. Слабо решить все?