Статьи

Программный доступ к размерам примитивных типов Java

Одной из первых вещей, о которых узнают многие новички в 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): 1
 
Datatype (Class): java.lang.Short:
 Minimum Value:   -32768
 Maximum Value:   32767
 Size (in bits):  16
 Size (in bytes): 2
 
Datatype (Class): java.lang.Integer:
 Minimum Value:   -2147483648
 Maximum Value:   2147483647
 Size (in bits):  32
 Size (in bytes): 4
 
Datatype (Class): java.lang.Long:
 Minimum Value:   -9223372036854775808
 Maximum Value:   9223372036854775807
 Size (in bits):  64
 Size (in bytes): 8
 
Datatype (Class): java.lang.Float:
 Maximum Value:   3.4028235E38
 Minimum Value:   1.4E-45
 Size (in bits):  32
 Size (in bytes): 4
 
Datatype (Class): java.lang.Double:
 Maximum Value:   1.7976931348623157E308
 Minimum Value:   4.9E-324
 Size (in bits):  64
 Size (in bytes): 8
 
Datatype (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 теперь дает возможность видеть эти размеры непосредственно в байтах.