zoukankan      html  css  js  c++  java
  • [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

    参考材料一

    参考材料二

  • 相关阅读:
    Quicksum -SilverN
    uva 140 bandwidth (好题) ——yhx
    uva 129 krypton factors ——yhx
    uva 524 prime ring problem——yhx
    uva 10976 fractions again(水题)——yhx
    uva 11059 maximum product(水题)——yhx
    uva 725 division(水题)——yhx
    uva 11853 paintball(好题)——yhx
    uva 1599 ideal path(好题)——yhx
    uva 1572 self-assembly ——yhx
  • 原文地址:https://www.cnblogs.com/jhy16193335/p/10463449.html
Copyright © 2011-2022 走看看