Примитивные типы

править

В Java есть 8 примитивных типов, которые делят на 4 группы, вот они:

  1. Целые числа - byte, short, int, long
  2. Числа с плавающей точкой (иначе вещественные) - float, double
  3. Логический - boolean
  4. Символьный - 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;