IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【JavaSE基础】基本数据类型族谱及易错点代码分析 -> 正文阅读

[Java知识库]【JavaSE基础】基本数据类型族谱及易错点代码分析

??引言??

????????????????大家好啊,我是执梗。Java有八大基本类型,很多同学只对经常使用的int类型比较了解。有的同学是刚从C语言转入Java学习,误以为两者的基本数据类型完全相同,这也是大错特错的。今天这本Java基本数据类型全解析大字典,可以帮助你直接通过目录找到你想要了解某一种基本数据类型。

??问答小剧场???

以下会产生信息丢失的类型转换是( )

? ? ? ?????????A.float a=10;

? ? ? ? ? ? ? ?B.int a =(int)8846.0;

? ? ? ? ??? ? ?C.byte a=10;int b=-a??

???????????????D.double d=100

可直接跳转至结尾看答案加解析

??目录??

?🎃1.八大基本数据类型族谱

?🎃2.八大类型细节解析

? ? ? ? ? 🎨1.byte

? ? ? ? ? 🎨2.short? ??

? ? ? ? ? 🎨3.int

? ? ? ? ? 🎨4.long

? ? ? ? ? 🎨5.char

? ? ? ? ? 🎨6.float

? ? ? ??? 🎨7.double

? ? ? ? ? ? ? ? ? ?🎨8.boolean

?🎃2.小剧场解答


?🎃1.八大基本数据类型族谱

