Java/Типы данных: различия между версиями

Содержимое удалено Содержимое добавлено
Вандализм
Строка 8:
# Логический - <tt>boolean</tt>
 
=== Целочисленные типы ===
=
 
Целочисленные типы различаются между собой только диапазонами возможных значений, например, для хранения номера элемента в таблице Менделеева пока хватит переменной типа <tt>byte</tt>.
{| class="wikitable"
|-
! Тип !! Размер (бит) !! Диапазон
|-
| <tt>byte</tt> || 8 бит || от -128 до 127
|-
| <tt>short</tt> || 16 бит || от -32768 до 32767
|-
| <tt>char</tt> || 16 бит || беззнаковое целое число, представляющее собой символ UTF-16 (буквы и цифры)
|-
| <tt>int</tt> || 32 бит || от -2147483648 до 2147483647
|-
| <tt>long</tt> || 64 бит || от -9223372036854775808 до 9223372036854775807
|}
 
Пример использования целочисленных типов:
<source lang="java">
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);
}
}
</source>
 
Символы тоже относят к целочисленным типам из-за особенностей представления в памяти и традиций.
<source lang="java">
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'
}
}
</source>
 
=== Типы с плавающей точкой ===
Строка 49 ⟶ 93 :
Ссылочные типы - это все остальные типы: классы, перечисления и интерфейсы, например, объявленные в стандартной библиотеке Java, а также массивы.
 
=== Строки ===
=
Строки это объекты класса <tt>String</tt>, они очень распространены, поэтому в некоторых случаях обрабатываются отлично от всех остальных объектов. Строковые литералы записываются в двойных кавычках.
<source lang="java">
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)));
}
}
</source>
Эта программа выведет:<br>
<tt>
Hello World<br>
foo == bar ? true<br>
foo равен bar ? true<br>
foo == baz ? false<br>
foo равен baz ? true<br>
</tt>
 
=== Обертки ===
Если требуется создать ссылку на один из примитивных типов данных, необходимо использовать соответствующий класс-обертку. Также в таких классах есть некоторые полезные методы и константы, например минимальное значение типа <tt>int</tt> можно узнать использовав константу <tt>Integer.MIN_VALUE</tt>. Оборачивание примитива в объект называется упаковкой (boxing), а обратный процесс распаковкой (unboxing).
{| class="wikitable"
|-
! Тип !! Класс-обертка
|-
| <tt>byte</tt> || <tt>Byte</tt>
|-
| <tt>short</tt> || <tt>Short</tt>
|-
| <tt>int</tt> || <tt>Integer</tt>
|-
| <tt>long</tt> || <tt>Long</tt>
|-
| <tt>char</tt> || <tt>Character</tt>
|-
| <tt>float</tt> || <tt>Float</tt>
|-
| <tt>double</tt> || <tt>Double</tt>
|-
| <tt>boolean</tt> || <tt>Boolean</tt>
|-
|}
Пример использования:
<source lang="java">
int i;
Integer boxed;
// Обычное создание объекта
boxed = new Integer(i);
// Фабричный метод
boxed = Integer.valueOf(i);
// Автоматическая упаковка, компилятор просто вставит вызов Integer.valueOf
boxed = i;
</source>
Рекомендуется использовать <tt>valueOf</tt>, он может быть быстрее и использовать меньше памяти потому что применяет кэширование, а конструктор всегда создает новый объект.
 
Получить примитив из объекта-обертки можно методом <tt><имя примитивного типа>Value</tt>.
<source lang="java">
Integer boxed;
int i;
// Явная распаковка
i = boxed.intValue();
// Автоматическая распаковка
i = boxed;
</source>
 
{{BookCat}}