Java里的数据类型都有哪些

压力测
• 阅读 630

相关面试题
我们从学习Java开始,很快就会遇到 Java中的数据类型 这个问题。关于数据类型,对于初学者来说,很容易记混,因为Java中的数据类型划分的有点多。所以在招聘初级程序员时,面试官就会经常在这一块出一些题目,对求职者进行基础语法方面的考核。常见的数据类型相关的面试题如下:

请说一下Java中有哪些数据类型?

Java中有哪些基本数据类型?

基本数据类型的取值范围是多大?

Java的2个字节占多少位?

int占几个字节?

数据类型之间怎么进行转换?

......

当然对于上面这些面试题,并不一定就这么问,很多时候面试官可能会把题干进行修改,但考察的内容其实还是这些内容。总之,万变不离其宗,Java里的知识点就那些东西,再怎么问,也都是这些内容。

本篇文章会带大家来复习Java中的数据类型,这些内容一般都是以记忆为主!

一. 题目分析
以上这些题目,其实都是围绕着Java中的数据类型来进行提问的,考察的重点就是求职者对数据类型的掌握情况。因为Java中数据类型分类较多,初学者容易记混,并且在数据类型这一块又涉及到类型转换,开发时有可能会因为类型转换导致一些bug。另外我们在编写代码时,不同的变量也应该选择合适的数据类型,这样有利于优化内存分配。 所以面试官针对这些来提问,目的就是在考察求职者的语言基础是否扎实。

二. Java中的数据类型
我们在接触任何一种编程语言时,都会存在对数据类型的认识,有复杂的,也有简单的。这些数据类型都需要我们在学习初期去了解和掌握,所以各位请跟着 壹哥 来看看关于数据类型的知识吧。

  1. 静态类型和强类型
    因为Java语言是 静态类型的(statical typed) , 也就是说Java中的所有变量和表达式的类型,在编译时就已经完全确定了。所以我们在使用变量时,必须先声明其类型,即在创建的那一刻就已经确定好了该变量的类型。在后面的使用中,你只能将这一指定类型的数据赋值给该变量,如果强行将其他不相干类型的数据赋值给它,就会引发错误。比如一旦声明了一个int类型的变量,那么之后就只能将int类型的数据赋值给它,否则就会引发错误。

由于Java是静态类型statical typed的语言,这也就导致了Java是 强类型(Strong typed) 的语言,因为语言的强弱体现在对类型的检查严格与否上。 弱类型语言对于变量类型的检查比较宽松,容忍隐式类型转换这种事情的发生,强类型则反之。所以强类型意味着每个变量都必须具有一种类型,每个表达式也都必须具有一种类型,并且每种类型都是有严格定义的。类型限制了该变量可以持有存储哪类值,表达式最终产生什么类型的值,同时也限制了这些值可以进行的操作类型以及操作的具体方式。所有的赋值操作,无论是显式的、还是在方法调用中通过参数传递的,都要进行类型的兼容性检查。

  1. 数据类型概念
    现在经过上面壹哥对静态类型和强类型概念的介绍后,我们就可以很好的理解数据类型的概念了。

所谓的数据类型,在计算机语言里面,我们可以把它理解成是针对内存位置的一种抽象的表达方式。简单的来说,数据类型就是对数据的一种分类,根据每种数据各自的特点进行类别的划分,每种数据类型都与其他类型不同。 举个栗子:我们可以把不同的数据类型理解为存储在不同箱子里的不同类别的内容,有的箱子里只能装固体,有的箱子里只能装液体,有的箱子里只能装气体......这些箱子会存放在不同的地方,里面的东西也不能混装,每个箱子里的东西也都属于不同的分类。

  1. 数据类型分类
    在Java里面,整体上把数据类型分成了两大类:基本类型(primitive types) 8个 和 引用类型(reference types) 5个,我们来看一张完整的分类图,如下所示:

Java里的数据类型都有哪些

