Создание своих функций, передача параметров
Содержание:
- 4 Передача ссылок в методы
- Что такое Java?
- 2 Алгебраические функции в Java
- 2 Оператор new
- 2 Статические vs Обычные методы
- Вызываем функции без параметров
- 3 Класс Character
- 2 Аргументы метода
- 5 Методы с одинаковыми именами
- Условные конструкции
- 4 Минимум и максимум из нескольких чисел
- Класс Object и его методы
- 1 Функции/Методы в Java
- Решение распространенных проблем
- Методы на Java
- 2 Класс Double
- Структуры данных
4 Передача ссылок в методы
Надеюсь, вы поняли все из предыдущей лекции, потому что сейчас мы снова затронем передачу аргументов в методы, только еще глубже.
Как вы уже знаете, некоторые переменные в Java хранят не сами значения, а адрес (ссылку) блока памяти, где эти значения находятся. Так, например работают переменные-строки или переменные-массивы.
Когда вы присваиваете переменной-массиву другую переменную-массив, что происходит? Правильно. Две переменные начинают ссылаться на один и тот же контейнер в памяти:
А что произойдет, если одна из этих переменных будет переменной-параметром метода?
Код | Пояснение |
---|---|
Метод считает сумму чисел переданного массива и выводит ее на экран |
Произойдет ровно то же самое: переменная-параметр будет содержать ссылку на тот же контейнер, что и переменная . При вызове метода просто произойдет присваивание .
А раз обе переменные ссылаются на один и тот же контейнер целых чисел, то метод может не просто читать значения из массива, но и менять их!
Например, мы можем написать свой собственный метод, который заполняет двумерный массив одинаковыми значениями. Вот как он мог бы выглядеть:
Код | Пояснение |
---|---|
Метод проходится по всем ячейкам переданного двумерного массива и присваивает им значение . Создаем двумерный массив. Заполняем весь массив числом . |
Что такое Java?
Java-это объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems в 1990-х годах (позже купленной Oracle).
Понятие «объектно-ориентированный» относится к способу написания структурного кода Java, а именно: разделение кода на так называемые «классы», которые запускаются вместе, чтобы обеспечить согласованное порождение объектов. Мы обсудим это позже, но достаточно сказать, что это приводит к универсальному и организованному коду, который легко редактировать и перепрофилировать.
Java находится под влиянием C и C++, поэтому она имеет много общего с этими языками (и C#). Одним из больших преимуществ Java является то, что он «платформенно-независимый». Это означает, что код, который вы пишете на одной платформе, можно легко запустить на другой. Это называется принципом «пишем один раз, запускаем где угодно» (хотя на практике это не всегда так просто, как кажется).
Чтобы запустить и использовать Java, вам нужно три вещи:
- JDK – Java Development Kit
- JRE – Java Runtime Environment
- JVM – Java Virtual Machine
Виртуальная машина Java (JVM) гарантирует, что у ваших приложений Java есть доступ к минимальным ресурсам, необходимым для их запуска. Именно благодаря JVM программы Java так легко запускаются на разных платформах.
Вебинар Java, Containers and IntelliJ IDEA
17 декабря в 18:00, Онлайн, Беcплатно
tproger.ru
События и курсы на tproger.ru
Среда исполнения Java (JRE) предоставляет собой «контейнер» для всех этих элементов и кода для запуска приложения. JDK – это «компилятор», который интерпретирует сам код и выполняет его. В JDK также есть инструменты разработчика, необходимые для написания кода Java (как и следует из названия).
Хорошая новость заключается в том, что разработчикам нужно только позаботиться о загрузке JDK, поскольку он поставляется вместе с двумя другими компонентами.
2 Алгебраические функции в Java
В большинстве случаев программисту с головой хватает школьной математики: даже синусы и косинусы в коде можно встретить очень редко. Чаще всего они нужны при работе с играми, картами или игровыми движками. 90% программистов с этим никогда не сталкиваются.
Но, кроме геометрии, программистам иногда приходится использовать и алгебраические функции. И, конечно же, класс содержит самые распространенные из них:
Метод | Описание |
---|---|
квадратный корень из | |
кубический корень из | |
возведение в степень: | |
экспонента: | |
натуральный логарифм : | |
десятичный логарифм : | |
натуральный логарифм : | |
Если вам нужен квадратный или кубический корень из числа, для этого есть функции и .
Корень из двух можно вычислить так:
Если вы хотите получить корень более высокой степени, воспользуйтесь функцией возведения в степень: в степени — это и будет корень четвертой степени, и т.д.
Для работы с логарифмами и экспонентами есть функции – натуральный логарифм и — экспонента. Для вычисления десятичного логарифма есть функция .
Если вам нужен логарифм числа по основанию , воспользуйтесь простой формулой:
Полезные функции
Последние две функции и могут быть вам полезны, если вы проводите вычисления при очень маленьких значениях .
При сложении очень маленьких и очень больших переменных часто может возникнуть ситуация, когда очень маленькое значение просто игнорируется (отбрасывается) как незначащее. Это, собственно, и будет происходить, если использовать функции и . Поэтому программисты придумали функции, которые возвращают только ту самую «маленькую значащую часть»
Пример:
Вы хотите посчитать натуральный логарифм от , где равен . Вы просто не сможете передать это число в функцию , т.к. если сложить и , получится . — настолько маленькое число, что будет отброшено полностью при сложении чисел.
А т.к. в математике часто приходится вычислять при числах, близких к , программисты придумали способ обойти эту проблему: передать в функцию не само число, а только его отличие от .
2 Оператор new
Чтобы создать объект определенного класса, нужно воспользоваться оператором . Вот как выглядит создание объекта в общем случае:
Где — это имя класса для объявления и имя класса создаваемого объекта. Переменная — это переменная, в которую сохраняется ссылка на созданный объект. А — это параметры метода создания объекта.
Какие именно могут быть параметры у объекта, решают программисты, которые пишут класс объекта.
Вы уже создавали объекты ранее, и даже пользовались именно этой конструкцией. Надеюсь, вы не забыли?
— это создание переменной типа . — это создание объекта типа . Ну а оператор присваивания заносит в переменную ссылку на новый созданный объект.
Во второй строке мы вызываем метод у объекта с помощью переменной , которая хранит ссылку на объект типа .
Примеры создания объектов:
Код | Описание |
---|---|
Создает объект типа | |
Создает объект типа | |
Создает объект типа : контейнер на элементов типа |
Созданные объекты называют объектом класса или экземпляром класса, а класс — классом объекта. Например: переменная хранит ссылку на экземпляр класса .
2 Статические vs Обычные методы
Чем же отличаются статические методы от обычных?
Обычный метод имеет привязку к объекту — экземпляру класса, статический же метод такой привязки не имеет. Обычный метод может обращаться к переменным в своем экземпляре класса, статический — нет: у него просто нет никакого экземпляра класса, связанного с ним.
Отличия двух типов методов можно выразить в таблице:
Способность | Обычный метод | Статический метод |
---|---|---|
Есть связь с экземпляром класса | Да | Нет |
Может вызывать обычные методы класса | Да | Нет |
Может вызывать статические методы класса | Да | Да |
Может обращаться к обычным переменным класса | Да | Нет |
Может обращаться к статическим переменным класса | Да | Да |
Может быть вызван у объекта | Да | Да |
Может быть вызван у класса | Нет | Да |
Зачем такие методы нужны, если они так сильно ограничены? Все дело в том, что у такого подхода тоже есть свои преимущества.
Во-первых, чтобы обратиться к статическим методам и переменным, не надо передавать никакую ссылку на объект.
Во-вторых, иногда бывает нужно, чтобы переменная была в единственном экземпляре. Как, например, переменная (статическая переменная out класса System).
И, в-третьих, иногда нужно вызвать метод еще до того, как будет возможность создавать какие-то объекты. Например, вызов метода main(), с которого начинается выполнение программы: его вызывает Java-машина до создания экземпляра класса.
Есть связь с экземпляром класса
При вызове обычного метода в него передается скрытый параметр — объект, у которого его вызывали. Этот параметр имеет имя . Именно этот скрытый параметр — ссылка на объект, у которого вызвали метод — и отличает обычные методы от статических.
У статических методов такого скрытого параметра нет, поэтому внутри статических методов нельзя пользоваться ключевым словом , и из статического метода нельзя вызвать нестатический: ссылку на экземпляр класса попросту неоткуда взять.
Может вызывать обычные методы класса
В обычном методе класса всегда есть скрытый параметр — — ссылка на объект класса, у которого был вызван метод. Каждый раз, когда вы вызываете обычный метод внутри другого обычного метода, для этого вызова используется скрытый параметр . Пример
Код | Как оно работает |
---|---|
Именно поэтому нельзя вызвать обычный метод из статического. Внутри статического метода просто нет скрытой переменной с именем .
Ну или представьте другой случай: в программе еще не создан ни один объект нашего класса. Статический метод класса можно вызвать? Да. А сможет этот статический метод вызвать обычный метод?
И у какого объекта он его вызовет? Ведь еще не существует ни одного экземпляра нашего класса!
Может вызывать статические методы класса
Статические методы можно вызывать откуда угодно — из любого места программы. А значит, их можно вызывать и из статических методов, и из обычных. Никаких ограничений тут нет.
Может обращаться к обычным переменным класса
Из обычного метода можно обращаться к обычным переменным класса, т.к. при этом произойдет обращение к переменным экземпляра класса, который легко получить из скрытого параметра .
Статический метод не знает, из какого экземпляра класса ему брать значения обычных переменных. У нас вообще легко может быть ситуация, когда статический метод вызван, а ни одного экземпляра класса еще создано в программе не было.
Поэтому статические методы не могут обращаться к обычным переменным класса.
Статический метод вызывает обычный метод, вот только у какого объекта он должен вызваться?
Неизвестно! Поэтому и нельзя вызывать обычный метод из статического, не указывая ссылку на объект!
Может обращаться к статическим переменным класса
Ситуация с обращением к статическим переменным такая же, как и с обращениями к статическим методам. К статическим переменным можно обращаться из любого места в программе. А значит, можно обращаться из статических и обычных методов.
Может быть вызван у объекта
И статические, и обычные методы можно вызывать у объекта. Обычный метод можно, потому что только у объекта его вызвать и можно. Статический метод тоже можно вызывать у объекта: при этом компилятор сам определит тип переменной и вызовет статический метод по ее типу:
Код | Как его видит компилятор |
---|---|
Может быть вызван у класса
У класса можно вызвать только статический метод, для вызова обычного метода нужна ссылка на экземпляр класса. Поэтому нельзя вызвать обычный метод конструкцией вида
Вызываем функции без параметров
Чтобы работать с функциями, получая от них какой-либо результат, надо вызвать функцию в нужном месте по имени.
Давайте воспользуемся написанными нами функциями и вызовем их в основном коде.
public class Main { public static int function1(){ int a = 5; return a; } public static void function2(){ System.out.println("Записывайтесь на курсы OTUS!"); } public static void main(String[] args) { //основной блок программы int b = function1(); //присваиваем переменной значение, которое возвратит первая функция System.out.println(b); //выводим на экран значение нашей переменной function2(); //вызываем по имени вторую функцию } }
Вывод будет следующим:
5 Записывайтесь на курсы OTUS!
Следует добавить, что функция, которая что-либо возвращает, обязательно должна вызываться так, как указано в примере, то есть возвращаемое значение должно быть чему-то присвоено.
3 Класс Character
Класс в первую очередь интересен большим количеством утилитных статических методов, которые позволяют проверять символы на принадлежность разным категориям.
Примеры
Методы | Описание |
---|---|
Проверяет, является ли символ символом алфавита | |
Является ли символ буквой | |
Является ли символ цифрой | |
Является ли символ пробелом, символом переноса строки или смены параграфа (коды: 12, 13, 14) | |
Является ли символ разделителем: пробел, tab, и т.д. | |
Символ в нижнем регистре — строчные буквы? | |
Символ в верхнем регистре — заглавные буквы? | |
Преобразует символ в нижний регистр | |
Преобразует символ в верхний регистр |
Особенностью данных методов является то, что они работают со всеми известными алфавитами: символы арабских цифр будут определяться как цифры и т.п.
2 Аргументы метода
Еще немного вашего внимания хочу обратить на вызов метода с параметрами.
Те значения, которые передаются в метод, при его вызове принято называть аргументами метода.
Давайте еще раз разберем пример:
Код | Пояснение |
---|---|
Объявили метод с параметрами:, Метод выводит на экран раз строку Вызываем метод с параметрами |
Когда метод вызвался в первый раз, его переменным-параметрам были присвоены такие значения: .
Когда метод вызвался во второй раз, его переменным-параметрам были присвоены другие значения: .
Параметры метода — это именно переменные, которым присваиваются определенные значения при вызове метода. Сами же значения , , и называются аргументами метода.
5 Методы с одинаковыми именами
А теперь еще раз вернемся к именам методов.
Стандарты Java требуют, чтобы у всех методов внутри одного класса были уникальные имена. Т.е. невозможно объявить в одном классе два одинаковых метода.
Только вот при сравнении методов на одинаковость учитываются не только имена, но и типы параметров! Причем имена переменных-параметров не учитываются. Примеры:
Код | Пояснение |
---|---|
Эти три метода считаются разными. Их можно объявить в одном классе. | |
Все эти пять методов считаются разными. Их можно объявить в одном классе. | |
Эти два метода считаются одинаковыми (их нельзя объявить в одном классе). |
Почему же одни методы считаются одинаковыми, а другие — разными? И почему не учитываются имена переменных-параметров при определении уникальности метода?
Зачем вообще нужна уникальность? Все дело в том, что когда компилятор компилирует вашу программу, он должен точно знать, какую именно функцию/метод вы вызываете в определенном месте.
Например вы пишете Компилятор умный, и он легко сделает вывод, что тут вызывается метод с параметром типа .
А если вы напишете , компилятор увидит тут вызов метода с параметром типа .
Компилятор следит, чтобы при вызове метода типы аргументов и параметров совпадали, а на имя аргумента не обращает никакого внимания. В Java имена переменных-параметров никак не помогают компилятору определить вызываемый метод. Поэтому и не учитываются при определении уникальности метода.
Имя метода и типы его параметров называются сигнатурой метода. Пример:
Каждый класс должен иметь не методы с уникальными именами, а методы с уникальными сигнатурами.
Условные конструкции
Последнее обновление: 17.04.2018
Одним из фундаментальных элементов многих языков программирования являются условные конструкции. Данные конструкции
позволяют направить работу программы по одному из путей в зависимости от определенных условий.
В языке Java используются следующие условные конструкции: и
Конструкция if/else
Выражение if/else проверяет истинность некоторого условия и в зависимости от результатов проверки выполняет определенный код:
int num1 = 6; int num2 = 4; if(num1>num2){ System.out.println("Первое число больше второго"); }
После ключевого слова ставится условие. И если это условие выполняется, то срабатывает код, который помещен в далее в
блоке if после фигурных скобок. В качестве условий выступает операция сравнения двух чисел.
Так как, в данном случае первое число больше второго, то выражение истинно и возвращает значение
. Следовательно, управление переходит в блок кода после фигурных скобок и начинает выполнять содержащиеся там инструкции, а
конкретно метод . Если бы первое число оказалось бы меньше второго или равно ему, то инструкции в блоке if не выполнялись бы.
Но что, если мы захотим, чтобы при несоблюдении условия также выполнялись какие-либо действия? В этом случае мы можем добавить блок :
int num1 = 6; int num2 = 4; if(num1>num2){ System.out.println("Первое число больше второго"); } else{ System.out.println("Первое число меньше второго"); }
Но при сравнении чисел мы можем насчитать три состояния: первое число больше второго, первое число меньше второго и числа равны.
С помощью выражения , мы можем обрабатывать дополнительные условия:
int num1 = 6; int num2 = 8; if(num1>num2){ System.out.println("Первое число больше второго"); } else if(num1<num2){ System.out.println("Первое число меньше второго"); } else{ System.out.println("Числа равны"); }
Также мы можем соединить сразу несколько условий, используя логические операторы:
int num1 = 8; int num2 = 6; if(num1 > num2 && num1>7){ System.out.println("Первое число больше второго и больше 7"); }
Здесь блок if будет выполняться, если равно и одновременно равно .
Конструкция switch
Конструкция switch/case аналогична конструкции , так как позволяет обработать сразу несколько условий:
int num = 8; switch(num){ case 1: System.out.println("число равно 1"); break; case 8: System.out.println("число равно 8"); num++; break; case 9: System.out.println("число равно 9"); break; default: System.out.println("число не равно 1, 8, 9"); }
После ключевого слова switch в скобках идет сравниваемое выражение. Значение этого выражения последовательно сравнивается со значениями, помещенными после операторов
сase. И если совпадение найдено, то будет выполняет соответствующий блок сase.
В конце блока сase ставится оператор break, чтобы избежать выполнения других блоков. Например, если бы убрали оператор в следующем случае:
case 8: System.out.println("число равно 8"); num++; case 9: System.out.println("число равно 9"); break;
то выполнился бы блок , (поскольку переменная num равна 8). Но так как в этом блоке оператор break отсутствует, то начал бы выполняться блок .
Если мы хотим также обработать ситуацию, когда совпадения не будет найдено, то можно добавить блок default,
как в примере выше. Хотя блок default необязателен.
Также мы можем определить одно действие сразу для нескольких блоков case подряд:
int num = 3; int output = 0; switch(num){ case 1: output = 3; break; case 2: case 3: case 4: output = 6; break; case 5: output = 12; break; default: output = 24; } System.out.println(output);
Тернарная операция
Тернарную операция имеет следующий синтаксис: .
Таким образом, в этой операции участвуют сразу три операнда.
В зависимости от условия тернарная операция возвращает второй или третий операнд: если условие равно , то
возвращается второй операнд; если условие равно , то третий. Например:
int x=3; int y=2; int z = x<y? (x+y) : (x-y); System.out.println(z);
Здесь результатом тернарной операции является переменная z. Сначала проверяется условие .
И если оно соблюдается, то z будет равно второму операнду — (x+y), иначе z будет равно третьему операнду.
НазадВперед
4 Минимум и максимум из нескольких чисел
Есть еще одно полезное применение функций и .
Это вычисление минимума (или максимума) из нескольких чисел или переменных. Функции очень удобно вызывать друг в друге.
Вот как можно записать минимум из 3-х чисел:
А что? Очень удобно: вычисляем минимум пары чисел, а затем возвращаем меньшее число из найденного и оставшегося.
Минимум из четырех чисел получается аналогично:
Хотя можно эту формулу записать немного понятнее:
Для функции все аналогично.
Использование оператора или тернарного оператора сделало бы эти записи немного более громоздкими. А использование функций и — просто идеальное решение.
Класс Object и его методы
Последнее обновление: 21.04.2018
Хотя мы можем создать обычный класс, который не является наследником, но фактически все классы наследуются от класса Object.
Все остальные классы, даже те, которые мы добавляем в свой проект, являются неявно производными от класса Object.
Поэтому все типы и классы могут реализовать те методы, которые определены в классе Object. Рассмотрим эти методы.
toString
Метод служит для получения представления данного объекта в виде строки. При попытке вывести строковое представления
какого-нибудь объекта, как правило, будет выводиться полное имя класса. Например:
public class Program{ public static void main(String[] args) { Person tom = new Person("Tom"); System.out.println(tom.toString()); // Будет выводить что-то наподобие Person@7960847b } } class Person { private String name; public Person(String name){ this.name=name; } }
Полученное мной значение (в данном случае ) вряд ли может служить хорошим строковым описанием объекта.
Поэтому метод нередко переопределяют. Например:
public class Program{ public static void main(String[] args) { Person tom = new Person("Tom"); System.out.println(tom.toString()); // Person Tom } } class Person { private String name; public Person(String name){ this.name=name; } @Override public String toString(){ return "Person " + name; } }
Метод hashCode
Метод hashCode позволяет задать некоторое числовое значение, которое будет соответствовать данному объекту или его хэш-код.
По данному числу, например, можно сравнивать объекты.
Например, выведем представление вышеопределенного объекта:
Person tom = new Person("Tom"); System.out.println(tom.hashCode()); // 2036368507
Но мы можем задать свой алгоритм определения хэш-кода объекта:
class Person { private String name; public Person(String name){ this.name=name; } @Override public int hashCode(){ return 10 * name.hashCode() + 20456; } }
Получение типа объекта и метод getClass
Метод позволяет получить тип данного объекта:
Person tom = new Person("Tom"); System.out.println(tom.getClass()); // class Person
Метод equals
Метод equals сравнивает два объекта на равенство:
public class Program{ public static void main(String[] args) { Person tom = new Person("Tom"); Person bob = new Person("Bob"); System.out.println(tom.equals(bob)); // false Person tom2 = new Person("Tom"); System.out.println(tom.equals(tom2)); // true } } class Person { private String name; public Person(String name){ this.name=name; } @Override public boolean equals(Object obj){ if (!(obj instanceof Person)) return false; Person p = (Person)obj; return this.name.equals(p.name); } }
Метод equals принимает в качестве параметра объект любого типа, который мы затем приводим к текущему, если они являются объектами
одного класса.
Оператор instanceof позволяет выяснить, является ли переданный в качестве параметра объект объектом определенного класса,
в данном случае класса Person. Если объекты принадлежат к разным классам, то их сравнение не имеет смысла, и возвращается значение false.
Затем сравниваем по именам. Если они совпадают, возвращаем true, что будет говорить, что объекты равны.
НазадВперед
1 Функции/Методы в Java
Вы уже выучили большое количество команд в Java, и это значит, что вы можете писать достаточно сложные программы. 10, 20, 30 строк кода в программе — не такая и большая программа, верно?
А вот программа в 100+ строк — уже большая, и разбираться в ее коде довольно сложно. Можно ли как-то упростить написание и чтение программ с большим количеством кода?
Да, и помогут нам в этом методы (функции).
Что же такое метод? Ну, если очень сильно упростить, то метод — это группа команд, у которой есть уникальное имя. Другими словами, мы просто компонуем несколько команд в одну группу и даем ей уникальное имя. И все — метод готов.
Пример:
Без метода | С методом |
---|---|
В программе в левой колонке у нас три раза повторяется один и тот же код — мы так специально сделали для примера. А в программе справа мы вынесли повторяющийся код в отдельный метод и дали ему уникальное имя — .
И вместо вынесенного кода 3 раза написали вызов метода .
Когда программа в колонке справа будет исполняться, каждый раз при выполнении команды она будет выполнять все команды внутри метода . Мы просто создали новую команду (метод), объединив в одну группу несколько команд.
Любой код можно разбить на отдельные методы. Это делают для упрощения: считается, что лучше иметь много маленьких методов, чем один большой. Скоро вы будете удивляться тому, что раньше писали свои программы, но не писали свои методы.
Решение распространенных проблем
Содержимое директории
Java позволяет вам получать имена всех подкаталогов и файлов в папке в виде массива, который затем можно последовательно прочитать:
Выполнение консольных команд
Java позволяет выполнять консольные команды прямо из кода, используя класс
Очень важно не забывать об обработке исключений
Например, давайте попробуем открыть файл PDF через терминал Java (на Linux’e):
Воспроизведение звуков
Звук — важный компонент многих десктопных приложений и игр. Язык программирования Java предоставляет средства для работы с ним.
Отправка email
Отправить электронную почту на Java очень просто. Вам просто нужно установить Java Mail и указать путь к нему в пути к классам проекта.
Получение координат курсора
Чтобы фиксировать события мыши, вам необходимо реализовать интерфейс . Когда курсор попадает в определенную область, срабатывает обработчик события , из которого вы можете получить точные координаты (используя Swing для UI)
Методы на Java
Еще одна простая концепция, которую мы можем ввести в этом руководстве Java – это использование методов. Это даст вам немного больше понимания того, как структурирован Java-код и что с ним можно сделать.
Все, что мы собираемся сделать, – это взять часть кода, который мы уже написали, а затем поместить его в другой метод вне метода :
Мы создали новый метод в строке, которая начинается со . Это означает, что метод определяет функцию, а не свойство объекта, и что он не возвращает никаких данных.
Но все, что мы вставляем в следующий блок кода, теперь будет выполняться каждый раз, когда мы «вызываем» метод, записывая его имя в нашем коде: . Затем программа выполнит этот блок кода и вернется к точке, из которой она вышла.
Если бы мы написали вызов несколько раз, то сообщение «Special user priveleges granted» также отобразилось бы несколько раз. Именно это делает методы такими фундаментальными основами Java: они позволяют выполнять повторяющиеся задачи, не записывая код снова и снова.
2 Класс Double
Класс , в общем-то, аналогичен классу , только является оберткой не для типа , а для типа . У него тоже есть интересные нам поля и методы, рассмотрим некоторые из них:
Интересных полей у класса шесть:
Поле | Описание |
---|---|
Минус бесконечность | |
Плюс бесконечность | |
Минимальное значение экспоненты (2x) | |
Максимальное значение экспоненты (2x) | |
Минимальное значение типа | |
Максимальное значение типа |
Бесконечность
Если вы разделите на , получите отрицательную бесконечность, если на — положительную бесконечность. Тип может не только делить на ноль, но и хранить такие значения.
Экспонента числа
С экспонентой тоже все просто. Число double внутри состоит из мантисы и экспоненты. Только вот значение экспоненты — это не , а . Если экспонента вырастет на , итоговое значение числа станет больше в два раза.
, в итоге получаем примерно равно
Также у класса есть интересные методы:
Методы | Описание |
---|---|
Возвращает строку — шестнадцатеричное представление числа | |
Проверяет, является ли переданное число бесконечностью. | |
Проверяет, является ли переданное число | |
Оборачивает переданный в | |
Возвращает число, полученное из строки |
Из интересного можно отметить наличие метода , который возвращает , если переданное в него число было плюс или минус бесконечность.
Аналогично работает и метод — проверяет, является ли переданное в него число : специальная константа, обозначающая неопределенность (Not a Number, Не число).
Структуры данных
Комбинирование хеш-таблиц
Комбинирование двух хеш-таблиц вручную через цикл очень неэффективно. Вот альтернативное решение этой проблемы, которое вам возможно понравится:
Array или ArrayList?
Выбор между и зависит от специфики задачи Java, которую вы хотите решить. Запомните следующие особенности этих типов:
- Массив имеет фиксированный размер, и память для него выделяется во время объявления, а размер может динамически меняться.
- Массивы Java работают намного быстрее, а в намного проще добавлять и удалять элементы.
- При работе с скорее всего возникнет ошибка .
- может быть только одномерным, когда массивы Java могут быть многомерными.