• [java]基本数据类型


    基本数据类型及其的包装类

    基本数据类型

    Java 有八种基本类型。

    • byte

      • byte 数据类型是 (8) 位、有符号的,以二进制补码表示的整数。
      • 最小值是 -128 ( (-2^{7}) )。
      • 最大值是 127 ( (2^{7} - 1) )。
      • 默认值是 0
    • short

      • short 数据类型是 (16) 位、有符号的以二进制补码表示的整数。
      • 最小值是 -32768 ( (-2^{15}) )。
      • 最大值是 32767 ( (2^{15} - 1) )。
      • 默认值是 0
    • int

      • int 数据类型是 (32) 位、有符号的以二进制补码表示的整数。
      • 最小值是 -2,147,483,648 ( (-2^{31}) )。
      • 最大值是 2,147,483,647 ( (2^{31} - 1) )。
      • 一般地整型变量默认为 int 类型。
      • 默认值是 0
    • long

      • long 数据类型是 (64) 位、有符号的以二进制补码表示的整数。
      • 最小值是 -9,223,372,036,854,775,808 ( (-2^{63}) )。
      • 最大值是 9,223,372,036,854,775,807 ( (2^{63} - 1) )。
      • 这种类型主要使用在需要比较大整数的系统上。
      • 默认值是 0L
    • float

      • float 数据类型是单精度、(32) 位、符合 IEEE 754 标准的浮点数。
      • float 在储存大型浮点数组的时候可节省内存空间。
      • 默认值是 0.0f
    • double

      • double 数据类型是双精度、(64) 位、符合 IEEE 754 标准的浮点数。
      • 浮点数的默认类型为 double 类型。
      • 默认值是 0.0d
    • boolean

      • boolean 数据类型表示一位的信息。
      • 只有两个取值:truefalse
      • 这种类型只作为一种标志来记录 true/false 情况。
      • 默认值是 false
    • char

      • char 类型是一个单一的 (16)Unicode 字符。
      • 最小值是 u0000 (即为 0 )。
      • 最大值是 uffff (即为 65,535 )。

    基本类型的包装类

    每一个基本类型都有一个属于它的包装类,比如 intIntegerboolBoolen

    下面以 intInteger 为例说明两种的差别:

    • Integer 变量必须实例化后才能使用,而 int 变量不需要。
    • Integer 可以是 null ,而 int 不行。
    • Integer 实际是对象的引用,当 new 一个 Integer 时,实际上是生成一个指针指向此对象;而 int 则是直接存储数据值。

    基本类型的包装类和基本类型的比较

    两个 Integer 变量进行 == 比较

    由于 Integer 变量实际上是对一个 Integer 对象的引用,所以两个通过 new 生成的 Integer 变量永远是不相等的(因为 new 生成的是两个对象,其内存地址不同)。

            Integer i = new Integer(100);
            Integer j = new Integer(100);
            System.out.print(i == j);
    

    输出:

    false

    两个 Integer 变量进行 equals 比较

    通过观察 Integerequals 函数,可以发现两者比较的是 value 值,也就是被包装的值。

            Integer i = new Integer(100);
            Integer j = new Integer(100);
            System.out.print(i.equals(j));
    

    输出:

    true

    Integer 变量和 int 变量进行比较

    只要两个变量的值是相等的,则结果为 true (因为包装类 Integer 和基本数据类型 int 比较时,java 会自动拆包装为 int,然后进行比较,实际上就变为两个 int 变量的比较)

            Integer i = new Integer(100);
            int j = 100;
            System.out.println(i.equals(j));
            System.out.println(i == j);
    

    输出:

    true
    true

    非 new 生成的 Integer 变量和 new 生成的 Integer 变量进行比较

    结果总是为 false。(因为非 new 生成的 Integer 变量指向的是 java 常量池中的对象,而 new Integer() 生成的变量指向堆中新建的对象,两者在内存中的地址不同)

            Integer i = new Integer(100);
            Integer j = 100;
            System.out.print(i == j); 
    

    输出:

    false

    两个非 new 生成的 Integer 对象进行比较

    当两个变量的值在区间 (-128)(127) 之间,则比较结果为 true
    当两个变量的值不在此区间,则比较结果为 false

            Integer i = 100;
            Integer j = 100;
            System.out.println(i == j); 
    

    输出:

    true

            Integer i = 200;
            Integer j = 200;
            System.out.println(i == j); 
    

    输出:

    false

    为什么两个非 new 生成的 Integer 对象进行比较会出现这种情况?

    因为 Java 在编译 Integer i = 100;时,会翻译成为 Integer i = Integer.valueOf(100);,而 Java API 中对 Integer 类型的 valueOf 的定义如下:

        public static Integer valueOf(int i){
            assert IntegerCache.high >= 127;
            if (i >= IntegerCache.low && i <= IntegerCache.high){
                return IntegerCache.cache[i + (-IntegerCache.low)];
            }
            return new Integer(i);
        }
    

    所以,Java 对于(-128)(127)之间的数,会进行缓存,Integer i = 127 时,会将 (127) 进行缓存,下次再写 Integer j = 127 时,就会直接从缓存中取,就不会 new

    为什么用 equals 比较两者都一样?

    因为 Integer.equals(int) 时会把 int 转换成 Integer 再进行比较,根据Integerequals 函数,它们总是相等的。

    我们应该选用哪种方法使用整形变量?

    一般我们通过 int 来使用整形变量,但是对于一些返回值可能是 null 的函数,我们需要用 Integer 去装这个返回值来防止报错。

    特别的:Integer 的构造函数在 JDK 9.0已经弃用,可能在将来的某个版本的 JDK 种消失,所以请使用 Integer i = 100 这种方式初始化 Integer

    参考材料一

    参考材料二

  • 相关阅读:
    lilntcode-508-摆动排序
    lintcode-501-迷你推特
    lintcode-496-玩具工厂
    lintcode-491-回文数
    lintcode-488-快乐数
    lintcode-480-二叉树的所有路径
    lintcode-248-统计比给定整数小的数的个数
    ubuntu 镜像站部署
    [转发]以我的亲身经历为例,告诉大家写简历和面试的技巧(面向高级开发和架构师)
    镜像站nginx
  • 原文地址:https://www.cnblogs.com/jhy16193335/p/10463449.html
Copyright © 2020-2023  润新知