- 主要回忆学生时代的知识沉淀与工作编程注意
- -1(负1)的二进制你会写吗?
- 包装类与基本类型的切换滥用
- 干净整洁的代码
你好! 这里主要分享学生时代自学Java时的一些知识碎片,以及目前在工作中遇到的需要注意的一些地方。故比较零散与个性,系统的技术知识分享很多人都已经分享过且很多书籍都会写因此只分享一些灵光乍现,偶然想到的一些大家可能不重视但会开拓视野的一些零散知识。
经常奔波工作生活的你,眼前尽是整个世界的日月,不懂穹顶之上整个宇宙的浩瀚,地球上的那些破事穿过大气层几千亿个星系都不会了解。不懂宇宙的地球上的你正如不懂地球的池塘里的青蛙。
你不会写。以1个字节为例,0的二进制是 0000 0000,大家都知道,1呢,你也知道 0000 0001。那-1呢?-128呢?一个字节能表达哪个范围的数?
1个字节能表达的数的范围是:
0, 1, ……, 126, 127, -128, -127, ……, -1
结束,刚好256个数,一个字节最多能表达256个信息或数字。为什么以这样的顺序来写范围,是因为我是以二进制的顺序数目递增来写的,将上面的十进制的范围转换成二进制的范围则是:
0000 0000, 0000 0001, ……, 0111 1110, 0111 1111, 1000 0000, 1000 0001, ……, 1111 1111
结束,对比一下上面的十进制的范围,二进制只增加了一位,127瞬变到-128,-1的二进制居然是全为1。
你就开始好奇了,你会说 -1 不应该表示成1000 0001吗,因为第一位是符号位啊?这就涉及到负数补码的历史由来了,计算机只知补码,不懂原码。所以-1的真实存储在硬盘里的格式是1111 1111。这种对负数二进制的设计使得计算机在遇到负数时计算效率更高,故计算机里只有加法,没有减法。那么在遇到负数的计算时咋办,直接加负数的补码就行了。1加-1,1加127溢出到符号位(2个字节的才能加,如果你不注意否则你的程序会出现莫名其妙的运算错误),127加-1,自己用二进制加着看一下。
至于补码原码的由来与转换很多书籍都有介绍,其实也并没有那么重要,你要是懂得负数是如何存储的原理,补码原码你也能像考试时忘了数学公式但懂得原理一样把公式推出来。
在工作中会发现很多人在编程时对包装类的理解与由来不够深,导致基本类型和包装类随意切换滥用,可能是大家太喜欢包装类的自动装箱和拆箱了,Integer i = 1;直接等于多方便简单。这种随意性导致了暗藏空指针异常(NPE:NullPointerException),除非你能完全保证这个包装类一定不为空。
在方法内部编程时,比如局部变量,通常会写int i = num(包装类)(num是个入参的包装类或者一个对象的成员变量包装类),这种就会暗藏空指针异常,因为代码编译时Java编译器会主动给你加上一段代码int i = num.intValue();,当num为空是,空对象调用方法就会抛出空指针异常,这种Debug时你可能会很容易找出来,但是当调用方法传基本类型参数时且代码稍微复杂一些时,你可能就找不出这个空指针到底在哪抛的了,除非你对Debug操作特别精通。
包装类与基本类型最大的区别就是一个可以有null,一个不可以。在项目中各种DO、VO、POJO的属性都是包装类和一些其它类型,没有基本类型,就是为了利用包装类可以为null的特点,区分数据库或ES里有没有值,而基本数据类型必须有值。
故在工作中编程时不要随意切换滥用包装类型和基本类型,除非是计算的时候使用基本类型更加方便,这时判一下空更好。但又有人说了在业务上保证这些包装类属性一定不为null,既然用不到null那干脆直接用基本类型呗。
工作中每当看到源码编写时的随意性就会痛心疾首,这正如写作文一样,漂亮的字体阅卷人读起来才能更加赏心悦目,以下建议编码时养成良好的习惯:
- 调用方法或声明方法的参数小括号(int i, int j)里参数之间逗号后打一个空格,所有逗号后都应该打一个空格;
- 方法声明的入参小括号()和大括号{}之间打一个空格;
- 关键字与括号之间、括号与括号之间打一个空格,比如if () {} else {},等等。
- if判断里尽量不要写== false,!=,前者多此一举,后者反等于难以阅读,除非只有!=分支或里面是主要的逻辑。
- 三元运算符尽量写一些简单的,没有重要的方法调用,因为里面会暗藏空指针异常,且难以阅读,也不要认为很装比,喜欢一行代码搞定。牺牲可阅读性的简洁代码都是装比代码。
以上这些代码编写规范,还有很多,在《阿里巴巴Java开发手册》书籍里都有,除了编写规范还有编程规范,IDEA也有对应的阿里巴巴编程规范插件,其实这些都是为了养成工程师们良好的编程习惯,有了好习惯也就并不需要插件了,并且这个插件其实你也根本不会去用。