? ? ? ? Java的八大基本数据类型包括——byte、char、short、int、long、float、double、boolean(不包括String。?其中byte、shory、int、long为整数类型,char为字符类型、float、double为浮点数类型(也可以理解为小数类型),boolean为布尔类型,只能取boolean或者false。

八大基本数据类型基本信息(建议收藏):

?🎃2.八大类型细节解析

? ? ? ? ? 🎨1.byte

? ? ? ? ? ? ? byte是Java八种数据类型之一的字节关键字。我们通常说的占几个字节说的就是它了,byte由8个bit位组成。一个bit位指的是二进制的一位,也就是只能取0和1。但我们Java中除了boolean和char不区分正负号,其余类型都是有正负的,为了表示正负Java中用最高位的1个bit位来表示正负,0为正,1为负。我们直接通过二进制来找一找byte的取值范围

 //首位为0表示正数,为1表示负数
        String a="01111111";
        System.out.println(Integer.parseInt(a,2));//127

从结果来看我们知道,当后面7位全取1首位取0时,byte能取到最大值为127,当首位为1时,取到最小负数为-127。诶?不对啊,上面明明说byte取值是[-128,127],照你这么说-128去哪了?别急,其实大家都忽略了一个问题,0是没有正负的,所以这时你不能说无论首个bit位是0还是1都当做0,这样肯定是不行的,不仅容易出问题还浪费资源空间。所以我们规定当为10000000时,看上去好像是-0,我们就把它当做为-128。这个大家了解一下即可,因为其中还涉及到一些正反补码的知识。

       byte a= (byte)0B10000000;
       System.out.println(a);//-128

????????????????????1.赋值报错以及强转原则? ? ? ? ? ? ? ? ? ? ????? ? ? ? ? 先看上图的报错信息,首先a和b报错,提示我们提供的类型不对,这是因为我们赋的值超出了byte的取值范围,而且在Java中默认的整数类型为int,浮点数类型为double? 。所以它这提示我们提供的类型不对。有的人肯定就说了,诶你不会强转吗?在我们Java中大的数据类型可以强转成小的数据类型?。难道你不知道吗?别急,当然可以强转,我们试试给两个超出byte范围内的值强转会怎样

        byte a=(byte)10000;
        System.out.println(a);//16

? ? ? ? ? 会发现10000强制后得到了16,它是怎么得来的呢?别急,我们来看看10000和16的的二进制表示????????

        System.out.println(Integer.toBinaryString(10000));//100111  00010000
        System.out.println(Integer.toBinaryString(16));//00010000     

? ? ? ? 发现没,10000的二进制表示的后八位,就是16的二进制表示,因为int类型占4个字节也就是32个bit位,而我们byte只有8个,所以当int强转为byte时,我们只取int的后8个bit位,取到多少则强转为多少。但是这里要注意我举的例子强转前后都是正数,当有负数时会发现好像我们的结论不成立,那是因为计算机在储存负数时是以反码的格式存储,我们平时看见的二进制都是正码,想深入了解的同学可以找文章了解一下,想自己举例验证的尽量都举一个强转前后都为正数的例子。

? ? ? ? ? ? ? ? ? ?2.参与运算升级为int?

? ? ? ? ? ? ? ? 有些同学肯定会很纳闷,诶不对啊,我这两个byte一个10一个20相加得到30,30也没超出byte取值范围,咋说我得到的结果是int呢?这是因为在Java中有规定:在有byte、char、short参与运算时,得到的结果会自动提升为int类型。这是很多初学者都忽略的问题,大家一定要了解,这时是需要进行强转的,当然因为30并未超出byte取值范围,强转后c也为30。

? ? ? ? ? 🎨2.short? ??

? ? ? ? ? ? ? ?这里将short放到前面讲,是因为它和byte的性质其实差不多,只不过它的取值范围更大一些,但依旧小于int。short也是一个短整型数据类型,它占两个字节,那也就是16个bit位。我们同样通过代码尝试找一下它的最大值。

public static void main(String[] args) {
        String a="0111111111111111";//首位bit用来表示正负
        System.out.println(Integer.parseInt(a,2));//32767
    }

? ? ? ? ? ? ? 我们很容易可以看出short可以取得的最大值为32767,当首位bit位为1时则取到-32767。同样要留心像byte一样-0的情况,这时我们定义它的值为-32768。所以short的取值范围为[-32768,32767] 。short的易错点和byte其实一样,当给short赋值一个超出short的取范围时,数默认为int类型,因为short只占16个bit位,int类型占32个,则会舍掉前16个留后16个给short。同样short参与运算时也会升级为int,所以除了取值范围,short和byte的性质差不多。short也可以说是八大基本数据类型可以说是最冷门的一个了。

? ? ? ? ? 🎨3.int

????????? 作为最常用的数据类型,int相信是大家最熟悉的基本数据类型了。它占4个字节,也就是32个bit位。这里就不再重复上面步骤。因为是32位,除去一位符号位,在这顺手一提,Java中的基本数据类型中是没有无符号类型的,所以还剩31个bit位表示值。则取值范围为[-2147483648 ~ 2147483647] 。之所以int能成为我们最常用的基本数据类型,就是因为它的取值范围足够我们大多数的场景使用,选太大的long类型占用空间大浪费资源,选太小的short和byte容易溢出,而int的取值范围则恰好合适

? ? ? ? ? 🎨4.long

? ? ? ? ?long类型属于长整数数据类型,它占8个字节,也就是64个bit位。所以它的取值范围为[-9223372036854774808 ~ 9223372036854774807]。可以看出这个数是非常大的,但是因为太占内存,我们很少使用它。通常在运算时可能超出int类型造成溢出,我们才会使用long类型。如果直接给long类型赋值时,我们需要注意在末尾加上L或l,这是为什么呢?我们来用代码看看

????????

? ? ?发现没,我特意举的这个例子,当数在int范围内它没有报错,当超过int了它居然说整数过大?我long类型最大能取9223372036854774807你居然敢说我过大?难道你把我当成int了?你还真别说,JVM真把你当成int了,因为Java中整数类型都默认为int,你这是一个超过int类型的数它当然会提示过大。所以我们最好养成习惯,在给long类型赋值时,最好在末尾加上个L,告诉JVM我这是个long类型的值。

? ? ? ??

? ? ? ? ? 🎨5.char

? ? ? ? ?char类型属于字符类型,也是我们用的比较多的类型。它的存储占2个字节,也就是16个bit位,和short一样,那取值范围一样吗?当然不一样啦!char是取不了负号的,所以它不需要用1个bit位来表示正负,所以它的取值范围是[0,65535]。有的人肯定纳闷了,诶不对啊,char不是字符类型吗?那不是应该是什么a啊b啊这种字符吗?这就涉及到ACSII表了,我们的每个字符都可以用一个整数去表示,所以当你赋值一个合法范围内的整数,它就会自动转换为对于的字符,具体是什么字符就要去记一下ACSII表了?

        char a=97;
        char b=98;
        System.out.println(a);//a
        System.out.println(b);//b

? ? ? ? 如上图,97对于的为字符'a',98对于的为字符'b'。所以大家这里记住,26个小写的字母对应的ACSII表是从[97,122]

? ? ? ?这里也要注意,char参与运算时,也是会升级为int类型,这里我们在前面提过,如果这时我们将结果赋值给char就会无法通过编译,需要进行强转。? 就像如图报错,大家要注意这个细节。

? ? ? ? 当我们给char类型赋值一个超出取值范围的整数时,编译器此时会报错,这时我们需要进行强转。因为int是32位bit,char只有16位,所以char只会取int的后16位,然后转化为对于的字符。

? ? ? ? ? 🎨6.float

? ? ? ? float是浮点数类型中的单精度,在计算机中占用4个字节,也就是32个bit位,有效的位数为7位,浮点数类型也就是我们的小数类型。通常我们在给float赋值时,因为在其末尾加上f,以告知jvm我们这是float类型,我们直接给一个小数赋值,它会出现下面这种情况。

? ? ? 这是为什么呢?在整数类型中,我们默认的类型为int,而在浮点数类型中我们默认的类型为double。你给float赋值一个double当然会报错,这时就需要你进行强转,这时就会有损失精度的可能性。那为什么可以给float赋值一个int类型的值呢?虽然float虽然和int一样都占4个字节,但浮点数类型是比整数类型更大的,所以我们给float赋值int类型是可以的,它会自动加上小数部分,当给int赋值float时则会报错,需要强转,强转后所有的小数部分都会丢失。??

?? ? ? ? ? 🎨7.double

? ? ? ? double是Java中基本数据类型中浮点数类型的默认类型。它占八个字节,和long一样,开销还是比较大的,它是双精度。很多人好奇双精度和单精度有什么区别?其实也就是范围的问题,double有效的位数为16位。浮点数的使用唯一要记住的就是,能尽量使用float就float,因为double实在太占内存,而且运行速度慢于float。double赋值给float需要进行强转,即使有可能输出的值并未改变。

? ??

? ? ? double也是除去boolean类型里最大的数据类型,它可以强转为其余六种数据类型,不过当然会有精度的损失,将这六种数据类型赋值给double它都可以接收。

?? ? ? ? ?🎨8.boolean

? ? ? ? 作为八大基本数据类型最特殊的一种,boolean显得有些格格不入。它只占一个字节,因为它只有两种取值,boolean和false。这里需要提醒大家的是,C语言中可以用0和非0分别代表false和true,但这在Java中是不允许的。boolean类型也不可以接收其他基本数据类型的值,其他的基本类型也不可以强转为Boolean。

?🎃2.小剧场解答

答案选B

? ? ? ? 产生精度丢失只会出现在强转的情况下,也就是大的数据类型转为小的,在这里只有B选项产生了强转,由float转为int。

????????? ? ? ???

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 15:56:35  更:2022-01-03 15:56:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:07:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码