百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

金蝶一面:Java基本数据类型有哪些?包装类型的常量池技术了解么

yund56 2025-05-06 16:33 20 浏览

分享几道群友去金蝶面试遇到的 Java 基础面试真题:

  • “Java 中的几种基本数据类型了解么?”。
  • 基本类型和包装类型的区别?
  • 包装类型的常量池技术了解么?
  • 自动装箱与拆箱了解吗?原理是什么?

Java 中的几种基本数据类型了解么?

Java 中有 8 种基本数据类型,分别为:

  • 6 种数字类型: 4 种整数型:byte、short、int、long 2 种浮点型:float、double
  • 1 种字符类型:char
  • 1 种布尔型:boolean。

这 8 种基本数据类型的默认值以及所占空间的大小如下:

基本类型

位数

字节

默认值

取值范围

byte

8

1

0

-128 ~ 127

short

16

2

0

-32768 ~ 32767

int

32

4

0

-2147483648 ~ 2147483647

long

64

8

0L

-9223372036854775808 ~ 9223372036854775807

char

16

2

'u0000'

0 ~ 65535

float

32

4

0f

1.4E-45 ~ 3.4028235E38

double

64

8

0d

4.9E-324 ~ 1.7976931348623157E308

boolean

1


false

true、false

对于 boolean,官方文档未明确定义,它依赖于 JVM 厂商的具体实现。逻辑上理解是占用 1 位,但是实际中会考虑计算机高效存储因素。

另外,Java 的每种基本类型所占存储空间的大小不会像其他大多数语言那样随机器硬件架构的变化而变化。这种所占存储空间大小的不变性是 Java 程序比用其他大多数语言编写的程序更具可移植性的原因之一(《Java 编程思想》2.2 节有提到)。

注意:

  1. Java 里使用 long 类型的数据一定要在数值后面加上 L,否则将作为整型解析。
  2. char a = 'h'char :单引号,String a = "hello" :双引号。

这八种基本类型都有对应的包装类分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean 。

基本类型和包装类型的区别?

  • 包装类型不赋值就是 null ,而基本类型有默认值且不是 null。
  • 包装类型可用于泛型,而基本类型不可以。
  • 基本数据类型的局部变量存放在 Java 虚拟机栈中的局部变量表中,基本数据类型的成员变量(未被 static 修饰 )存放在 Java 虚拟机的堆中。包装类型属于对象类型,我们知道对象实例都存在于堆中。
  • 相比于对象类型, 基本数据类型占用的空间非常小。

注意 : 基本数据类型存放在栈中是一个常见的误区! 基本数据类型的成员变量如果没有被 static 修饰的话(不建议这么使用,应该要使用基本数据类型对应的包装类型),就存放在堆中。

class BasicTypeVar{
  private int x;
}
复制代码

包装类型的常量池技术了解么?

Java 基本类型的包装类的大部分都实现了常量池技术。

Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。

Integer 缓存源码:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static {
        // high value may be configured by property
        int h = 127;
    }
}
复制代码

Character 缓存源码:

public static Character valueOf(char c) {
    if (c <= 127) { // must cache
      return CharacterCache.cache[(int)c];
    }
    return new Character(c);
}

private static class CharacterCache {
    private CharacterCache(){}
    static final Character cache[] = new Character[127 + 1];
    static {
        for (int i = 0; i < cache.length; i++)
            cache[i] = new Character((char)i);
    }

}
复制代码

Boolean 缓存源码:

public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}
复制代码

如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。

两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。

Integer i1 = 33;
Integer i2 = 33;
System.out.println(i1 == i2);// 输出 true

Float i11 = 333f;
Float i22 = 333f;
System.out.println(i11 == i22);// 输出 false

Double i3 = 1.2;
Double i4 = 1.2;
System.out.println(i3 == i4);// 输出 false
复制代码

下面我们来看一下问题。下面的代码的输出结果是 true 还是 false 呢?

Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2);
复制代码

Integer i1=40 这一行代码会发生装箱,也就是说这行代码等价于 Integer i1=Integer.valueOf(40) 。因此,i1 直接使用的是常量池中的对象。而Integer i2 = new Integer(40) 会直接创建新的对象。

因此,答案是 false 。你答对了吗?

记住:所有整型包装类对象之间值的比较,全部使用 equals 方法比较

自动装箱与拆箱了解吗?原理是什么?

什么是自动拆装箱?

  • 装箱:将基本类型用它们对应的引用类型包装起来;
  • 拆箱:将包装类型转换为基本数据类型;

举例:

Integer i = 10;  //装箱
int n = i;   //拆箱
复制代码

上面这两行代码对应的字节码为:

   L1

    LINENUMBER 8 L1

    ALOAD 0

    BIPUSH 10

    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;

    PUTFIELD AutoBoxTest.i : Ljava/lang/Integer;

   L2

    LINENUMBER 9 L2

    ALOAD 0

    ALOAD 0

    GETFIELD AutoBoxTest.i : Ljava/lang/Integer;

    INVOKEVIRTUAL java/lang/Integer.intValue ()I

    PUTFIELD AutoBoxTest.n : I

    RETURN
复制代码

从字节码中,我们发现装箱其实就是调用了 包装类的valueOf()方法,拆箱其实就是调用了 xxxValue()方法。

