声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。安全
不可变字符串String可让它可变,只是不可变是为了能进行程序上的优化。并非真的不可变,反射机制可让它变。服务器
可变字符串StringBuffer和StringBuilder它们两个实际上是一家人,只是有一部分不同。网络
它们的继承结构是同样的,所继承的父类都是同一个。接口也是同样的。构造器也没什么不一样,结构都是同样的。不一样的是 StringBuffer的每一个方法上都有synchronized关键字——同步关键字,StringBuilder没有同步关键字。多线程
可变字符串,能够往里追加,也能够用insert往里插入,还有delete删除,这些都要对本来的字符串进行修改。工具
若是有多个任务一块儿使用StringBuilder修改数据,那这里面的数据就确定会遭到破坏。因此StringBuilder没有预料到这个问题。你们共同使用一个可变字符串的时候就会形成可变字符串的混乱。学习
在这方面StringBuffer里面的全部方法都是同步的,也就是说一次只容许一个任务进去操做,其余的不容许操做。必需要等这个操做完下一个才能进去。优化
StringBuffer一次只容许一个任务进去访问,必需要等这个操做完下一个才能进去,不容许多任务访问。而StringBuilder就容许多任务访问。这就是它们的不一样之处。ui
加上同步关键字就是加上了访问权利,必须排队访问才行。这就是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能加密不能解密