Одной из первых вещей, о которых узнают многие новички в Java, являются базовые примитивные типы данных Java, их фиксированные (не зависящие от платформы) размеры (измеряемые в битах или байтах в виде дополнения к двум ) и их диапазоны (все числовые типы в Java подписаны ). Есть много хороших онлайн-ресурсов, в которых перечислены эти характеристики, и некоторые из этих ресурсов — это урок по обучению Java по примитивным типам данных , восемь типов данных Java , примитивные типы данных Java и базовые типы данных Java.
Java позволяет программно получить доступ к этим характеристикам базовых типов данных примитивов Java. Максимальные значения и минимальные значения большинства типов данных в течение некоторого времени были доступны в Java через соответствующие поля справочных типов MAX_VALUE и MIN_VALUE . J2SE 5 ввел поле SIZE для большинства типов, которое предоставляет размер каждого типа в битах (дополнение к двум). JDK 8 теперь предоставил большинству этих классов новое поле с именем BYTES, которое представляет размер типа в байтах (дополнение к двум).
DataTypeSizes.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
package dustin.examples.jdk8;import static java.lang.System.out;import java.lang.reflect.Field;/** * Demonstrate JDK 8's easy programmatic access to size of basic Java datatypes. * * @author Dustin */public class DataTypeSizes{ /** * Print values of certain fields (assumed to be constant) for provided class. * The fields that are printed are SIZE, BYTES, MIN_VALUE, and MAX_VALUE. * * @param clazz Class which may have static fields SIZE, BYTES, MIN_VALUE, * and/or MAX_VALUE whose values will be written to standard output. */ private static void printDataTypeDetails(final Class clazz) { out.println("\nDatatype (Class): " + clazz.getCanonicalName() + ":"); final Field[] fields = clazz.getDeclaredFields(); for (final Field field : fields) { final String fieldName = field.getName(); try { switch (fieldName) { case "SIZE" : // generally introduced with 1.5 (twos complement) out.println("\tSize (in bits): " + field.get(null)); break; case "BYTES" : // generally introduced with 1.8 (twos complement) out.println("\tSize (in bytes): " + field.get(null)); break; case "MIN_VALUE" : out.println("\tMinimum Value: " + field.get(null)); break; case "MAX_VALUE" : out.println("\tMaximum Value: " + field.get(null)); break; default : break; } } catch (IllegalAccessException illegalAccess) { out.println("ERROR: Unable to reflect on field " + fieldName); } } } /** * Demonstrate JDK 8's ability to easily programmatically access the size of * basic Java data types. * * @param arguments Command-line arguments: none expected. */ public static void main(final String[] arguments) { printDataTypeDetails(Byte.class); printDataTypeDetails(Short.class); printDataTypeDetails(Integer.class); printDataTypeDetails(Long.class); printDataTypeDetails(Float.class); printDataTypeDetails(Double.class); printDataTypeDetails(Character.class); printDataTypeDetails(Boolean.class); }} |
При выполнении приведенный выше код записывает следующие результаты в стандартный вывод.
Выход
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
Datatype (Class): java.lang.Byte: Minimum Value: -128 Maximum Value: 127 Size (in bits): 8 Size (in bytes): 1Datatype (Class): java.lang.Short: Minimum Value: -32768 Maximum Value: 32767 Size (in bits): 16 Size (in bytes): 2Datatype (Class): java.lang.Integer: Minimum Value: -2147483648 Maximum Value: 2147483647 Size (in bits): 32 Size (in bytes): 4Datatype (Class): java.lang.Long: Minimum Value: -9223372036854775808 Maximum Value: 9223372036854775807 Size (in bits): 64 Size (in bytes): 8Datatype (Class): java.lang.Float: Maximum Value: 3.4028235E38 Minimum Value: 1.4E-45 Size (in bits): 32 Size (in bytes): 4Datatype (Class): java.lang.Double: Maximum Value: 1.7976931348623157E308 Minimum Value: 4.9E-324 Size (in bits): 64 Size (in bytes): 8Datatype (Class): java.lang.Character: Minimum Value: |
ОБНОВЛЕНИЕ: Обратите внимание, что, как указал Аттила-Михали MIN_VALUE в приведенном ниже комментарии, значения MIN_VALUE показанные для java.lang.Float и java.lang.Double выше, не являются отрицательными числами, даже если эти постоянные значения являются отрицательными для Byte , Short Int и Long . Для типов с плавающей точкой Float и Double константа MIN_VALUE представляет минимальное абсолютное значение, которое может храниться в этих типах.
Хотя характеристики примитивных типов данных Java легко доступны онлайн, приятно иметь возможность программного доступа к этим деталям при желании. Мне нравится думать о размерах типов в байтах, и JDK 8 теперь дает возможность видеть эти размеры непосредственно в байтах.
| Ссылка: | Программный доступ к размерам примитивных типов Java от нашего партнера JCG Дастина Маркса в блоге Inspired by Actual Events . |