我看JAVA 之 基本数据类型与封装类型

简介:

我看JAVA 之 基本数据类型与封装类型

注:基于jdk11
java提供了8中基本数据类型,其中1个布尔类型,6个数字类型,1个字符类型。同时jdk为这8种基本数据类型提供了相应的封装类型。

boolean & Boolean

  • boolean

    1. 长度为1位
    2. 数据范围:只有两个值true、false
    3. 默认值为false
  • Boolean

    1. boolean的封装类型
    2. 实现了Serializable、Comparable接口
    3. 重要的成员变量

      public static final Boolean TRUE = new Boolean(true);
      public static final Boolean FALSE = new Boolean(false);
      private final boolean value;
      public static final Class<Boolean> TYPE = (Class<Boolean>) Class.getPrimitiveClass("boolean");
    4. 重要的方法

      @HotSpotIntrinsicCandidate
      public boolean booleanValue() {
        return value;
      }  
      @HotSpotIntrinsicCandidate
      public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
      }   

byte & Byte

  • byte

    1. 长度为1个字节,有符号
    2. 数据范围:最小值-2^7,最大值2^7-1 即[-128, 127]共256个数字
    3. 默认值为0
  • Byte

    1. 继承了Number类, Number抽象类定义了类型转换的抽象方法如intValue()longValue()floatValue()等,并实现了序列化接口
    2. 实现了Comparable接口
    3. 重要的成员变量

      public static final byte   MIN_VALUE = -128;
      public static final byte   MAX_VALUE = 127;
      @SuppressWarnings("unchecked")
      public static final Class<Byte>     TYPE = (Class<Byte>) Class.getPrimitiveClass("byte");
    4. 重要的方法

      @HotSpotIntrinsicCandidate
      public static Byte valueOf(byte b) {
          final int offset = 128;
          return ByteCache.cache[(int)b + offset];
      }
      @HotSpotIntrinsicCandidate
      public byte byteValue() {
          return value;
      }
    5. 缓存机制

      private static class ByteCache {
          private ByteCache(){}
      
          static final Byte cache[] = new Byte[-(-128) + 127 + 1];
      
          static {
              for(int i = 0; i < cache.length; i++)
                  cache[i] = new Byte((byte)(i - 128));
          }
      }

      静态内部类ByteCache内部的静态Byte[]缓存了Byte的全部256个数据。

int & Integer

  • int

    1. 长度为4个字节,有符号
    2. 数据范围:最小值-2^31,最大值2^31-1 即[0x80000000, 0x7fffffff]
    3. 默认值为0
  • Integer

    1. 继承了Number类
    2. 实现了Comparable接口
    3. 重要的成员变量

      @Native public static final int   MIN_VALUE = 0x80000000;
      
      /**
       * A constant holding the maximum value an {@code int} can
       * have, 2<sup>31</sup>-1.
       */
      @Native public static final int   MAX_VALUE = 0x7fffffff;
      
      /**
       * The {@code Class} instance representing the primitive type
       * {@code int}.
       *
       * @since   1.1
       */
      @SuppressWarnings("unchecked")
      public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
      
      /**
       * All possible chars for representing a number as a String
       */
      static final char[] digits = {
          '0' , '1' , '2' , '3' , '4' , '5' ,
          '6' , '7' , '8' , '9' , 'a' , 'b' ,
          'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
          'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
          'o' , 'p' , 'q' , 'r' , 's' , 't' ,
          'u' , 'v' , 'w' , 'x' , 'y' , 'z'
      };
      
      @Native public static final int SIZE = 32; 32位
      public static final int BYTES = SIZE / Byte.SIZE; 32/8=4 4个字节
    4. 重要的方法

      @HotSpotIntrinsicCandidate
      public static String toString(int i) {
          int size = stringSize(i);
          if (COMPACT_STRINGS) {
              byte[] buf = new byte[size];
              getChars(i, size, buf);
              return new String(buf, LATIN1);
          } else {
              byte[] buf = new byte[size * 2];
              StringUTF16.getChars(i, size, buf);
              return new String(buf, UTF16);
          }
      }
      
      //使用缓存IntegerCache,使用valueOf在空间和时间上要优于直接使用构造方法
      @HotSpotIntrinsicCandidate
      public static Integer valueOf(int i) {
          if (i >= IntegerCache.low && i <= IntegerCache.high)
              return IntegerCache.cache[i + (-IntegerCache.low)];
          return new Integer(i);
      }
      @HotSpotIntrinsicCandidate
      public int intValue() {
          return value;
      }
    5. 有意思的方法:

      System.out.println(Integer.numberOfLeadingZeros(18));
      System.out.println(Integer.numberOfTrailingZeros(1000));
      System.out.println(Integer.bitCount(1));
      System.out.println(Integer.bitCount(2));
      System.out.println(Integer.bitCount(4));
      System.out.println(Integer.bitCount(12));
       
      打印结果如下:
      27 整数18在二进制表示中首部有27个连续的0
      3  整数1000在二进制表示中尾部有3个连续的0
      1  整数1在二进制表示中有1位是1
      1  整数2在二进制表示中有1位是1
      1  整数4在二进制表示中有1位是1
      2  整数12在二进制表示中有2位是1 
    6. 缓存机制

      private static class IntegerCache {
          static final int low = -128;
          static final int high; //通过设置-XX:AutoBoxCacheMax=<size>,指定high的值,默认缓存范围为[-128,127]
          static final Integer cache[];
      
          static {
              // high value may be configured by property
              int h = 127;
              String integerCacheHighPropValue =
                  VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
              if (integerCacheHighPropValue != null) {
                  try {
                      int i = parseInt(integerCacheHighPropValue);
                      i = Math.max(i, 127);
                      // Maximum array size is Integer.MAX_VALUE
                      h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                  } catch( NumberFormatException nfe) {
                      // If the property cannot be parsed into an int, ignore it.
                  }
              }
              high = h;
      
              cache = new Integer[(high - low) + 1];
              int j = low;
              for(int k = 0; k < cache.length; k++)
                  cache[k] = new Integer(j++);
      
              // range [-128, 127] must be interned (JLS7 5.1.7)
              assert IntegerCache.high >= 127;
          }
      
          private IntegerCache() {}
      }
      

      验证缓存代码示例:

      package chapter01;
      public class TestInteger {
          public static void main(String [] args) {
              Integer a = Integer.valueOf(6);
              Integer b = new Integer(6);
              Integer c = 6;
      
              System.out.println(a==b);
              System.out.println(a==c);
              System.out.println(c==b);
      
              Integer a1 = Integer.valueOf(600);
              Integer b1 = new Integer(600);
              Integer c1 = 600;
              System.out.println("\n");
      
              System.out.println(a1==b1);
              System.out.println(a1==c1);
              System.out.println(c1==b1);
      
          }
      }
      打印结果:
      false
      true
      false
      
      
      false
      false
      false
      建议:
      包装类型比较是否相等使用equals()而非==

