基本数据类型-数值型-整数类型

整数分为4个类型,byte、short、int、long,为什么一个整数要划分为这么多类型呢,可能很多人知道,但也有人不知道,这里还是讲一下,其实就是因为它们在内存当中占用的大小不同,byte空间占用很小,它是以一个8位来表示的,就是8个二进制位来表示一个字节数据,而short是以16个来表示的,一个8位中的0和1通过不同的排列组合生成的数是有限的而16个生成的数就比byte生成的多,byte的取值是-128到+127,负的2的7次方到正的2的7次方-1,8个二进制位就是2的7次方嘛,short就是负的2的15次方到正的2的15次方-1,也就是-32768到+32767,类似于天文数字,特别长,所以就是long类型,一般情况下凡是写整数默认类型就是int

基本数据类型-数值型-浮点类型

它分为两个类型float、double,单精度和双精度,什么意思呢,精度就是精确程度,大家都知道3.14不够精确,3.1415926也不够精确,3.1415926xxxxx后面100位够精确了吧,是的,所以单精度和双精度的最大区别就是精确程度不同,那么它们在内存中占用的空间也是不一样的,打个比方就是float单精度它的小数点后面的位数是有限的,而double会更长一些,float它占了4个8位也就是32个二进制位,而double占了8个8位,精度高嘛,凡是写个小数默认就是double,float f = 2.3;这样就会出问题,因为前面说了,凡是写小数默认就是float的,所以这样是不行的,应该是:float f = 2.3f;

不同数据类型相互计算及强转

byte b = 3; b = b + 2;如此公式,代表着byte类型和int类型相加,那么int类型比byte类型大会怎么进行相加呢,假如说int是4个碗,byte是1个碗,系统底层会自动将byte提升为4个碗后再进行运算,这个过程也叫:自动类型提升,这个过程是自动进行的,然后b + 2后我们要把结果给byte,但是这个时候是4个碗的内容进行运算了,如果再倒给1个碗,那么结局就很明了了,就是咱们上面说的,会损失精度,这个时候问题又来了,那么我们非要把这个倒给1个碗怎么办,那么强制转换又来了,b = (byte) (b + 2);前面加上你期望的类型就行了,也就是将b + 2的和强制转换为byte类型

讲点不一样
System.out.println(‘a’ + 1);这样会输出什么呢?字符a加1,答案是98,为什么呢?因为老美的ASCII码表的a对应的是97

android 字符串中给指定文字加颜色_转义


再+1就正好为下面的b也就是98,所以会输出98,那么由此可见,当char和int进行计算时,系统会将char转换为int再进行计算


那么我们可不可以这样呢,System.out.println((char) (‘a’ + 1));当然可以,它会输出b,因为计算后的结果为98再转为char类型就自然是b了


当然,如果对上面的ASCII感兴趣可以去网上搜索:ASCII码对照表

运算

a++和++a
a++叫做给a这个变量中的值进行一次+1操作,并将+1操作后的值重新赋给a
b = a++,先把a的值进行赋值运算,赋值给b,然后b有值了,然后a再自增,也就是a先出去运算然后再自增
b = ++a,即反过来a先加,再赋给b

转义字符

通过反斜线’'来转变后面字母或者符号的含义
例如System.out.println(“hello \n world”);想必大家都很清楚,\n就是换行了
还有很多
\n:换行 \b:退格,相当于backspace \r:按下回车键 \t:制表符,相当于tab键…
有人就要问了,换行和回车\n \r不都是一回事么,其实在linux中换行由一个字符来表示也就是\n而在windows中换行是由2个字符表示\r\n,而DOS中直接能识别\n

逻辑运算符

android 字符串中给指定文字加颜色_转义_02


想必这些大家在开发过程中已经比较熟悉了,图中范例也很清楚了

位运算符
位运算符,这个所谓的位就是2进制的位,也就是说用来进行二进制运算的

android 字符串中给指定文字加颜色_转义_03


例如3<<2,3左移2,因为是二进制运算,所以计算机就先把3变成二进制:


0000-0000 0000-0000 0000-0000 0000-0011,如果还看不懂二进制表现形式请看上一章博客,接下来往左移:


00 | 00-0000 0000-0000 0000-0000 0000-0011,看到 | 这个竖杠了吧,就是往左移,这个时候最后就会少2位,那么添两个0(记得看下面重点部分),那么结果就显而易见了就是12

6>>2,6右移2位呢,6的二进制:
0000-0000 0000-0000 0000-0000 0000-0110,右移2位
000000-0000 0000-0000 0000-0000 0000-01 | 10,前面自然补两个0(记得看下面重点部分),结果也是显而易见

规律:大家会发现无论是怎么移,都是以2的倍数有关,3<<2其实就是34,3<<1其实就是32,3<<3其实就是3*8,所以3<<2其实就是3×2的2次幂,3<<3其实就是3×2的3次幂往左移几位就是2乘以它的几次幂。6>>1 = 3,那么就是6 / 2的1次幂,6>>2也就是6 / 2的2次幂,也就是6/4,这两个都是整数所以运算完也是整数,也就是1,因为6里只有1个4,颠覆你的小学概念
<<:其实就是乘以2的移动的位数次幂
>>:就是除以2的移动位数次幂
那么就会有人问位运算有什么用呢,其实做运算的时候最快的就是位运算,像乘除这种东西用位运算是最快的,但是它们有局限性,也就是以2的倍数。
重点:大家会发现右移后高位就会空出来,我们知道左移就补0,那么我们右移高位到底要补什么,这个要按照原有数据的那个最高为值而定,如果你的数是1111-1111 … 1111-1010那么右移就得补1,如果把1都换成0,0换成1,那么前面要补0。那么如果你要用三个<<<无论你的最高为是0还是1,空出的位置都用0补。
结论:
>>:最高位补什么由原有数据的最高为值而定
如果最高位0,右移后,用0补空位。
如果最高为1,右移后,用1补空位。
>>>:无论最高为是什么,右移后,都用0补

6 & 3:要先把6和3都变成二进制,省略前面29个0
110
&011,规律:0就视为假,1就视为真,然后进行&运算
010,结果就是这样的,上面有& 逻辑运算符 的运算范例,如果还不会就去看看

6 | 5 =
110
| 101,与上面规律类似,这里是进行 | 运算
111,结果为7

^也是上面那个意思,不过它有一个规律,假如说7 ^ 4 ^ 4结果就是7,那么7 ^ 5 ^ 5结果也是7

~反码:例如下面这个二进制
0000…00011100,反码后
1111…11100011,规律:取反+1,假如~6就是6的取反+1结果就是-7

大家觉得有什么用呢?假如你一个数存到计算机里面都是二进制的,假如我取出来和一个数^一下,每一段数据我都给^一下一个值,产生出来那个数据也就不是原来那个数据了,那么这个时候其实就相当于加密了,数据被我用某一种规律给改变了,想看数据的时候我就能解密,这个时候我再^那个被^的数一下就解密了,就是类似于加密狗,一些自己的视频、图片之类的想自己看不给别人看就可以加密,当然也没这么简单,里面又^又|又&的是很麻烦的但是意思就是这么个意思。

三目运算符

int a = 1; int b = 2;
System.out.println(a > b ? 10 : 20);
三目就是这样写的,前面的a > b是判断,如果成立也就是true,那么就输出10,如果不成立就输出20
其实就是判断前面的判断然后根据判断选择 : 号两边的数值
格式:变量 = 条件表达式 ? 表达式1 : 表达式2;
好处:可以简化if else代码
弊端:有好处就有弊端,能简化自然就有局限性,因为是一个运算符,所以运算完必须要有一个结果