接下来我会对基本类型和引用类型分别进行介绍。

3.1 基本类型
基本类型 是Java中预定义的类型,有相应的保留关键字来表示,具有明确的取值范围和数学行为, 表示了真实的数字、字符和整数。基本类型的数据都是单个值,不是复杂的对象,所以基本类型并不是面向对象的,这主要是出于效率方面的考虑。但同时Java中也为基本类型提供了对应的对象版本,即基本类型的包装类(wrapper)。我们可以直接使用这些基本类型,也可以使用基本类型的构造数组或者其他自定义类型。

基本类型 包括布尔(boolean)类型、数值类型(numeric types),数值类型又分为 整型(integer types) 和 浮点型(floating-point type) 。整型有5种:byte、short、int、long、char(char本质上是一种特殊的int);浮点类型有float和double。所以基本数据类型分类如下:

byte、short、int、long、float(单精度)、double(双精度)、char、boolean

基本类型具体信息表:
Java里的数据类型都有哪些

3.2 引用类型
引用类型(The value of reference types are references to objects)中的引用,一般是指某个对象的内存地址,其中对象是动态创建的类实例或者动态创建的数组。另外Java语言本身不支持C++中的结构体(struct) 或联合体(union) 等数据类型,这种复合数据类型一般都是通过类或接口进行构造 。 引用数据类型分类如下:

类、接口、数组、枚举、注解

3.3 关于null值
另外还有一个特殊的值null,我这里再给各位解释一下。null是一种特殊的type,但你不能声明一个变量为null类型,null type的唯一取值就是null。 null可以赋值给任意的引用类型或者转化成任意的引用类型。我们在开发时,一般是把null当做常量字面值,这个字面值可以赋值给任意的引用类型。

  1. 基本类型与引用类型的区别
    不论是基本数据类型还是引用类型,他们都会先在栈中分配一块内存。对于基本类型来说,这块内存区域中包含的是基本类型的具体数据内容;对于引用类型来说,这块内存区域中包含的是指向真正内容的指针,而真正的内容则被手动的分配在了堆中。

三. 基本类型的取值范围

  1. 基本类型取值范围
    回顾了Java中的数据类型之后,我们再来复习一下基本类型的取值范围大小。我们知道,所有的基本数据类型都有固定的存储范围和所占有的内存空间大小,且不受具体操作系统的影响,以保证Java 程序的可移植性。每种数据类型所占的内存空间大小如下:

byte: 1个字节,取值范围 -128 到 127
short: 2个字节,取值范围 -32768 到 32767
int: 4个字节,取值范围 -2147483648(-2的31次方) 到 2147483647(2的31次方-1)
long: 8个字节,取值范围 -9223372036854775808(-2的63次方) 到 9223372036854775807(2的63次方-1)
float: 4个字节,取值范围 -3.40E+38 到 +3.40E+38 有效位数7-8位
double: 8个字节,取值范围 -1.79E+308 到 +1.79E+308 有效位数15-16位
char: 2个字节,取值范围 0-65535,共65536个字符
boolean: 不确定,取值范围 true、false
基本类型取值范围详情表:

Java里的数据类型都有哪些

所以从上表中,我们就可以知道, Java中的 int 占了4个字节32位。

  1. 各基本类型大小关系
    另外我们还可以用下图展示各基本类型按取值范围大小的对比关系:

Java里的数据类型都有哪些

四. 基本类型之间的转换

  1. 类型转换
    在Java中,将一种类型的值赋给另一种类型是很常见的,在这个赋值过程中有可能会进行类型的转换,转换分为自动转换和强制转换。自动类型转换(隐式转换)无需进行任何操作,而强制类型转换则需要显式转换,即需要使用强制转换操作符(type) 。

注意:

boolean类型与其他所有的7种类型都不能进行类型转换,而其他7种基本类型彼此之间都可以进行转换,但可能会出现精度损失或者其他的一些变化。

  1. 自动转换
    2.1 自动转换时机
    那么什么时候会进行自动转换呢?

一般当一个较"小"的数据与一个较"大"的数据一起运算时,系统会自动将"小"数据转换成"大"数据,再进行运算,这时就发生了自动转换。

首先我们将7种类型按从小到大的顺序排列一下:

byte < (short=char) < int < long < float < double

这里我们所说的"大"与"小",并不是指占用的字节有多少,而是指表示值的范围大小。

在上面的7种类型之间,如果数据类型是从小转换到大,可以进行自动转换, 自动转换时会发生扩宽(widening conversion) ;而从大到小,必须进行强制转换;short和char两种类型之间也必须强制转换。 这是因为较大的类型(如int) 要保存较小的类型(如byte),内存总是足够的,不需要强制转换。我们直接将整型字面值(常量)赋值到byte、short、char、long时,其实也是自动进行了类型转换。比如下面的源码:

//“小”转“大”,自动转换
byte b = 100;
int i;
i = b;
System.out.println("i=" + i);

//“大”转“小”,强制转换
int i;
float f = 20000f;
i = (int) f;
System.out.println("i=" + i);

//short与char之间需要强制类型转换
short s = 100;
char c = 90;
s=(short)c;
System.out.println("s="+s);

2.2 自动转换时的精度损失
除了以下几种情况可能会导致精度损失以外,其他的转换都不会出现精度损失。

int--> float

long--> float

long--> double

float -->double without strictfp

除了可能的精度损失外,自动转换时不会出现任何运行时异常。

  1. 强制转换
    3.1 强制转换语法
    如果要把"大"的转成"小"的,或者在short与char之间进行转换,就必须进行强制转换。这也被称作缩小转换(narrowing conversion),这是因为必须显式地使数值变得更小 以适应目标类型。严格地说,将byte转为char不属于缩小转换narrowing conversion,因为从byte到char的过程其实是byte-->int-->char,也就是既有扩宽操作widening,也有缩小操作narrowing。强制转换时需要采用转换操作符(目标基本类型),格式如下:(target-type) value

//强制转换案例
int x=300;
byte y;
y = (byte)x;

3.2 强制转换的问题
另外强制转换除了可能的精度损失外,还可能使模(overall magnitude)发生变化。即如果整数的值超出了byte所能表示的范围,结果将对byte类型的范围取余数。例如a=257超出了byte的[-128,127]的范围,所以会将257除以byte的最大范围(256),然后得到余数b=1。需要注意的是,当a=200时,此时除去256取得的余数应该为-56,而不是200。

//强制转换时模发生了变化
int a = 257;
byte b;
b = (byte) a;
System.out.println("b=" + b);//b=1

//a=200,余数=-56
int a = 200;
byte b;
b = (byte) a;
System.out.println("b=" + b);//-56

将浮点类型赋给整数类型的时候,会发生截尾(truncation),也就是会把小数的部分去掉,只留下整数部分。 此时如果整数超出目标类型范围,一样会对目标类型的范围取余数。

//浮点赋值给整形,会截尾
float f=100.58f;
int i;
i=(int)f;
System.out.println("i="+i);//100

强制转换时可能会导致溢出或精度的丢失。

3.3 表达式中数据类型的自动提升
我们表达式中可能会有+、-、*、/等各种操作符,在执行这些表达式时,则可能会发生数据类型的自动提升,有以下规则:

所有的byte、short、char型的值将被提升为int型;
如果有一个操作数是long型,计算结果是long型;
如果有一个操作数是float型,计算结果是float型;
如果有一个操作数是double型,计算结果是double型。
//表达式中的类型自动提升
byte b;
b = 10;
//因为此时b已经进行了类型提升,所以如果这里不进行强制类型转换则会报错
//b=b*2;
//此时必须进行强制类型转换
b=(byte)(b*3);
System.out.println("b="+b);//b=30

