Как сделать список в java

Добавил пользователь Alex
Обновлено: 04.10.2024

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

Организация работы

Чистый код

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

  • Правило 10-50-500. В одном пакете не может быть более 10 классов. Каждый метод должен быть короче 50 строк кода, а каждый класс — короче 500 строк.
  • SOLID принципы.
  • Использование паттернов проектирования.

Работа с ошибками

Stack Trace (Трассировка стека)

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

NullPointerException

Исключения, возникающие из-за null значений ( NullPointerException ), довольно часто появляются при попытке вызвать метод у несущестующего объекта.

Возьмем для примера следующий код:

Прим. перев. А вот пример от меня как переводчика материала:

Дата и Время

System.currentTimeMillis или System.nanoTime?

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

Метод System.currentTimeMillis() возвращает текущее количество миллисекунд с начала эры Unix в формате Long. Его точность составляет от 1 до 15 тысячных долей секунды в зависимости от системы.

Метод System.nanoTime() имеет точность до одной миллионной секунды (наносекунды) и возвращает текущее значение наиболее точного доступного системного таймера.

Таким образом, метод System.currentTimeMillis() лучше применять для отображения и синхронизации абсолютного времени, а System.nanoTime() для измерения относительных интервалов времени.

Валидация Даты из строки

Если необходимо достать объект Date из обычной строки в Java, можете использовать небольшой утилитный класс, который приведен ниже. Он позаботится обо всех сложностях валидации и преобразовании строки в объект Date .

Пример его использования:

Строки

Оптимизация строки

Необходимо избегать создания Java строк через конструктор, пример:

Одинарные и двойные кавычки

Что ты ожидаешь в результате выполнения этого кода?

Двойные кавычки обрабатывают символы как строки, но одинарные кавычки ведут себя иначе. Они преобразуют символьные операнды ( 'H' и 'a' ) в целые значения посредством расширения примитивных типов — получается 169.

Математика

Float или Double?

Программисты часто не могут выбрать необходимую точность для чисел с плавающей запятой. Float требует всего 4 байта, но имеет только 7 значащих цифр, а Double в два раза точнее (15 цифр), но в два раза прожорливее.

Фактически, большинство процессоров могут одинаково эффективно работать как с Float, так и с Double, поэтому воспользуйтесь рекомендацией Бьорна Страуструпа (автор языка С++):

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

Проверка на нечетность

Можно ли использовать этот код для точного определения нечетного числа?

Надеюсь, вы заметили хитрость. Если мы решим таким образом проверить отрицательное нечетное число (например, -5), остаток от деления не будет равен единице, поэтому воспользуйтесь более точным методом:

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

Возведение в степень

Возвести число в степень можно двумя способами:

  1. простое умножение;
  2. используя метод Math.pow() (двойное основание, двойной показатель степени).

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

Простое умножение в Java работает в 300-600 раз эффективнее, кроме того, его можно дополнительно оптимизировать:

JIT оптимизация

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

В качестве примера рассмотрим две простые операции:

Давайте измерим время выполнения каждого из них:

Запустив этот код несколько раз, мы получим примерно следующее:

Схема очевидна: группировка переменных в круглые скобки ускоряет работу программы. Это связано с генерацией более эффективного байт-кода при умножении одинаковых значений.

Вы можете узнать больше об этом эксперименте здесь. Или можете провести свой собственный тест, используя онлайн-компилятор Java.

Java ArrayList

Программирование и разработка

Java ArrayList

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

Благодаря длинному списку преимуществ у ArrayLists есть приложения во множестве случаев. Однако важная операция, которая не встроена в ArrayLists, — это печать. Списки ArrayLists могут состоять из стандартных примитивных типов данных (например, целых чисел и строк) или из более сложных типов данных, таких как настраиваемые классы. В каждом из этих случаев для печати списка ArrayList требуются разные шаги.

В этой статье мы рассмотрим три основных способа печати ArrayList в Java, охватывающие два типа ArrayList, которые мы обсуждали выше. Без лишних слов, приступим!

Java ArrayList: три способа

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

Это три основных способа распечатать список ArrayList в Java:

  • Использование цикла for.
  • Использование команды println.
  • А также использование ToString () реализация.

Метод 1. Использование цикла for

Цикл for — это один из простейших способов перебора списка или массива. Этот метод хорошо работает как с простыми массивами, так и со списками ArrayList, поскольку итерация по всем элементам по одному позволяет обрабатывать каждый из них соответствующим образом.

Этот метод помогает вам определить конкретные реализации для каждого элемента. Ниже приводится синтаксис цикла for:

Теперь давайте рассмотрим некоторые из распространённых способов использования цикла for для обхода массива объектов:

Примеры

Вы можете использовать цикл for, чтобы просто распечатать все элементы ArrayList:

Чтобы поднять этот уровень, вы можете определить конкретные случаи для каждого элемента на основе любых условий:

Когда использовать этот метод

Цикл for лучше всего подходит для ситуаций, когда у вас относительно более короткий набор элементов, а их типы не сильно различаются. Если у вас есть список из 20 элементов, которые являются целыми числами (int) или строками, цикл for — это то, что вам нужно. Если у вас есть список из более чем 100 элементов, которые могут быть строковыми, int, логическими или чем-либо ещё, цикл for будет слишком громоздким для использования.

Метод 2: использование команды println

printlnКоманда может быть использована непосредственно в случае ArrayLists, сделанный с помощью примитивных типов данных. Примитивные типы данных в Java включают строки, целые числа, числа с плавающей запятой, длинные, двойные и логические. Если список состоит из данных, не соответствующих этим типам, его нельзя распечатать с помощью этого метода.

Синтаксис этого метода прост:

System.out.println(arr);
// Assuming arr is an ArrayList object

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

println Примеры

Если вы пытаетесь напечатать простой целочисленный ArrayList, вот как вы это сделаете:

Если вы пытаетесь напечатать разнородный ArrayList, это тоже сработает:

Когда использовать этот метод

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

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

Метод 3: реализация метода toString ()

Этот метод лишён недостатков предыдущего. Причина, по которой непримитивные объекты не могут быть напечатаны на выходе напрямую, заключается в том, что компилятор не знает, как их распечатать. Метод toString () позволяет указать компилятору, как выводить объекты класса в командную строку.

Возьмём класс Foo из последнего примера:

Чтобы сделать это удобным для печати, вам нужно переопределить и определить метод toString () в определении класса:

Теперь, если вы попытаетесь создать экземпляр Foo:

Вы получите результат, который вы определили ранее:

Это небольшое исправление можно сочетать с методом println, чтобы легко и быстро распечатать все виды ArrayLists.

toString () Примеры

Возьмём последний пример из метода 2 и сделаем его удобным для печати:

Единственное изменение, которое вам здесь нужно сделать, — это добавить определение toString () в класс Foo:

Когда использовать этот метод

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

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

Вывод

Печать Java ArrayList — непростая задача. Чем динамичнее содержимое ArrayList, тем сложнее вывести список на стандартный вывод. Команда printlnподходит для большинства случаев, но вам также может потребоваться toString()переопределение для выполнения работы.

В этой статье мы рассмотрели три способа печати ArrayList. Мы рассмотрели их синтаксис, примеры и ситуации, для которых они подходят лучше всего.е всего.

Создание и инициализация List, ArrayList или LinkedList в одну строку очень похожи на создание массива и его инициализацию сразу же при создании. Прежде чем перейти к примеру, следует сказать, что это также является популярным вопросом на технической части собеседования, так как имеет и свои недостатки. И так, как же создать и инициализировать ArrayList в одной строке.

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

У вас есть вопрос, связанный с созданием списка объектов в классе Java. Может ли кто-нибудь сказать мне, какое решение лучше? Плюсы и минусы этого?

1) Моя первая версия класса:

Буду благодарен за каждое объяснение.

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

  • Разделение ответственности. ProductRepositoryImpl должен нести ответственность за работу с хранилищем продуктов. Он не несет ответственности и не должен иметь код для создания Продуктов. На строительство продукции должен входить Продукт
  • Повторное использование кода. Версия 1 лучше версии 2, поскольку код для построения продукта записывается один раз, внутри addProducts() , а не несколько раз, как в версии 2.
  • Инкапсуляция. Интерфейс класса является единственной частью, которая должна быть общедоступной. Реализация должна быть скрыта. Это означает, что поле id продукта не должно быть напрямую подключено снаружи, но вместо этого должно быть доступно через методы интерфейса. Преимущество состоит в том, что, если вам потом нужно изменить, как внутренне работают идентификаторы, вы можете сделать это легко, потому что все идентификаторы приходят и уходят от нескольких методов в классе Product. Если поле id является общедоступным, то могут быть сотни мест, к которым он обращается, и обращение с таким изменением было бы кошмаром.

Другая проблема - изменчивость. Класс Product изменен, что подразумевает метод setName. Если это абсолютное требование вашего приложения, продолжайте. Но если продукт не меняется после его определения, вы должны скорее сделать продукт inmutable. Интенсивность имеет несколько преимуществ, одна из которых заключается в том, что она является потокобезопасной без необходимости синхронизации. Таким образом, я сделал продукт inmutable.

Учитывая эти направляющие линии, это подход, который я бы взял:

Первый вариант означает Factory и обычно рекомендуется.

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

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

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

Также, как было отмечено в комментариях, addProducts действительно должен стать addProduct , поскольку он добавляет только один элемент.

Читайте также: