声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。
不可变字符串String可以让它可变,只是不可变是为了能进行程序上的优化。并不是真的不可变,反射机制可以让它变。
可变字符串StringBuffer和StringBuilder它们两个其实是一家人,只是有一部分不一样。
它们的继承结构是一样的,所继承的父类都是同一个。接口也是一样的。构造器也没什么不同,结构都是一样的。不同的是 StringBuffer的每个方法上都有synchronized关键字——同步关键字,StringBuilder没有同步关键字。
可变字符串,可以往里追加,也可以用insert往里插入,还有delete删除,这些都要对原本的字符串进行修改。
如果有多个任务一起使用StringBuilder修改数据,那这里面的数据就肯定会遭到破坏。所以StringBuilder没有预料到这个问题。大家共同使用一个可变字符串的时候就会造成可变字符串的混乱。
在这方面StringBuffer里面的所有方法都是同步的,也就是说一次只允许一个任务进去操作,其他的不允许操作。必须要等这个操作完下一个才能进去。
StringBuffer一次只允许一个任务进去访问,必须要等这个操作完下一个才能进去,不允许多任务访问。而StringBuilder就允许多任务访问。这就是它们的不同之处。
加上同步关键字就是加上了访问权利,必须排队访问才行。这就是StringBuffer的安全操作。
如果一个线程操作字符串,就用StringBuilder
如果多线程操作字符串,就用StringBuffer
StringBuffer是同步安全,StringBuilder是非同步安全、非线程安全。今后StringBuffer用得多。
封装数据类
在jdk1.5以前,封装数据类我们称为工具类——对数据类型的帮助:类型转换 在jdk1.5及以后封装数据类型也可以当作数据类型使用
( 1.4代码规范
Integer是int类型,不能当作int去使用呢。因为i是一个类,而100属于基本数据类型int,基本数据类型不能给一个对象变量
但是String字符串就可以。因为String字符串是在很早的jdk版本上就进行了优化,就是一个对象给了s。
基本数据类型不能给i。因为在jdk1.4的时候,做到一些相应的包装。所以只能new一下int,这是一种办法。
还有一个办法就是可以通过Integer里的valueOf()方法,它也可以帮你优化一下,但是这个方法需要在1.5才能用,1.5才有这个方法。
1.4要想用Integer就必须得new。封装数据类型就是一个工具类,没有办法直接接收基本数据类型的给值。要想拿它来寄存数值,必须new一下才可以把100存放进去。 )
( 10代码规范 1.5以后,做一些改变,把所有的封装数据类型都看作基本数据类型去对待。
看作int类型,直接可以等于100。
这种写法在后台编译之后的写法是这样子的:
) 在jdk1.5以前,是不可以这样赋值的;在jdk1.5以后就可以直接赋值。
这个在数据类型中就叫做自动装箱。
自动装箱——用封装数据类型接收基本类型数据,它会自动装箱。
基本数据类型int i2,i是对象类型,对象是肯定给不了基本数据类型的,就算用强制类型转换,也给不了。
那为什么这样子就可以呢?因为这里面有个自动拆箱的功能。
自动拆箱,真正来说,它调用的是里面的一个intValue()方法,自动拆箱,拆给了它。
自动拆箱——基本数据类型接收封装数据类型对象,会自动调用封装数据类型的方法进行拆箱操作
只有它有自动装箱和自动拆箱。
在Java1.5以后,它推荐大家今后不要用基本数据类型,使用封装数据类型。但其实封装数据类型占用的内存要比基本数据类型大,我们不太推荐这样去使用。如果万事万物皆对象的话,那就应该用封装数据类型。但用封装数据类型做计算的时候,应该调用它里面的方法去计算。如果还是用最基本的运算符去进行运算的话,还会牵扯到自动拆箱的功能。
它里面还有一个优化功能:
按照原理来说,这两个应该是不同的对象,但是结果发现这两个对象是一样的。那就说明,它的内存是一致的。
用等于号比较对象,除了基本数据类型,所有的都是按地址比较。
它这里面调用的是valueOf方法
这个方法里面写了一个判断。传进来的 i 是否大于等于-128,小于等于127。如果是在这个范围内,就从这个池里取出一个Integer的对象出来。如果不是在这个池里,就直接new一个Integer对象出来。100是池里取出来的对象,130不在这个范围内所以就是new出来的一个对象。
这两个是从池里面拿出来的对象,所以内存是一致的。
而它们两个在池里面没有取到对象,因为没有在这个范围内,所以new出来的两个对象,内存就不相等,打印出了false
它如果和基本数据类型混在一起就会自动拆箱。自动调intValue()方法转换成 int 基本数据类型,转换成基本数据类型再和130做比较。因为基本数据类型的判断是可以用等于号去判断。所以它自动拆箱,拆出130,130等于130。
注意:封装数据类型比较,应该使用equals,因为它们是对象
类型转换
字符串转int
所有的封装数据类型都有方法可以将字符串变成它们对应的基本数据类型
valueOf转出来的是Integer对象。这是专门用来自动装箱的。
给不了字符串
转到二进制能加密,能做很多相应的操作。
Integer可以将十六进制、八进制、二进制转成十进制,也可以将十进制转成二进制、八进制、十六进制,以及三十二进制。这就是Integer工具类的好处。
二进制转十进制
(不超过32位,因为int存储的最大位数就是32位)
八进制转十进制
十六进制转十进制
在传输数据的时候,很大的数值它牵扯的字符串有点长,就可以直接把它压缩成十六进制。一个数值压缩成十六进制,字符串就变短了。减少了占位,减少了空间存储。
所以进制转换的好处也是压缩了存储空间。传输的时候,传输数据也小了。
还有一种就是将这个文本转成二进制,然后再分析里面的相应信息。
需要把这10个设备的状态情况发送给服务器,通过一个主机发出去。
这10个设备的状态组建成一个字符串
这个字符串太长了,影响网络传输,去掉序号,只留下表示状态的数字,按顺序第一个就是第一个设备。再去掉逗号,还有10的字符串长度。如果今后设备多起来,字符串就会越来越长,这样描述状态就不太好。
8位 一个字节
3个字节描述了12个设备的状态
存储状态可以用位存储,节约空间。
所以进制转换是很有必要的,在这里用到位进行描述,然后转成字节,再解析就行了。
例题
截取,每8个转成1个字节
转成字节
需要找到Byte类型去转换字节
字符串转字节,二进制转
通过这种方式可以节约存储空间。以前是用文本存储的,浪费空间。用字节存储,一个字节8位。这就是状态描述的一种做法。 不管是什么进制转换,都是有很大的用处的。第一是缩短了存储,第二就是可以进行相应的加密。
MD5加密
加密后形成的密文不可解析,不能还原
比方说你的密码存储在服务器上,不可能明文密码给人家看。有人维护服务器的时候一看就知道了你的密码,这就很不保险。保险的办法就是把你的密码用MD5加密,他就算看见你的MD5密文,他也还原不出你的密码。
登录验证的时候,需要再把你输入的密码加密成MD5,看一下两个密文是否一致。如果两个密文是一致的,那密码就是正确的;如果两个密文不是一致的,那密码就不正确。
金融系统里的那些密码都是要拿MD5加密的,而且是MD5嵌套加密法。就算是一个数据维护员也看不到客户的密码,拿到的是密文,密文是翻译不出密码的。防止技术人员盗用人家的密码。
MD5能加密不能解密