数据类型扩展以及面试题讲解
今天的内容极为重要,请认真学习
昨天大家学习了数据类型,如果数据类型学好了后,先给大家讲解一些常见的问题,没学好的同学是没要认真学完在来看,基础没打扎实就开始建楼,那是不是很容易垮掉所以请大家认真学习
今天要讲解的是数据类型常见的一些问题,或者说是面试题的讲解
整数扩展
我们都只到在计算机内都有一些进制算法:什么二进制八进制,而在我们的java程序中也是可以表示的
二进制(0b):以0b开头的计算机进制
十进制:我们生活中常用到的
八进制(0)和十六进制(0x),以0 和0x 表示,在工作中可能遇到的
通过 sout的输出可以得出这些进制的数字
大家有没有发现一个规律,十进制输出的10就是10,而八进制输出的10,却是8,十六进制的是16,本质上是一样的,十进制是逢十进一,八进制就是缝八进一,十六进制就是缝十六进一
那以这样的本质,十六进制就是x,到后面,是不是0-9 A-F,那十六进制的11是不是就17了,道理都是一样的
(这一段没听大懂,不知道怎么表达)
以上是整数类型的拓展,整数拓展完是不是还有浮点数和字符呀,不急我们一个一个来,
浮点数拓展
浮点数就是小数,浮点数不是有两个关键字:float和double,这两个关键字是有问题的进了公司是不能用这两个计算的,给大家演示一下
我们给这两种类型个附一个值,一个**(0.1),一个(1.0/10),两者都等于0.1**,,然后我们再用sout的公式,用两个等号来判断两者是否相等,再单独输出两者,看看会有什么结果,
我们可以看到两者输出的都是0.1,但是上面的false很显眼,那两者输出的都是0.1,为什么会不相等呢?
我们进入调试里看看,点击这串代码前面的红圆,然后点击右上角的昆虫图标,进入调试
可以看到进入调试后,看到两者都等于0.1,那这是怎么回事呢,那关掉调试模式,
我们再输入一串代码,这次用float,变量为d1,随便设个长一点的值,然后在下面设个 d1+ 1 ,再看他们是否相等,看看会怎么样
可以看到,d1是我随便打出很长的数字,但是d1+1还等于d1本身,但下面显示的是true,还是等于他本身,可以看到这个浮点数是有问题的,
告诉这背后的原因,这个浮点数能表达的字长是有限的,但是数字是无限的,浮点数既然是有限的,但它也是离散的,但也是有区别的,浮点也有舍入误差,就是四舍五入的那种,这么长的数没有办法精确表示,所以它的结果是个大约数,跟小学学过的约等数是一样的,这个结果是约等于,由于数字过长,d1只能约等于d2,接近但不等于
所以得出的结论是:最好完全避免使用浮点数进行比较,这句话一定记牢,既然不用浮点数来表示那应该用什么表示呢?,到后面我们会学到一个类叫BigDecimal
字符扩展
昨天学过的字符类型,用 char表示,只能代表一个字符,不管是中文还是符号,英文,都是一个字,这样是没有任何问题的,
但是有个叫强制转换,在量值前面加个int,就可以强行改变它的输出结果,但不是所有东西都可以强行转换的,但这个字符拓展是可以的,看看结果,
我们可以看到,输出我们的a和中两个字是没有问题的,但是在他们前面加个int后,a就变成了97,而中这个字就变成了20013,加上int后都变成了数字,
所以所有字符的本质还是数字
通过单引号表示字符常量是没有任何问题,但是这个char类型会涉及到一个编码的问题,编码内有个Unicode,这个东西可以处理各种语言的文字,最多可以表示65536个数字,在早期的Excel,里它能表达的数字是2的16次方,就等于65536,到现在,Unicode等表达的是远远不至这么少的
在Unicode里是有一张表格,里面就有 97表示a,20013表示中,
讲那么多还不如直接实际操作一波,
Unicode中也有个转译的编码,比如有:U000 = UFFFF,来用数字表达文字,我们试着输出一下
可以看到我用转译编码输出的**\u0061变成了a**,里面都是由Unicode的编码的,但是我们能正常写就正写吧,那样写很麻烦的
这些都是底层的原理,如果面试被问到了这个问题,就可以跟面试官讲出来,
转译字符 \t
这个转译字符跟Unicode很像,
先写个sout,输出个**(hello , world)**,这时候回想Unicode,这逗号是不是也可以有一个东西来代替呀,这个叫转译字符,
可以看到,逗号原本在的那个位置换成了**\t 和 \n**,他们分别表示空格和换行,这种转译字符在网上有,大家可以自行去寻找
以上就是数值类型的拓展,现在给大家讲个骚操作,看不懂没关系以后会学到,这里就是给大家预告一下后面要学的东西
String sa = new String("Hello World");
String sb = new String("Hello World");
System.out.println(sa==sb);
String sc = "Hello World";
String sd = "Hello World";
System.out.println(sc==sd);
我们试着运行这串代码
大家可以看到两个“helloworld”进行比较,得出来的结果,上面的是不相等的,下面的是相等的,大家可以思考一下为什么,等学到对象的是给大家分析一下从内存分析
布尔值扩展
我们生活中都需要判断是非对错,如果这条路是对的那我们走下去,如果是错的那我们就不走了,而扩展的也是这个内容,
我们先写个布尔值为true,,再给他设个“如果”用“if”判断
如上大家看到,第一行写的是,Boolean,表示flag=true
第二行的 if 就是如果,如果flag=true那要执行什么代码,就是这么个意思,
那第三行, if(flag)的意思和第二行是一样的,有些新手怕自己写错,就加个flag=true,会更保险一点,等写得熟练了,直接写个flag就行了,
而等到你们到了大佬级别就再也看不到第二条这种的代码了,因为有这么一句话是,Less is more! 代码要精练易懂,因为一些大型的开源代码都是要这么简洁的,但是作为新手,还是强烈建议使用第二行的方式,等熟练了再换.