long & Long

  • long

    1. 长度为8个字节,有符号
    2. 数据范围:最小值-2^63,最大值2^63-1 即[0x8000000000000000L, 0x7fffffffffffffffL]
    3. 默认值为0
  • Long

    
    类似 integer,读者可以自己去分析

float & Float

  • float

    1. 是单精度、长度为4个字节共32位、符合IEEE 754标准的浮点数
    2. 默认值为0.0f
    3. float与double精度不同,所以在将float与double强制转换的时候会出现精度丢失的问题
  • Float

    1. 继承了Number类, Number抽象类定义了类型转换的抽象方法如intValue()longValue()floatValue()等,并实现了序列化接口
    2. 实现了Comparable接口
    3. 重要的成员变量
    public static final float POSITIVE_INFINITY = 1.0f / 0.0f; 正无穷
    public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;负无穷
    public static final float NaN = 0.0f / 0.0f; //不是数字 Not a Number
    public static final float MAX_VALUE = 0x1.fffffeP+127f; // 3.4028235e+38f
    public static final float MIN_NORMAL = 0x1.0p-126f; // 1.17549435E-38f
    public static final float MIN_VALUE = 0x0.000002P-126f; // 1.4e-45f
    
    //最大、最小指数
    public static final int MAX_EXPONENT = 127;
    public static final int MIN_EXPONENT = -126;
    
    //32位,4个字节
    public static final int SIZE = 32;
    public static final int BYTES = SIZE / Byte.SIZE;
    
    @SuppressWarnings("unchecked")
    public static final Class<Float> TYPE = (Class<Float>) Class.getPrimitiveClass("float");

double & Double

  • double

    1. 是双精度、长度为8个字节共64位、符合IEEE 754标准的浮点数
    2. 默认值为0.0d
  • Double

    类似 Float,读者可以自己去分析
    

short & Short

  • short

    1. 长度为2个字节,有符号
    2. 数据范围:最小值-2^15,最大值2^15-1 即[-32768, 32767]
    3. 默认值为0
  • Short

    类似 Integer,读者可以自己去分析

char & Character

  • char

    1. 单个unicode字符,长度为16位
    2. 数据范围:最小值0,最大值65535 即[0, 65535]
    3. 默认值为""
  • Character
相关文章
|
4天前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
2天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
18 4
|
4天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
12 2
|
15天前
|
存储 Java 关系型数据库
[Java]“不同族”基本数据类型间只能“强转”吗?
本文探讨了不同位二进制表示范围的计算方法,重点分析了Java中int和char类型之间的转换规则,以及float与int类型之间的转换特性。通过具体示例说明了显式和隐式转换的条件和限制。
30 0
[Java]“不同族”基本数据类型间只能“强转”吗?
|
26天前
|
Java 编译器
Java“返回类型为 void 的方法不能返回一个值”解决
在 Java 中,如果一个方法的返回类型被声明为 void,那么该方法不应该包含返回值的语句。如果尝试从这样的方法中返回一个值,编译器将报错。解决办法是移除返回值语句或更改方法的返回类型。
|
28天前
|
设计模式 Java
Java“不能转换的类型”解决
在Java编程中,“不能转换的类型”错误通常出现在尝试将一个对象强制转换为不兼容的类型时。解决此问题的方法包括确保类型间存在继承关系、使用泛型或适当的设计模式来避免不安全的类型转换。
|
25天前
|
Java
Java 中锁的主要类型
【10月更文挑战第10天】
|
1月前
|
Java
JAVA易错点详解(数据类型转换、字符串与运算符)
JAVA易错点详解(数据类型转换、字符串与运算符)
44 4
|
14天前
|
存储 Java 编译器
[Java]基本数据类型与引用类型赋值的底层分析
本文详细分析了Java中不同类型引用的存储方式,包括int、Integer、int[]、Integer[]等,并探讨了byte与其他类型间的转换及String的相关特性。文章通过多个示例解释了引用和对象的存储位置,以及字符串常量池的使用。此外,还对比了String和StringBuilder的性能差异,帮助读者深入理解Java内存管理机制。
17 0
|
27天前
|
Java 编译器 C++
【编程基础知识】Java基本数据类型
Java的基本类型包括五类九种,涵盖了整型、浮点型、字符型、布尔型和void。成员变量即使未初始化也有默认值,但局部变量必须显式初始化,否则编译会报错。示例代码展示了各种基本类型的默认值和极限值。
31 0