我觉得基本数据类型大家学计算机的应该都懂,但是韩顺平老师讲的基本类型的使用细节我觉得有必要记录一下,重新学的时候才发现有了新的感悟!
一、整数类型
使用细节:
1、Java各整型类型有固定的范围和字段长度,不受具体OS[操作系统]的影响,以保证Java程序的可移植性。(简单理解就是必须要标准一样,如果不一样的话,不同操作系统下就会产生不一样的结果)<——个人语言🤣不严谨哈
2、Java的整型变量(具体值)默认为int型,声明long型常量须在后面加 ’ l ’ 或 ’ L '。
(这里要注意,不要写成 int a = 5L,我们知道 int 是4字节的,而 long 是8字节的,相当于把8字节的数据硬是放进4字节的空间,肯定放不了滴!相反,把 int 型放进 long 型是放的了的,这是忘记加后缀的情况。)
3、Java程序中变量常声明为 int 型,除非不足以表达大数,才用 long 。(其实就是避免空间浪费啦)
4、bit:计算机中的最小存储单元。
byte:计算机中基本存储单元,1byte = 8bit。(比较基础的计组知识,一定要记住。)
二、浮点数
使用细节:
1、面试可能会问:浮点数 = 符号位 + 指数位 + 尾数位
(想了解更清楚的可以看一下这个文章:一文彻底掌握浮点数)
2、与整数类型类似,Java浮点类型也有固定的范围和字段长度,不受具体OS的影响。[float 4个字节,double 8个字节]
3、Java的浮点型常量(具体值)默认为double型,声明为float型常量,须后加’ f ‘或’ F '。
float num1 = 1.1F; //正确
double num2 = 1.1; //正确
double num3 = 1.1f; //正确!小精度可以放进大精度的类型里面
最后一条代码可以这样理解:一个1米的小孩在2米的床上睡觉,但是不能在5厘米的床上睡觉(那应该是豌豆公主吧🥰)
补充:记得要加’ f ‘和’ F ',不然报错。
4、浮点型常量有两种表达方式:
①十进制数形式:5.12 512.0f .512(前面的0可以省略,但必须有小数点)
②科学计数法形式: 5.12e2【5.12 * 102 】 5.12e-2【5.12 / 102】,里面的e也可以换成E
4、通常情况下,应该用double型,因为它比float型更精确。
通过上面的结果可以看到,float后面有部分丢失了,所以尽量使用double型。
5、浮点数使用陷阱:2.7 和 8.1 / 3 的比较
先来段代码:
/**
* @author 颜安青
*/
public class Hello{
public static void main(String[] args){
double num1 = 2.7;
double num2 = 8.1 / 3;
System.out.println("num1: "+num1);
System.out.println("num2: "+num2);
if(num1 == num2)
System.out.println("num1 == num2");
else
System.out.println("num1 != num2");
}
}
看到这里你是不是觉得 num1 == num2 呢?NoNoNo,错啦,看一下输出结果吧。
按照我们的数学思维,8.1 / 3 应该是等于2.7的,但是从计算机的角度上看,计算机中对浮点数的表示并非百分百精确的,在表示和计算过程中都有可能丢失精度。并且,8.1这个数本身在计算机中用double类型存储,可能存储成8.100000001,这都是可能的,所以浮点数的运算结果比较是不等的。(个人理解哈,如果想了解的更详细记得去看一文彻底掌握浮点数))
那么怎么判断两个浮点数相等呢?其实我们应该判断的是:两个数之间的差值的绝对值在我们规定的某个精度范围内,只要在范围内就可以近似相等。
if(Math.abs(num1-num2) < 0.000001){ //0.000001是可以自己规定的
System.out.println("差值非常小,到规定的精度范围内,认为近似相等!");
}
结果:
三、字符型
Java中字符类型是char,占两个字节(可以存放汉字),多个字符用字符串String。
(区分一下:C语言中没有Boolean和String型,并且char类型是占一个字节的,当时我学习的时候也很震惊😄我通过一些资料的查询,就简单理解为:不同语言编译器用的编码集不一样,一些类型的所占字节也会随之变化,总结就是类型大小由编译器决定。 <–所以有可能C语言中char类型也会有两个字节,极少数情况。可以看一下别人的回答:char为什么占两个字节)
使用细节:
1、字符常量是用单引号(‘’)括起来的单个字符。
这些是基础,当各位都是会的,不讲很细。
2、Java中还允许使用转义字符’ \ '来将其后的字符转变为特殊字符型常量。
char c = '\n'; //换行
3、在Java中,char的本质是一个整数。我们要知道一个概念,Java中默认使用的编码是Unicode码,所以输出的是Unicode码对应的字符。
怎么理解呢?我们可以用计算机输入字母、数字、中文、符号等内容,而计算机是用二进制的方式去存储的,所以我们输入的字符每一个都对应着一个独一无二的二进制数,当输入的时候将字符存储为二进制数,当输出的时候将二进制数转换成字符。
‘a’ 对应的十进制是97,这也意味着,我们可以 char c = ‘a’,也可以char c = 97的形式去赋值,也可以进行运算。
想了解字符编码的可以看这几个链接:
⭐⭐超级推荐去看这个:程序员必备:彻底弄懂常见的7种中文字符编码
结合Java详谈字符编码和字符集
这里提示一点,我们的中文其实每一个汉字都有对应的编码,比如大家可以打开一个网站自己去查看汉字对应的编码:Unicode转换
白框框里面的是中文字符,而黑框框对应的就是Unicode码(来自程序员的浪漫啊❤)
敲重点:面试时问字符类型本质,那该怎么回答呢?
个人理解:字符都有相对应的编码值,字符型通过二进制的形式存储到计算机中,而输出时将二进制数转换成字符显示。
比如’ a ‘:
存储:’ a ’ --> 码值97 --> 二进制(1100001) --> 存储
读取:二进制(1100001) --> 97 --> ’ a ’ --> 显示
补充个小点:平时工作中用的最多的是utf-8编码集,它最灵活了
99%的前端写网页时都会加上,99%的后端工程师新建数据库时都会加上DEFAULT CHARSET = utf8
来个链接拓展:mysql编码问题——charset=utf8你真的弄明白了吗?
四、布尔型
boolean类型数据只允许取值true和false,无null,占一个字节,适用于逻辑运算。
使用细节:
不可以0或非0的整数替代true和false,这点和C语言不同。
本人正在B站跟着韩顺平老师学Java(非广告),所以做个笔记仅供学习,文章虽标为原创,但大体思路是韩顺平老师的授课思路,在此基础上加上了自己的理解,不喜勿喷哦。
大家一起学,一起进步!!
各位宝子们如果觉滴还不错的话,可以点个赞 or 收个藏 or 打个赏哦,佛系博主一个。