金蝶一面:Java基本数据类型有哪些?包装类型的常量池技术了解么
分享几道群友去金蝶面试遇到的 Java 基础面试真题:
- “Java 中的几种基本数据类型了解么?”。
- 基本类型和包装类型的区别?
- 包装类型的常量池技术了解么?
- 自动装箱与拆箱了解吗?原理是什么?
Java 中有 8 种基本数据类型,分别为:
- 6 种数字类型: 4 种整数型:byte、short、int、long 2 种浮点型:float、double
- 1 种字符类型:char
- 1 种布尔型:boolean。
这 8 种基本数据类型的默认值以及所占空间的大小如下:
对于 boolean,官方文档未明确定义,它依赖于 JVM 厂商的具体实现。逻辑上理解是占用 1 位,但是实际中会考虑计算机高效存储因素。
另外,Java 的每种基本类型所占存储空间的大小不会像其他大多数语言那样随机器硬件架构的变化而变化。这种所占存储空间大小的不变性是 Java 程序比用其他大多数语言编写的程序更具可移植性的原因之一(《Java 编程思想》2.2 节有提到)。
注意:
- Java 里使用 long 类型的数据一定要在数值后面加上 L,否则将作为整型解析。
- char a = \’h\’char :单引号,String a = \”hello\” :双引号。
这八种基本类型都有对应的包装类分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean 。
- 包装类型不赋值就是 null ,而基本类型有默认值且不是 null。
- 包装类型可用于泛型,而基本类型不可以。
- 基本数据类型的局部变量存放在 Java 虚拟机栈中的局部变量表中,基本数据类型的成员变量(未被 static 修饰 )存放在 Java 虚拟机的堆中。包装类型属于对象类型,我们知道对象实例都存在于堆中。
- 相比于对象类型, 基本数据类型占用的空间非常小。
⚠️注意 : 基本数据类型存放在栈中是一个常见的误区! 基本数据类型的成员变量如果没有被 static 修饰的话(不建议这么使用,应该要使用基本数据类型对应的包装类型),就存放在堆中。
Java 基本类型的包装类的大部分都实现了常量池技术。
Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。
Integer 缓存源码:
Character 缓存源码:
Boolean 缓存源码:
如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。
两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。
下面我们来看一下问题。下面的代码的输出结果是 true 还是 false 呢?
Integer i1=40 这一行代码会发生装箱,也就是说这行代码等价于 Integer i1=Integer.valueOf(40) 。因此,i1 直接使用的是常量池中的对象。而Integer i2 = new Integer(40) 会直接创建新的对象。
因此,答案是 false 。你答对了吗?
记住:所有整型包装类对象之间值的比较,全部使用 equals 方法比较。
什么是自动拆装箱?
- 装箱:将基本类型用它们对应的引用类型包装起来;
- 拆箱:将包装类型转换为基本数据类型;
举例:
上面这两行代码对应的字节码为:
从字节码中,我们发现装箱其实就是调用了 包装类的valueOf()方法,拆箱其实就是调用了 xxxValue()方法。
因此,
- Integer i = 10 等价于 Integer i = Integer.valueOf(10)
- int n = i 等价于 int n = i.intValue();
注意:如果频繁拆装箱的话,也会严重影响系统的性能。我们应该尽量避免不必要的拆装箱操作。
作者:JavaGuide链接:https://juejin.cn/post/7078504000005341192
Java编程高手速成:Java的基本数据类型特点以及高效记忆
Java 基本数据类型概览
Java作为一种广泛使用的高级编程语言,其强大的功能之一就体现在它对基本数据类型的精细划分上。Java的基本数据类型是构成程序的基础元素,它们包括整型、浮点型、字符型和布尔型,每种类型都有其独特的用途和特性。
整型数据类型在Java中分为四种:byte、short、int和long,它们主要用于表示整数。byte类型占用1个字节,取值范围为-128(-2^7)到127(2^7-1);short类型占用2个字节,取值范围从-32,768((-2^15))到32,767((-2^15-1));int类型是最常用整数类型,占用4个字节,取值范围为-2^31到2^31-1;而long类型则占用8个字节,取值范围更广,为-2^63到2^63-1。
浮点型数据类型包括float和double两种,它们用于表示带有小数的数字。float类型称为单精度浮点数,占用4个字节,有效数字大约7位;而double类型称为双精度浮点数,占用8个字节,有效数字大约15位。浮点数的精度对于科学计算或需要高精度数值运算的场景尤为重要。
字符型数据类型char在Java中用于表示单个字符,它占用2个字节,能够表示Unicode字符集中的所有字符,从而支持国际化编程。char类型的取值范围为0到65,535,对应于UTF-16编码单元。
布尔型数据类型boolean是Java中专用于逻辑判断的类型,只有两个取值:true(真)和false(假)。它在内存中占用的空间非常小,通常为1个比特,但由于计算机体系结构的原因,实际占用空间可能稍大。
这些基本数据类型构成了Java程序的基础,了解它们的属性和使用场景对于编写高效、正确的Java代码至关重要。在实际开发中,根据不同的需求选择合适的数据类型,可以有效地优化程序的性能和内存使用。例如,对于大量数据的运算,选择适当的整型可以减少内存消耗;对于需要精确表示的小数,应优先考虑使用double类型以确保计算精度。
各基本数据类型的字节数与取值范围
在Java编程中,基本数据类型是构建程序的基础元素。每种数据类型都对应不同的字节数和取值范围,了解这些特性有助于程序员更高效地使用内存资源并避免潜在的错误。首先,整型数据分为几种:byte、short、int、和long,其中byte占用1字节,其取值范围从-2^7至2^7-1;short占用2字节,取值范围为-2^15至2^15-1;int是最常用的整型,占用4字节,取值范围为-2^31至2^31-1;而long占用8字节,取值范围最大,从-2^63至2^63-1。浮点型数据包括float和double,float占4字节,主要用于科学计算和需要小数部分的场合,其有效数字大约为6到7位;double则占用8字节,精度更高,适用于需要更精确数值计算的情况。
字符型数据char在Java中用于表示单个字符,每个char占用2字节,可以存储UTF-16编码的字符。这种设计使得Java能够支持多语言环境中的国际化需求。布尔型数据boolean只有两种状态,true和false,它在计算机中通常只占用1位,但在Java中由于最小的数据单位是字节,因此实际占用空间为1字节。这些基本数据类型的设计和实现体现了Java对效率与功能的综合考量。例如,通过为不同大小的数值提供不同长度的数据类型,Java允许开发者根据实际需求选择最合适的数据类型,从而优化内存使用和提高程序性能。同时,字符型的设计也显示了Java对全球语言支持的重视。
基本数据类型在内存中的存储原理
在Java中,基本数据类型的存储方式是直接在内存中以固定的大小分配空间。每种基本数据类型都有其特定的字节数和默认值,这些特性直接影响其在程序中的声明、初始化以及使用。
当声明一个变量时,系统会根据该变量的数据类型在堆或栈内存中为其分配相应大小的内存空间。例如,整型(int)占用4个字节,而布尔型(boolean)只占用1个字节。这种固定大小的特性使得Java在编译时就能确定每个变量所需的内存量,从而提高了程序的运行效率。
初始化变量时,Java为基本数据类型的变量赋予了默认值。例如,数值型(byte、short、int、long)的默认值是0,浮点型(float、double)的默认值是0.0,字符型(char)的默认值是’\\u0000’(即null字符),布尔型(boolean)的默认值是false。这些默认值确保了未显式初始化的变量有一个确定的起始状态,减少了程序运行时可能出现的错误。
在内存中,基本数据类型通常被存储在连续的字节中。例如,一个int类型的变量可能会被存储在四个连续的字节内。这种连续性不仅有助于数据的快速访问,也简化了数据的处理过程。
此外,Java的基本数据类型在内存中的布局是平台无关的,这意味着无论在哪个操作系统或硬件上运行,相同的Java代码都将以同样的方式处理其基本数据类型。这是Java“一次编写,到处运行”理念的一个体现。
了解Java中基本数据类型的存储原理对于编写高效且可靠的程序至关重要。开发者应熟悉各数据类型的字节数和默认值,以便更好地管理内存使用并预防潜在的错误,如数值溢出或类型转换错误。通过掌握这些基础知识,可以更有效地利用Java语言的特性,优化程序性能并提高代码质量。
如何高效记忆 Java 基本数据类型
如何高效记忆 Java 基本数据类型对于初学者来说至关重要,因为这是编程基础中的核心部分。以下提供几个实用的技巧和方法,帮助用户快速掌握相关知识。
将数据类型与其取值范围和内存占用进行联想记忆。例如,整型(int)通常占用 4 个字节,对应 32 位,取值范围是 -2^31 至 2^31-1。可以想象一个四格的停车场,每一个格子代表一个字节,总共有四个格子,即 32 位。通过这种方式,把抽象的概念具象化,便于记忆。此外,了解这些基本数据类型的默认值也有助于加深理解。例如,整型的默认值是 0,布尔型的默认值是 false,字符型的默认值是 ‘\\u0000’,而浮点型(float)的默认值是 0.0f。
利用对比和分类的方法进行记忆也是一种有效的策略。可以将 Java 的基本数据类型按用途和特性分成几类:数值型(如 byte、short、int、long)、浮点型(如 float、double)、字符型(char)和布尔型(boolean)。每类内部的数据类型在字节数和取值范围上都有特定的关系和规律。例如,数值型从 byte 到 long,它们的字节数依次增加一倍,取值范围也随之扩大。通过这种对比和分类,可以更系统地掌握不同数据类型之间的关系和差异。
实践是最好的老师。编写代码来测试和验证你对各种基本数据类型的理解和使用。例如,编写小程序来打印不同数据类型变量的默认值、最大值和最小值等。通过不断的练习和应用,你会发现自己对基本数据类型的掌握越来越熟练,最终能够自如地在实际编程中使用它们。
基本数据类型的应用场景
在Java编程中,基本数据类型的选择和应用至关重要,它们直接影响程序的性能和内存使用效率。整型数据类型是最常用的,如用于表示整数,适用于计数、索引等场景;占用较少的空间,适合存储小范围的整数;而则用于需要更大数值范围的情况,例如处理大文件的偏移量或时间戳。浮点型数据类型和用于表示带有小数的数字,其中提供更精确的小数点表示,适用于金融计算等对精度要求较高的场合。字符型用于存储单个字符,通常用于处理字符串或文本相关的操作。布尔型只有两个值:和,用于逻辑判断,控制程序的流程。
在实际编程中,选择合适的数据类型可以优化内存利用并提高程序效率。例如,如果知道某个数值不会超出一定范围,应优先考虑使用较小的数据类型以节省空间。同时,对于涉及大量计算的应用,选择合适的数据类型还能避免溢出问题,确保程序的正确性和稳定性。此外,理解不同数据类型之间的转换规则也是编写高效代码的关键,特别是在进行数学运算或数据处理时。总之,掌握Java基本数据类型的应用场景,可以帮助开发者更好地设计程序结构,提升编码质量。
常见问题解答
在Java编程中,基本数据类型的使用是极其常见的,但在实际开发中,开发者可能会遇到一些关于这些数据类型的问题。其中,类型转换和溢出问题是最为频繁遇到的。
类型转换问题通常出现在整型与浮点型的转换中。例如,当我们将一个较大的整数值赋给一个浮点变量时,由于浮点数的存储方式不同,可能会导致精度的丢失。同样,将一个浮点数强制转换为整型时,小数部分将会被截断,这在某些情况下可能导致意外的结果。因此,在进行类型转换时,开发者需要特别小心,尤其是在涉及到金融计算等对精度要求极高的场景。
溢出问题是另一个常见的问题。在Java中,每种基本数据类型都有一个固定的取值范围,当赋值超过这个范围时,就会发生溢出。例如,类型的取值范围是-2^31至2^31-1,如果尝试将一个超出这个范围的值赋给一个变量,结果将是不确定的,并且可能导致程序运行错误。为了避免溢出问题,开发者需要在编写代码时就考虑到数据可能的最大值,并合理选择数据类型。例如,对于可能非常大的数值,可以使用或类型来避免溢出。
除了上述两个常见问题外,还有一个值得注意的点是基本数据类型的默认值。在Java中,每个基本数据类型都有一个默认值,例如的默认值是0,的默认值是,的默认值是0.0f。了解这些默认值对于编写健壮的代码非常重要,因为它们可以在对象未显式初始化时提供合理的默认行为。
总结来说,虽然Java的基本数据类型看似简单,但在实际应用中却有许多需要注意的地方。理解类型转换的规则、避免溢出以及利用好默认值,都是提高代码质量和减少潜在错误的关键步骤。掌握这些知识,可以帮助开发者更加熟练地使用Java进行高效编程。
一文详解 Java 的八大基本类型
自从Java发布以来,基本数据类型就是Java语言中重要的一部分,本文就来详细介绍下每种基本类型的具体使用方法和限制。
作者 | Jeremy Grifski
译者 | 弯月,责编 | 郭芮
出品 | CSDN(CSDNnews)
以下为译文:
几年前,我开始编写了一系列有关Java入门的文章,我觉得有必要将其中一些非常细节的内容单独拿出来写成文章。这样,那些入门内容就更容易理解了。首先,我来介绍一下有关Java 8中的基本类型。
如题所述,Java语言本身有8种基本类型。在下面几节中,就让我们一起来看看这8种基本类型。我将针对每种基本类型,介绍具体的使用方法和限制。
int基本类型
首先,Java的整数是32位有符号(即包括正值和负值)整数,由int关键字表示:
当然,像所有基本类型一样,整型有自己的限制。由于它只有32位,所以其取值范围为-2147483648到2147483647。这数字很大嘛!当然,我们可以在DrJava的交互面板中用下述技巧来确认:
自然地,对于简单的计算而言,int是最常用的整数类型。如果你需要更大的数字范围,请参照下面的long。
double基本类型
与int不同,Java的双精度类型是64位浮点数,由double关键字表示:
需要提醒的是,浮点数实际上就是实数。换句话说,双精度浮点数中包含小数点。
由于双精度类型是64位,它能表示的数字要比整型多很多。同样,我们可以利用交互面板来确认双精度类型的范围:
需要注意的是,负的指数表示的是非常小的数字,而不是非常大的负数。所以这里的取值范围跟整数不是完全一样。
一般而言,double是在Java中使用浮点数的默认选择。另一个选择是float。
char基本类型
我们已经看到,Java的字符类型表示16位字符,由char关键字表示:
Java中所有的字符都用单引号表示。同时,双引号用来表示字符串。我们稍后会讨论字符串。
与往常一样,我们可以通过下面的代码找出字符的范围:
为了让这个范围有意义,我们可以将结果转换成整数(稍后会更多地介绍):
可见,char类型是Java中唯一的无符号类型。换句话说,字符的取值范围为0到65535,每个值映射到特定的字符。如果需要创建该范围之外的字符,可以将一对字符组合起来。参见“在Java中反转字符串”(https://therenegadecoder/code/reverse-a-string-in-java/)这篇文章中的例子。
byte基本类型
当我们讨论二进制时,我们讨论的实际上是比特的概念。而8个比特组成一个字节,字节是Java支持的基本类型之一。本质上,byte类型只不过是取值范围为-128到127的8位整数。可以猜到,字节由byte关键字表示:
同样,可以利用下面的代码片段来确认byte类型的取值范围:
根据我的经验,byte类型在读取和处理原始数据时非常有用。但是一般而言,我们不会使用它,因为取值范围太小了。
short基本类型
short是另一种整数类型,但它占用的空间要比int类型更小。实际上,它的占用空间正好是int类型的一半,为16位,由short关键字表示:
short类型的取值范围也只有整数的一半,我们可以用下述代码确认:
在实际应用中,short只有65546个可能的值。在内存空间和磁盘空间受限的情况下,我们会使用byte和short。但在其他情况下,在定义整数时默认使用int更为安全。
long基本类型
与short相反的是long基本类型,即长整数。该类型用来表示比int类型还要大的非常大的数。long类型是64位有符号整数,其取值范围超过了10的18次方。
通常,长整数用long关键字表示:
下面的代码可以查看64位值究竟有多大:
也许,long可以用来计算光在一定时间内走过的距离。光在一秒内大约传播万千米。如果编写一个程序来跟踪光走过的距离,那么7秒后int类型就超出范围类,而long类型能够计算大约975年。不相信吗?可以看看这个gist(https://gist.github/jrg94/820d3f0f482dd19f0170964346381df0)中的计算。
float基本类型
虽然我们通常使用64位浮点数类型double,但Java还支持另一种浮点数类型,叫做float。但与int类似,Java默认情况下使用double表示浮点数。不管怎样,我们可以用float来表示32位浮点数类型:
float类型的范围如下:
可见,32位浮点数的范围和精度都要小得多。如果不需要double的精度,同时节省一半的空间,那么可以选择float类型。
boolean基本类型
最后我们来讨论一下boolean类型。定义布尔类型可以使用boolean关键字:
布尔类型有些特殊,不像其他基本类型那样,它们表示的不是数字值。实际上,之前使用的MAX_VALUE和MIN_VALUE技巧在这里不能使用。相反,它表示的是true或false,即真和假。
在此,我不打算详细介绍布尔类型,因为在Java中做任何事情都会涉及到布尔类型。尽管如此,我们通常不会明确地声明布尔类型。相反,许多代码逻辑中的比较操作的结果都是布尔类型。
原文:https://dev.to/renegadecoder94/the-8-primitive-types-in-java-10cl
本文为 CSDN 翻译,
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。