Логические операции

Понимание операторов в Java

В JavaScript существует семь логических операторов:

  • || (ИЛИ)
  • ||= (Оператор логического присваивания ИЛИ)
  • && (И)
  • &&= (Оператор логического присваивания И)
  • ! (НЕ)
  • ?? (Оператор нулевого слияния)
  • ??= (Оператор нулевого присваивания)

Мы рассмотрим первые пять из них, операторы ?? и ??= будут рассмотрены в следующей статье.

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

Что такое Java

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

По данным рейтинга State of Octoverse 2022, Java входит в тройку самых популярных языков программирования, опережая такие языки, как PHP, C#, C++, TypeScript и другие, и уступая лишь JavaScript и Python. В индексе TIOBE на июль 2023 года Java занимает четвертое место.

Немного о истории языка: Java была разработана компанией Sun Microsystems в начале 90-х годов XX века. Главную роль в создании языка сыграл канадский инженер Джеймс Гослинг. В начале своего развития язык назывался Oak, но затем был переименован в Java в честь сорта кофе и оставшейся чашки в логотипе.

Java была задумана для программирования бытовой электроники, но уже после выпуска версии 1.0 в 1995 году начала применяться разработчиками серверного и клиентского ПО. В 2010 году компанию Sun Microsystems приобрела Oracle, а Джеймс Гослинг в итоге перешел в Google.

Разгадываем тайну загадочного программиста

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