因此,

  • Integer i = 10 等价于 Integer i = Integer.valueOf(10)
  • int n = i 等价于 int n = i.intValue();

注意:如果频繁拆装箱的话,也会严重影响系统的性能。我们应该尽量避免不必要的拆装箱操作。

private static long sum() {
    // 应该使用 long 而不是 Long
    Long sum = 0L;
    for (long i = 0; i <= Integer.MAX_VALUE; i++)
        sum += i;
    return sum;
}

作者:JavaGuide
链接:
https://juejin.cn/post/7078504000005341192

相关推荐

Excel表格带单位求和不用愁!2个高效小技巧,轻松搞定!

我是【桃大喵学习记】,欢迎大家关注哟~,每天为你分享职场办公软件使用技巧干货!——首发于微信号:桃大喵学习记最近有小伙伴私信提问了个问题:“Excel表格数据带单位,如何快速求和?”。相信很多新手小伙...

[office] Excel中Sumproduct函数的使用方法-

Excel中Sumproduct函数的使用方法-SUMPRODUCT和SUMIFS是Excel的两个最强大的函数,用于从表中返回过滤的数据。SUMPRODUCT功能更强大,但SUMIFS更快。您可以...

SUMPRODUCT函数:关于多条件求和,不仅仅是SUMIFS,我也行!

文章最后有彩蛋!好礼相送!SUMPRODUCT函数,作为excel函数公式中的常用功能之一,运用及其广泛。结合它能够处理数据的功能,函数哥将它称之为多条件求和的函数,你可能有疑问了。SUMIF和SUM...

Excel函数公式大全之利用MMULT函数计算两个数组矩阵的乘积

各位Excel天天学的小伙伴们大家好,欢迎收看Excel天天学出品的excel2019函数公式大全课程。今天我们依旧要学习的是Excel函数中的数学函数MMULT函数,计算两个数组的矩阵乘积。今天这个...

Excel中的这个“万能函数”你用过吗?一个顶四个,简单又实用

Hello,大家好,今天跟大家分享一个Excel中的最强大的求和函数,它就是——SUMPRODUCT函数,很多人都将其称之为“万能函数”,条件求和,条件计数等一些常用的功能他就能轻松搞定,逻辑也非常的...

根据关键字条件求和,SUMPRODUCT函数思路清晰!

1职场实例小伙伴们大家好,今天我们来讲解一个关于根据关键字进行条件求和的职场真实案例,这是公众号粉丝后台留言咨询的一个问题,下面我们来通过几组简单的数据还原一下真实的办公情景。如下图所示:A列为一列地...

Excel-万能PRODUCT函数

sumproduct除了可以计算乘积之和,还可以实现单条件求和(代替sumif),多条件求和(代替sumifs),单条件计数(代替countif),多条件计数(代替countifs)我总结了一个通用的...

Excel“王者”级求和函数SUMPRODUCT,职场必学!

我是【桃大喵学习记】,欢迎大家关注哟~,每天为你分享职场办公软件使用技巧干货!日常工作中我们经常需要对Excel数据求和、计数,今天就跟大家分享一下Excel“王者”级求和函数SUMPRODUCT,灵...

SUMPRODUCT函数满足“或”的要求,实现多条件求和!

1职场实例小伙伴们大家好,今天我们来继续讲解Excel使用中非常实用且强大的函数:SUMPRODUCT函数,上一次我们讲到了SUMPRODUCT函数实现类似SUMIFS函数多条件求和的功能。而今天我们...

整列数据相乘再相加sumproduct函数#excel技巧

今天分享一下像这种表格,我想求它的消费,也就是用它的数量去乘以单价去加上。下一个的数量乘以单价要加上,下一个数量乘以单价。如果小白会这样一步一步的去算,去单价去乘以数量,然后加上单价去乘以数量,一个一...

双向多条件求和,sumifs彻底不行了,但是sumproduct却能轻松搞定

今天我们来解决一个困扰很多Excel新手的问题,它就双向求和,所谓的双向,就是两个方向,如下图所示,我们想要根据【项目】与【费用类别】来实现动态求和效果。【项目】与【费用类别】在数据源中,一个是纵横的...

Excel函数之Sumproduct,7个经典用法,你真的都了解吗?

什么是sumproduct函数以及其基本操作原理?sumproduct函数主要用于对数组中的数值进行相乘后再求和,。该函数最多支持255个参数(数组),这些数组可以是数字单元格引用或区域。它的工作流程...

WPS-Excel表格sumproduct函数一次性算出相乘相加总额

excel表格单纯相加或者相乘大家都会应用,但是有时候我们需要算出相乘相加的总额,这种计算也是可以一次性算出的。今天来教大家怎样在WPS表格中,让数据一次性算出相乘相加的总额,会了这个小技巧,会方便很...

大神级Sumproduct公式这么好用,1分钟学会!

在工作中,一般用不到Sumprodct函数公式,但是真的好用,我们举工作中的3个场景来说明。1、快速相乘相加如下所示,我们各种商品有一个单价,然后对应有一些数量,我们现在需要快速汇总总金额数据有没有小...

万能函数Sumproduct,除了求和和计数外,还可以排名

在众多的Excel函数中,能同时完成求和、计数以及排名功能的函数不多,其中Sumproduct就是其中一个。一、万能函数Sumproduct:功能及语法结构。功能:返回相应区域数组乘积的和。语法结...