Вот что вы можете узнать, задав непонятные вопросы о Java

Какие проблемы возникают при создании вредоносного ПО? Чем плохи скриптлеты? Почему в HashMap разрешены null?

Вот чему вас могут научить запутанные вопросы о Java.

· How to create malware?
· How to use scriptlets?
· Should I use a recursive binary search?
· What’s wrong with null in a HashMap?
· Takeaway

Как создать вредоносное ПО?

Вы знаете, как создать вредоносное ПО для Java? Вредоносное ПО, например, тратя впустую ресурсы SSD. Сделать пользовательский опыт настолько плохим, насколько это возможно. Превратите пользователей в ад.

Каковы основные проблемы разработки вредоносных программ? Вам нужно скрыть использование памяти. Создание файлов должно быть эффективным. Вам необходимо предотвратить утечку памяти. Управление памятью - основная проблема.

Как эффективно и рационально расходовать память клиента? Используйте Thread, чтобы начать создание нескольких файлов. С какой проблемой многопоточности вы можете столкнуться?

Thread орудия Runnable. Начать исполнение можно двумя способами.

  • Начало темы
  • Runnable # run

Используйте start(). Почему? Использование start() позволяет запланировать выполнение задачи, а run() выполняется сразу же. Использование start() создает новый поток и вызывает run() в этом новом потоке. Это помогает избежать утечек памяти и нежелательных сбоев.

Вы разобрались, как создавать темы. Теперь вам нужно тратить память клиента.

Вам нужно лететь под радаром. Вам нужно тратить память как можно эффективнее. Как можно заполнить память и тратить ресурсы?

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

Используйте байты для создания файлов. Объедините это с MappedByteBuffer, чтобы избежать выделения постоянной памяти. MappedByteBuffer - это неблокирующая структура ввода-вывода, которая помогает с распределением памяти. Вот как это сделать эффективно:

Эти советы следует использовать для предотвращения вредоносного ПО. Эти советы предназначены только для образовательных целей!

Как использовать скриптлеты?

Как бы вы загрузили файл с помощью JSP? Не используйте Java в JSP.

Вы не можете отлаживать Java в JSP. Отладка возможна, но сложна. Что еще плохого в сценариях Java?

  1. Вы не можете повторно использовать код; код встроен в JSP
  2. Вы не можете применять принципы объектно-ориентированного программирования; нельзя применять композицию или наследование
  3. Java и разметка смешаны вместе - сложно поддерживать

Стоит ли использовать рекурсивный двоичный поиск?

Как бы вы создали эффективный двоичный поиск? Вы бы использовали итеративный или рекурсивный подход?

Вам нужно следить за размером стека вызовов. Итеративное решение не вызовет переполнения стека. Рекурсивное решение могло вызвать один.

Небольшие коллекции не вызывают переполнения стека. Для больших коллекций могут возникнуть ошибки переполнения стека. Если размер стека вызовов превышает 1 МБ, вы получите ошибку переполнения стека. Вы можете настроить размер стека. Вот параметр конфигурации JVM:

java -Xss1048576 // sets the stack size to 1MB; which is the default

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

Что не так с null в HashMap?

Почему в HashMap может быть только один нулевой ключ? Из-за уникальных ключей. У вас не может быть двух уникальных нулевых ключей.

Что еще не так с null ключом? Зачем вам использовать null? Каковы варианты использования null ключа?

Вот несколько вариантов использования:

  • представлять конечный узел с нулевым ключом; терминал древовидной структуры
  • представляют отсутствующий ключ; вернуть нулевое значение, когда ключ отсутствует

Использование null в HashMap - плохой стиль кода. Вы всегда можете использовать альтернативы. Вы можете создавать постоянные ключи: TERMINAL_KEY, MISSING_KEY, DEFAULT_KEY. Избегайте пустого значения, так как это может вызвать путаницу.

Как лучше всего решить проблему отсутствия ключа? Optional. Обозначьте отсутствующий ключ с помощью Optional.

if(!map.containsKey(missingKey))
{ return Optional.empty(); }
// rather than
if(!map.containsKey(missingKey))
{ return map.get(null);}

Использование null в качестве ключа или значения в ConcurrentHashMap невозможно. Почему? Вы можете запросить ключ X. Другие потоки могут удалить значение для этого ключа. Вы получите недопустимое значение. ConcurrentHashMap запрещает нули для обеспечения безопасности потоков.

Основная причина заключается в том, что если map.get(key) возвращает null, вы не можете определить, отображается ли ключ явно в null или нет. В не-параллельной карте это можно проверить с помощью map.contains(key), но в параллельной карта могла измениться между вызовами. - источник

Забрать

Мы все запутались, разработчики. Мы хотим задать вопросы, но не знаем как. Так родились эти вопросы.

Что можно вынести из этой статьи?

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

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

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