//类型提升为long
int i=400;
long l=500;
//这样会报错
//int x=i+l;
//这样没问题
long x=i+l;
System.out.println("x="+x);//x=900

五. 结论
至此,壹哥 就给大家梳理出了 “Java中数据类型” 相关面试题的答案,我们再看看前文中提到的面试题!

Java里的数据类型都有哪些

然后我再梳理一下这些问题的回答要点:

先简单回顾Java中的数据类型;
然后详细说明Java中的8种基本类型,每种类型的作用、取值范围;
接着说一下各类型之间的转换问题;
详细说一下自动类型转换和强制类型转换。
这些面试题的重点答案,我已在内容中用红色标明了,这些内容需要理解的东西并不多,主要是以记忆为主,各位好好记一下吧!

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
java 大数基本操作
导言:  计算机中数字的表示范围是有一定的限制的,像Java中,常用的数据类型,如int、double等数据类型表示的范围都是有限的,当我们要计算的数字,其位数达到成百上千时,这些数据类型无法满足我们的需求,C语言中我们可以使用数组来储存位数,再对两个数组进行相应的运算;Java中为了处理大整数的运算,提供了一种数据类型:BigInteger,BigDe
阿里程序员的Java之路!2021年最新Java面试点梳理
面试题模块介绍:一、Java基础JDK和JRE有什么区别?和equals的区别是什么?两个对象的hashCode()相同,则equals()也一定为true,对吗?final在java中有什么作用?java中的Math.round(1.5)等于多少?String属于基础的数据类型吗?
腾讯T3团队整理,持续更新中
Java基础1.JAVA中的几种数据类型是什么,各自占用多少字节。2.String类能被继承吗,为什么。3\.两个对象的hashCode()相同,则equals()也一定为true,对吗?4\.String属于基础的数据类型吗?5.Java中操作字符串都有哪些类?它们之间有什么区别?6.Java中IO流分为几种?7.BIO、NIO
Wesley13 Wesley13
3年前
Java对象的浅拷贝和深拷贝&&String类型的赋值
Java中的数据类型分为基本数据类型和引用数据类型。对于这两种数据类型,在进行赋值操作、方法传参或返回值时,会有值传递和引用(地址)传递的差别。浅拷贝(ShallowCopy):①对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,
Wesley13 Wesley13
3年前
Java语言入门篇基本概念
题言:写下这篇博客主要是回顾从黑马程序员学来的基本概念,并加深对java语言入门知识的理解,希望对于你们有帮助。由于常量、变量、运算符、方法入门、流程控制都很容易理解以及牢记,就不做篇幅去总结。1、数据类型转换(byte、short、charintlongfloatdouble)四类八种基本数据类型:!(htt
Wesley13 Wesley13
3年前
Java内存管理
勿在流沙筑高台,出来混迟早要还的。做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!作为Java程序员,Java的数据类型这个是一定要知道的!但是不管是那种数据类型最终存储都要到内存中,本文由浅入深对数据类型进行介绍和讲解,相信读完本文你一定会有收获的,会对Java数据类型有更深的了解和认识!
Wesley13 Wesley13
3年前
Java int与Integer的区别
int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别:int是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象1.Java中的数据类型分为基本数据类型和复杂数据类型int是前者而integer是后者(也就是一个类);因此在类进行初始化时int类的变量初始为0.而Integer的变量则初始化为n
待兔 待兔
1年前
JS的数据类型你了解多少?
JS的数据类型你了解多少?作为JavaScript的⼊⻔级知识点,JS数据类型在整个JavaScript的学习过程中其实尤为重要。因为在JavaScript编程中,经常会遇到边界数据类型条件判断问题,很多代码只有在某种特定的数据类型下,才能可靠地执⾏。希望
压力测
压力测
Lv1
是谁,在寒冷的冬天,掀开被单,冰冻爱情的温暖。
文章
5
粉丝
0
获赞
0