JAVA学习系列,并不是从基础去讲java的知识,而是把我在学习或是工作中,一些思想、逻辑总结出来。
原先在工作中,因为测试的需要,经常要往数据库中批量的插数据。而表的主键用的是UUID,是由16进制字符加“-”组成的,还有设备的mac地址是由16进制字符加“:”组成的,那个时候,我刚学java,也不知道java里面有方法,可以生成UUID,所以我当时的解决方案是,给定一个初始的UUID,然后让UUID自增。当然,实现自增是需要做些处理的。UUID是由32个16进制字符组成,如果转换成二进制的话,就是128位,而在java里面,一个long类型的数字,也才64位,所以一个UUID要转换成数字的话,需要两个long来表示。所以,最终的处理逻辑就是:UUID先去掉分隔符“-”,再分成两半,两部分再转换成long,自增以后,再转换成16进制字符串,再拼接“-”,变成需要的字符串。当然mac的自增与这个类似。后来,我就思考,这字符串转成数字,自增以后又转换成字符串,转来转去的,可不可以不转换成数字就实现自增?基于这样的思想,就开始了我的探索之路。
要实现16进制字符串的自增,先从简单的做起,从一位数的加法做起,比如'f'+5,要怎么实现?那么要实现这个加法,需要解决三个问题:1. 把'f'转换成数字,再进行运算。2.运算之后的结果,再转换回16进制字符串。3.进位问题。解决方法就是:在方法内维护一个字符数组,元素是0-9a-f这几个字符,然后有了'f',那么就查找'f'在数组中的下标,下标是几,那么这个字符就转换成数字几。查找后,'f'在数组中的下标是15,那是'f'就转换成数字15,用15+5得到运算结果20,然后再把20转换成16进制,那么把运算结果转换成16进制,存在两种情况,一种是运算结果小于16,这个时候不需要进位,结果是几就是几,比如结果是11,不需要进位,那么就到字符数组中查找下标是11的元素,结果是'b',那么最终的结果就会显示为“b”