Java/Типы данных
- Начало
- Hello World!
- Комментарии
- Переменные
- Стандартные структуры
- Операторы условий
- Полезные сокращения
- Операторы цикла
- Классы
- Исключения
- Коллекции
- Listeners
- GUI
- Паттерны
- Программы
- Компилирование
Примитивные типы
правитьВ Java есть 8 примитивных типов, которые делят на 4 группы, вот они:
- Целые числа - byte, short, int, long
- Числа с плавающей точкой (иначе вещественные) - float, double
- Логический - boolean
- Символьный - char
Целочисленные типы
правитьЦелочисленные типы различаются между собой только диапазонами возможных значений, например, для хранения номера элемента в таблице Менделеева пока хватит переменной типа byte.
Тип | Размер (бит) | Диапазон |
---|---|---|
byte | 8 бит | от -128 до 127 |
short | 16 бит | от -32768 до 32767 |
char | 16 бит | беззнаковое целое число, представляющее собой символ UTF-16 (буквы и цифры) |
int | 32 бит | от -2147483648 до 2147483647 |
long | 64 бит | от -9223372036854775808L до 9223372036854775807L |
Пример использования целочисленных типов:
public class IntegralTypes {
public static void main(String[] args) {
byte b = 216; // Вот тут будет ошибка, т.к. у нас диапазон от -128 до 127!
short s = 1123;
int i = 64536;
long l = 2147483648L; // Постфикс l или L обозначает литералы типа long
System.out.println(i);
System.out.println(b);
System.out.println(s);
System.out.println(l);
}
}
Символы тоже относят к целочисленным типам из-за особенностей представления в памяти и традиций.
public class Characters {
public static void main(String[] args) {
char a = 'a', b, c = 'c';
b = (char) ((a + c) / 2); // Можно складывать, вычитать, делить и умножать
// Но из-за особенностей арифметики Java результат приходится приводить к типу char явно
System.out.println(b); // Выведет символ 'b'
}
}
Типы с плавающей точкой
правитьТип | Размер (бит) | Диапазон |
---|---|---|
float | 32 | от 1.4e-45f до 3.4e+38f |
double | 64 | от 4.9e-324 до 1.7e+308 |
Пример использования:
public class FloatingPointTypes {
public static void main(String[] args) {
double a, b = 4.12;
a = 22.1 + b;
float pi = 3.14f; // При использовании типа float требуется указывать суффикс f или F
// так как без них типом литерала будет считаться double
float anotherPi = (float) 3.14; // Можно привести явно
double c = 27;
double d = pi * c;
System.out.println(d);
}
}
Логический тип
правитьТип | Размер (бит) | Значение |
---|---|---|
boolean | 8 (в массивах), 32 (не в массивах используется int) | true (истина) или false (ложь) |
В стандартной реализации Sun JVM и Oracle HotSpot JVM тип boolean занимает 4 байта (32 бита), как и тип int. Однако, в определенных версиях JVM имеются реализации, где в массиве boolean каждое значение занимает по 1-му байту.
Ссылочные
правитьСсылочные типы - это все остальные типы: классы, перечисления и интерфейсы, например, объявленные в стандартной библиотеке Java, а также массивы.
Строки
правитьСтроки это объекты класса String, они очень распространены, поэтому в некоторых случаях обрабатываются отлично от всех остальных объектов. Строковые литералы записываются в двойных кавычках.
public class Strings {
public static void main(String[] args) {
String a = "Hello", b = "World";
System.out.println(a + " " + b); // Здесь + означает объединение (конкатенацию) строк
// Пробел не вставляется автоматически
// Строки конкатенируются слева направо, надо помнить это когда соединяешь строку и примитив
String c = 2 + 2 + ""; // "4"
String d = "" + 2 + 2; // "22"
d = "" + (2 + 2); // а теперь d тоже "4"
String foo = "a string";
String bar = "a string"; // bar будет указывать на тот же объект что и foo
String baz = new String("a string"); // Чтобы гарантированно создать новую строку надо вызвать конструктор
System.out.println("foo == bar ? " + (foo == bar)); // == сравнивает ссылки на объекты
System.out.println("foo равен bar ? " + (foo.equals(bar))); // Метод equals служит для проверки двух объектов на равенство
System.out.println("foo == baz ? " + (foo == baz));
System.out.println("foo равен baz ? " + (foo.equals(baz)));
}
}
Эта программа выведет:
Hello World
foo == bar ? true
foo равен bar ? true
foo == baz ? false
foo равен baz ? true
Обертки
правитьЕсли требуется создать ссылку на один из примитивных типов данных, необходимо использовать соответствующий класс-обертку. Также в таких классах есть некоторые полезные методы и константы, например минимальное значение типа int можно узнать использовав константу Integer.MIN_VALUE. Оборачивание примитива в объект называется упаковкой (boxing), а обратный процесс распаковкой (unboxing).
Тип | Класс-обертка |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
Пример использования:
int i;
Integer boxed;
// Обычное создание объекта
boxed = new Integer(i);
// Фабричный метод
boxed = Integer.valueOf(i);
// Автоматическая упаковка, компилятор просто вставит вызов Integer.valueOf
boxed = i;
Рекомендуется использовать valueOf, он может быть быстрее и использовать меньше памяти потому что применяет кэширование, а конструктор всегда создает новый объект.
Получить примитив из объекта-обертки можно методом <имя примитивного типа>Value.
Integer boxed;
int i;
// Явная распаковка
i = boxed.intValue();
// Автоматическая распаковка
i = boxed;