![Разгадываем тайну загадочного программиста](https://itproger.com/img/tasks/x1709879560.jpg.pagespeed.ic.8SI7JiXb8b.jpg Разгадываем тайну загадочного программиста)

Задача по языку C#: Игра Крестики Нолики в консоли

![Задача по языку C#: Игра Крестики Нолики в консоли](https://itproger.com/img/tasks/x1706855485.jpg.pagespeed.ic.OP-IwZOsXI.jpg Задача по языку C#: Игра Крестики Нолики в консоли)

Рассмотрим интересную задачу по разработке игры Крестики Нолики на языке C#. Наш проект будет запускаться в консоли и потребует креативное мышление для решения задачи.


Задача по языку C++: Ловушка Лабиринта

![Задача по языку C++: Ловушка Лабиринта](https://itproger.com/img/tasks/x1706345741.jpg.pagespeed.ic.Il37jbBpSN.jpg Задача по языку C++: Ловушка Лабиринта)

В мире программирования, решение задач на логику и применение эффективных алгоритмов – это ключ к созданию надежных программ. Рассмотрим задачу и решение на языке программирования C++.


Логика и Эффективные Алгоритмы / Задача на языке Java

![Логика и Эффективные Алгоритмы / Задача на языке Java](https://itproger.com/img/tasks/x1705052959.jpg.pagespeed.ic.VUtwzwc5Kc.jpg Логика и Эффективные Алгоритмы / Задача на языке Java)

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


логические задачи по программированию

![3 логические задачи по программированию](https://itproger.com/img/tasks/x1703923072.jpg.pagespeed.ic.F4RNral6oO.jpg 3 логические задачи по программированию)

Собеседования по программированию часто включают в себя логические задачи, которые оценивают способность к решению проблем и креативное мышление кандидата.


Решаем классические задачки на логику с собеседований

![Решаем классические задачки на логику с собеседований](https://itproger.com/img/tasks/x1702111753.jpg.pagespeed.ic.Ftv-4OpeK5.jpg Решаем классические задачки на логику с собеседований)

Время немного размять мозг! Мы выбрали 3 частовстречающихся на собеседованиях задачи на логику и смекалку. Возможно они попадутся именно вам.


логико-математические задачи со звездочкой

![3 логико-математические задачи со звездочкой](https://itproger.com/img/tasks/x1690385032.jpg.pagespeed.ic.rbJabGor3h.jpg 3 логико-математические задачи со звездочкой)

Нет, это не высший level, но подумать над решением все же придется. Попробуйте решить немного запутанные задачки без подсматривания в ответы.


Решаем задачку про бракованные батарейки

![Решаем задачку про бракованные батарейки](https://itproger.com/img/tasks/x1687618427.jpg.pagespeed.ic.neV0apluY2.jpg Решаем задачку про бракованные батарейки)

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

Как угадать число от 0 до 100 или математический фокус

Как угадать число от 0 до 100 или математический фокус

Интересный математический фокус, который только на первый взгляд может показаться сложным, но на самом деле это не так!

8.1K 26 января 2023 в 14:51

Логическое И (&&)

Логический оператор И (&&) (конъюнкция) для набора операндов со значением типа Boolean будет true только в случае, если все операнды содержат значение true. В противном случае это будет false.

В целом, оператор вернёт значение первого ложноподобного операнда при вычислении, либо значение последнего операнда, если все операнды оказались истиноподобными.

Интерактивный пример

Синтаксис

Описание

Логическое И (&&) вычисляет операнды слева направо, возвращая сразу значение первого попавшего ложноподобного операнда; если все значения истиноподобны, возвращается значение последнего операнда.

Если значение может быть преобразовано в true, то оно рассматривается как истиноподобное (truthy). Если же значение может быть преобразовано в false, то оно называется ложноподобным (falsy).

Примеры выражений, которые могут быть преобразованы в false:

  • false;
  • null;
  • NaN;
  • пустая строка (, , ``);
  • undefined.

Оператор И возвращает небулевы значения как есть:

result // result is assigned (empty string)
result // result is assigned 0
result // result is assigned 4

Несмотря на то, что оператор && может использоваться с операндами, не содержащими логических значений, он всё равно останется булевым оператором, поскольку его возвращаемое значение всегда можно преобразовать в булевый примитив. Чтобы явно преобразовать возвращаемое значение этого оператора (или вообще любое выражение) в соответствующее значение булевого типа, используйте двойной оператор НЕ или конструктор Boolean (en-US).

Сокращённое вычисление

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

В качестве примера рассмотрим следующий псевдокод:

(ложноподобное выражение) && следующее выражение

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

consoleвызвана функция A
consoleвызвана функция B
console

В результате вызова функции A, в консоли будет выведено вызвана функция A, а оператор && вычислится как false (функция A возвращает false), поэтому далее в консоли появится false.

Как результат, оператор <code>&amp;&amp;</code> остановит вычисления и проигнорирует функцию В.

& неоценим при битовой манипуляции. При работе с бинарными данными его использование становится неизбежным:

int flagSet = 0b1010;
int mask = 0b1001;
int result = flagSet & mask; // Результат: 0b1000

При использовании битовых операций — будь то проверка флагов или маскировка — & становится неотъемлемым помощником.

Внимание: логические подводные камни

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

if (methodWithSideEffect1() & methodWithSideEffect2()) { ... }

При использовании &&, если метод methodWithSideEffect1() возвращает false, вызов methodWithSideEffect2() не происходит, что может быть противоречиво изначальным намерениям. Поэтому понимание контекста играет ключевую роль.

Визуализация

Представим работу наших операторов:

🚦 & (Побитовое И): Каждая единица оценивается, результат зависит от всех участников. Авто 1: „Еду!“ 🚗💨 Авто 2: „Еду следом!“ 🚕💨

🚦 && (Логическое И): Оценка второй единицы зависит от первой. Авто 1: „Вперёд!“ 🚗💨 Авто 2: „Если авто 1 поехало, то и я за ним!“ 🚕🔍🚗💨

& работает независимо, в то время как && вовлечён в "командную игру", где "один за всех".

Исследование типов данных

Работа с целыми числами и булевыми значениями с помощью &

& готов встретиться и с целыми, и с булевыми значениями:

boolean bothTrue = true & false; // Результат: false
int mixedBitwise = 0xFF00 & 0x00FF; // Результат: 0x0000

Это путешествие в мир битов с целочисленными значениями и "вечеринка" для булевых переменных.

Оптимизация логических операций с &&

&& способен преобразовать любое логическое выражение в высокоэффективный код:

for (ComplexObject item : collection) { if (item.isAvailable() && item.matchesCriteria(...)) { // Повышение производительности в качестве побочного эффекта }
}

Это может выражать собой значительное ускорение выполнения, особенно если matchesCriteria() является ресурсоёмким методом.

Завершение

Точный и эффективный код

Выбор между & и && зависит от конкретной ситуации. Они предлагают разные стратегии для достижения максимальной эффективности и аккуратности кода.

Читаемый код без компромиссов

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

Полезные материалы

  1. Операторы (Учебные материалы по Java™) — Официальная документация Oracle по операторам в Java.

  2. В чем разница между & и && в Java? – Stack Overflow — Обсуждение разницы между & и && на Stack Overflow.

  3. Побитовый оператор в Java – Javatpoint — Детальное сравнение побитового и логического И.

  4. Java67 — Разъяснение разного поведения побитовых и логических операторов в Java.

  5. Understanding Java Operators – DZone — Обсуждение вопроса операторов в Java, включая & и &&.

  6. Educative: Интерактивные курсы для разработчиков программного обеспечения — Углубленное изучение операторов в Java.

! (НЕ)

Оператор НЕ представлен восклицательным знаком !.

Синтаксис довольно прост:

Оператор принимает один аргумент и выполняет следующие действия:

  1. Сначала приводит аргумент к логическому типу true/false.

  2. Затем возвращает противоположное значение.

alert( !true ); // false
alert( !0 ); // true

В частности, двойное НЕ !! используют для преобразования значений к логическому типу:

alert( !!"непустая строка" ); // true
alert( !!null ); // false

То есть первое НЕ преобразует значение в логическое значение и возвращает обратное, а второе НЕ снова инвертирует его. В конце мы имеем простое преобразование значения в логическое.

Есть немного более подробный способ сделать то же самое – встроенная функция Boolean:

alert( Boolean("непустая строка") ); // true
alert( Boolean(null) ); // false

Задачи на логику с ответами

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

Нюансы работы различных операторов

Логические операции

Логические операции

Логические операции


Сферы применения Java

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

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

Серверные приложения

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

Веб-приложения

Фреймворки Spring, Struts, и другие позволяют писать на Java веб-приложения: от ecommerce-проектов до крупных порталов, от образовательных платформ до правительственных ресурсов.

Мобильные приложения

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

Игры

Это скорее, исключение, чем правило, но несколько популярных компьютерных игр — например, Minecraft и God of Wars, — написаны на Java.

Еще на Java пишут код для клиентских приложений (например, — IDE NetBeans), разрабатывают программы для научных целей, например, обработки естественных языков, программируют приборы — от бытовых девайсов до промышленных установок.

Булева логика

В языке Java нельзя записать выражение 18 < age < 65 — оно будет синтаксически некорректным и программа не скомпилируется.

Зато можно записать его так:

Разумеется, вместо слова “ там будет другой , и сейчас мы как раз поговорим о них подробнее.

В Java есть три логических оператора: AND (и), OR (или) и NOT (не).

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

разработчики Java решили вместо слов and, or и not, использовать обозначения из .

Внимание на экран:

| Логический оператор | Ожидание | Реальность |

| ——————- | ——– | ———- |

| | and | | |

| | or | | |

| | not | | |

Вот несколько примеров использования логических операторов в Java:

| Выражение | Расшифровка | Пояснение |

| —————— | —————— | —————— |

| (0 < a) (a < 100) | (0 < a) (a < 100) | (0 < a) (a < 100) |

| (a) (b) | ( a) ( b) | ( a) ( b) |

| (a b) | (( a) ( b)) | (( a) ( b)) |



Булевы операции

() || () || ()

Если равно `true`, нет смысла вычислять и “: результат все равно будет true.

Поэтому при вычислении выражений (а они вычисляются по порядку слева направо), как только мы получили true, вычисление остальных выражений пропускается. И если в выражениях и были вызовы каких-нибудь функций, то эти функции не вызываются!

То же самое и для логического оператора &&:

() && () && ()

Если равно `false`, нет смысла вычислять и “: результат все равно будет false.

Это важный момент, который позволяет писать вещи вида:

String s = null;
if (s != null s.length() > 0) {

В примере выше мы никогда не получим , т.к. выражение s.length() будет выполняться только если первая часть s != null равна true.

Если s окажется равно null, слева от оператора && будет значение false, и результат всего логического выражения будет false, поэтому вычисления второй части (s.length() > 0) не происходит.

Вот это все к чему:



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

Операторы в Java тоже имеют приоритет. Только: а) их несколько больше, б) у некоторых операторов действия выполняются слева направо, а у других — справа налево.

Вот как выглядит таблица со всеми операторами Java:

| Категория | Оператор | Ассоциативность |

| ————————- | ————————————– | ————— |

| Постфикс | () [] . | Слева направо |

| Унарный | ++ — ! ~ | |

| Мультипликативный | * / % | Слева направо |

| Аддитивный | + – | Слева направо |

| Сдвиг | >> >>> << | Слева направо |

| Реляционный | > >= < <= | Слева направо |

| Равенство | == != | Слева направо |

| Побитовое И (AND) | & | Слева направо |

| Исключающее ИЛИ (XOR) | ^ | Слева направо |

| Побитовое ИЛИ (OR) | | | Слева направо |

| Логическое И (AND) | && | Слева направо |

| Логическое ИЛИ (OR) | || | Слева направо |

| Условный | ?: | |

| Присваивание | = += -= *= /= %= >>= <<= &= ^= |= | |

| Запятая | , | Слева направо |

Чем ниже операторы расположены в таблице, тем ниже их приоритет.

Если вы используете несколько операторов в вашем выражении, не ленитесь: ставьте скобки.

Да, в Java можно написать что-то типа if (a & 1<<b > ~c), но так делать не стоит. Вы пишете код не только для компилятора, но и для других программистов. Чем код читабельнее, тем лучше.



&&= (Логическое присваивание И)

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

Оператор логического присваивания И &&= записывается как два амперсанда && и символ присваивания =.

Вот его синтаксис:

Концепция оператора логического присваивания И &&= также основывается на «сокращённом вычислении»:

let greeting = "Привет"; // строка непустая, поэтому будет преобразована к логическому значению true оператором &&=
greeting &&= greeting + ", пользователь!"; // то же самое, что true && (greeting = greeting + "...")
alert( greeting ) // "Привет, пользователь!"
let greeting = "Привет";
if (greeting) { greeting = greeting + ", пользователь!"
}
alert( greeting ) // "Привет, пользователь!"

Сколько зарабатывают Java-разработчики

В начале июля 2023 года на рекрутинговом сервисе hh.ru было опубликовано примерно 4300 вакансий Java-разработчиков в России. Около половины из них — от компаний в сфере IT и финансовых услуг. Почти 3000 работодателей предлагают работу в офисе, чуть более 1000 — удаленную работу.

Зарплата junior Java-разработчиков начинается от 30 тыс. рублей и достигает 160 тыс. рублей. Middle разработчики получают от 120 до 300 тыс. рублей. Senior Java-программисты могут претендовать на зарплату от 150 до 450 тыс. рублей.

По данным исследования сервиса «Хабр Карьеры», средняя зарплата Java-разработчиков во втором полугодии 2022 года в России составила 175 000 рублей.

Сравнение Java с другими языками

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

Java и Python

  • Синтаксис Python более прост и понятен, что делает его более доступным для новичков. Синтаксис Java более строгий и требует больше внимания к деталям.

  • Java считается более производительным языком, чем Python благодаря компиляции в байт-код на JVM. Python является интерпретируемым языком, что делает его менее эффективным в некоторых сценариях разработки.

  • Java предоставляет более низкоуровневые инструменты для работы с многопоточностью, что позволяет эффективно использовать несколько потоков выполнения. Python имеет более простую модель потоков и ограничения на использование нескольких ядер процессора.

  • У Java есть обширная экосистема инструментов и библиотек, разработанных для широкого спектра приложений. Python также обладает богатой экосистемой, особенно в области анализа данных и машинного обучения, благодаря таким библиотекам, как NumPy, Pandas и TensorFlow.

Java и C/C++

Джеймс Гослинг и его единомышленники хотели создать язык с C-подобным синтаксисом. В то же время он должен быть более простым по сравнению с C/C++. Вот его некоторые особенности:

  • C/C++ обычно считаются более производительными языками, так как они предоставляют больше возможностей для оптимизации и более прямой доступ к аппаратуре компьютера. Java, в свою очередь, имеет некоторую накладную нагрузку из-за виртуальной машины и автоматического управления памятью, что может приводить к небольшому снижению производительности.

  • Код на Java часто используется для разработки настольных и мобильных приложений, серверных приложений и больших корпоративных систем. C/C++ широко применяются в системном программировании, разработке операционных систем, драйверов, встроенных системах и игровой индустрии.

Java и C Sharp

  • Синтаксис Java и C# имеет сходства, так как оба языка основаны на синтаксисе языка программирования C. Однако C# иногда считается более простым и интуитивно понятным.

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

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

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

Java и JavaScript

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

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

  • Синтаксис Java и JavaScript отличается. Java имеет синтаксис, основанный на классах и объектно-ориентированном подходе, в то время как JavaScript имеет более гибкий синтаксис и используется для функционального программирования и манипуляции событиями на веб-странице.

Особенности языка программирования Java

  • Широкое распространение старых версий языка. Популярность Java в enterprise-сегменте означает, что большинство компаний используют не самые последние версии языка. Чаще всего речь идет о Java 8, хотя последняя версия на июль 2023 года — Java 20.

  • Сравнительно высокий уровень входа. Java предполагает совершенно иной подход к разработке, чем JavaScript, Python, PHP и другие. Если в большинстве языков понимание ООП можно получать постепенно, то в Java концепции нужно будет использовать едва ли не сразу. С другой стороны, рынок устроен так, что многие начинающие программисты выбирают Java первым языком программирования.

  • Многословный и сложный код. Java — средний уровень между C++, где все свои действия нужно описывать словами из английского языка, и лаконичными языками программирования. В Java часто встречаются длинные предложения, которые помогают при обучении, но сильно затрудняют чтение и понимание кода.

&& (И)

Оператор И пишется как два амперсанда &&:

В традиционном программировании И возвращает true, если оба аргумента истинны, а иначе – false:

alert( true && true ); // true
alert( false && true ); // false
alert( true && false ); // false
alert( false && false ); // false

Пример с if:

let hour = 12;
let minute = 30;
if (hour == 12 && minute == 30) { alert( 'Время 12:30' );
}

Как и в случае с ИЛИ, любое значение допускается в качестве операнда И:

if (1 && 0) { // вычисляется как true && false alert( "не сработает, так как результат ложный" );
}

И «&&» находит первое ложное значение

При нескольких подряд операторах И:

result = value1 && value2 && value3;

Оператор && выполняет следующие действия:

  • Вычисляет операнды слева направо.

  • Каждый операнд преобразует в логическое значение. Если результат false, останавливается и возвращает исходное значение этого операнда.

  • Если все операнды были истинными, возвращается последний.

Другими словами, И возвращает первое ложное значение. Или последнее, если ничего не найдено.

Вышеуказанные правила схожи с поведением ИЛИ. Разница в том, что И возвращает первое ложное значение, а ИЛИ – первое истинное.

// Если первый операнд истинный,
// И возвращает второй:
alert( 1 && 0 ); // 0
alert( 1 && 5 ); // 5
// Если первый операнд ложный,
// И возвращает его. Второй операнд игнорируется
alert( null && 5 ); // null
alert( 0 && "какая-то строка" ); // 0

Можно передать несколько значений подряд. В таком случае возвратится первое «ложное» значение, на котором остановились вычисления.

alert( 1 && 2 && null && 3 ); // null

Когда все значения верны, возвращается последнее

alert( 1 && 2 && 3 ); // 3

Иногда люди используют оператор И && как «более короткий способ записи if-выражения».

let x = 1;
(x > 0) && alert( 'x больше нуля!' );

Инструкция в правой части && будет выполнена только в том случае, если вычисление дойдет до нее. То есть, только если (x > 0) истинно.

Таким образом, мы имеем аналог для следующего кода:

let x = 1;
if (x > 0) alert( 'x больше нуля!' );

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

Может ли новичок изучить Java и как ему это сделать

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

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

Префиксный и постфиксный инкремент

Как вы уже знаете, в Java есть оператор инкремента (++) и оператор декремента (--), которые увеличивают (и уменьшают) значение переменной на 1.

Чего вы скорее всего не знаете, так это того, что есть два вида этих операций: префиксные – оператор ставится до переменной, и постфиксные — оператор ставится после переменной. И работают эти операторы немного по-разному.

В Java можно написать такое выражение:

Если оператор ++ стоит после переменной и переменная участвует в каком-то выражении (как в примере выше), то в выражении будет использовано текущее значение переменной, а только потом она будет увеличена на 1.

Другими словами, произойдет примерно это:

int = 5;
int = ; = + 1;

Т.е. “ будет иметь значение 5, а не 6, как это могло показаться вначале.

Если же оператор ++ стоит до переменной и переменная участвует в каком-то выражении, она сначала будет увеличена на 1, а только затем ее значение будет участвовать в выражении.

int = 5;
int = ++;

Пример выше эквивалентен следующему примеру:

int = 5; = + 1;
int = ;

Вот тут уже значение “ будет равно 6.

Есть даже один пример, который используется Java-программистами, чтобы определить, что их собеседник тоже Java-программист:

int = 5;
int = + ;

Да, так тоже можно писать.

Этот пример отлично скомпилируется и превратится примерно в это:

int = 5; = + 1;
int = ; = + 1;
int = ;
int = + ;

Для оператора -- все точно то же самое.



Логические операции

Логические операции

||= (Логическое присваивание ИЛИ)

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

Вот его синтаксис:

  • Вычисляет операнды слева направо.

  • Конвертирует a в логическое значение.

  • Если a ложно, присваивает a значение b.

let johnHasCar = false;
johnHasCar ||= "У Джона нет машины!"; // то же самое, что false || (johnHasCar = "...")
alert( johnHasCar ); // "У Джона нет машины!"
let manufacturer = ""; // оператор ||= преобразует пустую строку "" к логическому значению false
manufacturer ||= "Неизвестный производитель"; // то же самое, что false || (manufacturer = "...")
alert( manufacturer ); // "Неизвестный производитель"

Мы можем переписать приведённые выше примеры с использованием обычного if:

let johnHasCar = false;
if (johnHasCar == false) { johnHasCar = "У Джона нет машины!";
}
alert(johnHasCar); // "У Джона нет машины!"
let manufacturer = "";
if (manufacturer == false) { manufacturer = "Неизвестный производитель";
}
alert(manufacturer); // "Неизвестный производитель"

Что почитать и посмотреть по Java

Есть несколько классных книг по Java, которые стоит прочитать начинающим Java-разработчикам:

Помимо чтения этих книг, советуем пройти бесплатный курс в Хекслете по основам Java:

Свойства Java

Переносимость

Создатели реализовали принцип WORA: write once, run anywhere или «пиши один раз, запускай везде». Это значит, что написанное на Java приложение можно запустить на любой платформе, если на ней установлена среда исполнения Java (JRE, Java Runtime Environment).

Объектно-ориентированный подход

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

Безопасность

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

Автоматическое управление памятью

В Java реализован механизм управления памятью, который называется сборщиком мусора или garbage collector. Разработчик создает объекты, а JRE с помощью сборщика мусора очищает память, когда объекты перестают использоваться. Это упрощает жизнь разработчиков, так как им не нужно самостоятельно управлять памятью и избегать утечек.

Большая библиотека

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

Многопоточность

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

Логическая арифметика

Вкратце пройдемся по логическим операциям.

Оператор AND, он же И, он же &&, он же .

| Выражение | Результат |

| ——— | ——— |

| && | |

| && | |

| && | |

| && | |

Другими словами, результат выражения равен true (истина) только если оба значения, которые участвуют в выражении, равны true (истина). В остальных случаях всегда false (ложь).

| Выражение | Результат |

| ——— | ——— |

| || | |

| || | |

| || | |

| || | |

Другими словами, результат выражения равен true (истина) всегда, если хотя бы одно значение, участвующее в выражении, равно true (истина). Если оба равны false, то результат false.

Оператор NOT, он же НЕ, он же !, он же .

| Выражение | Результат |

| ——— | ——— |

| ! | |

| ! | |

Меняет true на false и наоборот.

| Выражение | Результат |

| ———- | ——— |

| m && !m | |

| m || !m | |

| !(a && b) | !a || !b |

| !(a || b) | !a && !b |



Логические операции

Логические операции

|| (ИЛИ)

Оператор «ИЛИ» выглядит как двойной символ вертикальной черты:

Традиционно в программировании ИЛИ предназначено только для манипулирования булевыми значениями: в случае, если какой-либо из аргументов true, он вернёт true, в противоположной ситуации возвращается false.

В JavaScript, как мы увидим далее, этот оператор работает несколько иным образом. Но давайте сперва посмотрим, что происходит с булевыми значениями.

Существует всего четыре возможные логические комбинации:

alert( true || true ); // true
alert( false || true ); // true
alert( true || false ); // true
alert( false || false ); // false

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

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

Например, число 1 будет воспринято как true, а 0 – как false:

if (1 || 0) { // работает как if( true || false ) alert( 'истинно!' );
}
let hour = 9;
if (hour < 10 || hour > 18) { alert( 'Офис закрыт.' );
}

Можно передать и больше условий:

let hour = 12;
let isWeekend = true;
if (hour < 10 || hour > 18 || isWeekend) { alert( 'Офис закрыт.' ); // это выходной
}

ИЛИ "||" находит первое истинное значение

Описанная выше логика соответствует традиционной. Теперь давайте поработаем с «дополнительными» возможностями JavaScript.

Расширенный алгоритм работает следующим образом.

result = value1 || value2 || value3;
  • Вычисляет операнды слева направо.

  • Каждый операнд конвертирует в логическое значение. Если результат true, останавливается и возвращает исходное значение этого операнда.

  • Если все операнды являются ложными (false), возвращает последний из них.

Значение возвращается в исходном виде, без преобразования.

alert( 1 || 0 ); // 1 (1 - истинное значение)
alert( true || 'какая-то строка' ); // true
alert( null || 1 ); // 1 (первое истинное значение)
alert( null || 0 || 1 ); // 1 (первое истинное значение)
alert( undefined || null || 0 ); // 0 (поскольку все ложно, возвращается последнее значение)

Это делает возможным более интересное применение оператора по сравнению с «чистым, традиционным, только булевым ИЛИ».

  1. Получение первого истинного значения из списка переменных или выражений.

Например, у нас есть переменные firstName, lastName и nickName, все они необязательные (т.е. они могут быть неопределенными или иметь ложные значения).

let firstName = "";
let lastName = "";
let nickName = "Суперкодер";
alert( firstName || lastName || nickName || "Аноним"); // Суперкодер 

Если бы все переменные были ложными, в качестве результата мы бы наблюдали "Аноним".

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

В приведенном ниже примере срабатывает только второй alert:

true || alert("никогда не сработает");
false || alert("сработает"); 

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

Палиндромы в Списке

Допустим, у нас есть связанный список, и наша задача – определить, является ли он палиндромом. Палиндром – это последовательность, которая читается одинаково вперед и назад.

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

Примеры использования операторов сравнения и булевых переменных

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

| Код | Пояснение |

| —————————————————————————————————- | ———————————————————————————————————— |

| int = ; if (>= && <= ) System.out.println("Вы можете работать"); | Если значение age лежит между 18 и 65, на экран выводится текст «вы можете работать». |

| int = ; boolean = (< ); if (! && <= ) System.out.println("Вы можете работать"); | Мы создали переменную isYoung и вынесли в нее первую часть выражения. Только заменили age >= 18 на age < 18. |

| int = boolean = ( < ); boolean = ( > ); if (! && !) System.out.println("Вы можете работать"); | Мы создали переменную isOld и вынесли в нее вторую часть выражения. При этом заменили age <= 65 на age > 65. |

Эти три примера эквивалентны. Только во втором мы вынесли часть выражения из условия if в отдельную логическую переменную – isYoung. В третьем примере мы вынесли вторую часть выражения во вторую переменную — isOld.



Решение к задаче

Давайте создадим Java-программу, чтобы решить эту увлекательную задачу.

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

public class PalindromeLinkedList {	static class ListNode {	int val;	ListNode next;	ListNode(int val) {	this.val = val;	}	}	public static boolean isPalindrome(ListNode head) {	if (head == null || head.next == null)	return true;	// Найти середину списка с использованием "быстрого" и "медленного" указателей	ListNode slow = head, fast = head;	while (fast != null && fast.next != null) {	slow = slow.next;	fast = fast.next.next;	}	// Реверсировать вторую половину списка	ListNode secondHalf = reverseList(slow);	// Сравнить первую половину с реверсированной второй половиной	while (secondHalf != null) {	if (head.val != secondHalf.val)	return false;	head = head.next;	secondHalf = secondHalf.next;	}	return true;	}	private static ListNode reverseList(ListNode head) {	ListNode prev = null;	while (head != null) {	ListNode next = head.next;	head.next = prev;	prev = head;	head = next;	}	return prev;	}	public static void main(String[] args) {	// Пример использования:	ListNode list = new ListNode(1);	list.next = new ListNode(2);	list.next.next = new ListNode(3);	list.next.next.next = new ListNode(2);	list.next.next.next.next = new ListNode(1);	System.out.println(isPalindrome(list)); // Вывод: true	}
}

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

Больше интересных новостей

Минусы Java

  • Производительность. Несмотря на то, что Java обеспечивает безопасность и переносимость, некоторые разработчики считают, что он может быть медленнее по сравнению с некоторыми другими языками, такими как C++ или C#. Это может быть проблемой в некоторых случаях, когда требуется максимальная производительность или низкая задержка.

  • Потребление памяти. Приложения на Java могут потреблять больше оперативной памяти по сравнению с некоторыми другими языками программирования. Это связано с автоматическим управлением памятью и использованием виртуальной машины Java.

  • Зависимость от JVM. Поскольку Java работает на виртуальной машине Java (JVM), приложения требуют наличия JVM для выполнения. Это может создавать проблемы, если необходимость в установке и поддержке JVM на целевых устройствах или серверах является преградой.

Плюсы Java

  • Большое глобальное сообщество. По данным компании Oracle, которая владеет и поддерживает язык, на Java пишут 12 млн разработчиков по всему миру и примерно 5 млн студентов.

  • Безопасность. Язык сам по себе не делает код безопаснее, но в нем есть инструменты, которые позволяют защитить этот код. Например, в нем отсутствуют указатели и есть Security Manager, который позволяет настроить доступ к каждому приложению.

  • Востребованность. Спрос на Java-разработчиков в enterprise-сегменте очень велик, а зарплаты достаточные высокие. Кроме того, зарубежные компании активно набирают Java-разработчиков из России.

Понравилась статья? Поделиться с друзьями:
ТВОЙ ВК