随笔分类 - 改善Java代码
摘要:建议24:边界,边界,还是边界 模拟一下输入: 这个数字远超了2000的限额,但是竟然预定成功了.这个2147483647是不是很眼熟?没错,这是int类型的最大值,因为这个值再加上1000的时候超出了int类型的范围,所以结果反而变成了负的。一句话归结其原因:数字越界使校验条件失效。 所以在单元测
阅读全文
摘要:建议23:不要让类型默默转换 打印输出: 诡异,dis2已经考虑到int类型可能越界的问题,并使用了long型,但还是出现了负值。 因为Java是先运算然后再进行类型转换的,即是说运算的时候是以int类型运算,最后才将类型转换成long类型,所以会发生越界的情况。 disc2的三个运算参数都是int
阅读全文
摘要:建议22:用整数类型处理货币. 运行结果: 奇怪了,为什么10-9.6输出结果不是0.4呢?这是因为浮点数特性所决定的,它有可能(注意是有可能)是不准确的,而是无限接近准确值,但不能完全准确。至于它为什么会有这个特性,这是由于浮点数的存储规则所决定的,具体啥,就不深究了。 0.4这个十进制小数如何转
阅读全文
摘要:建议27:谨慎包装类型的大小比较 基本数据类型比较大小木有问题,不过其对应的包装类型大小比较就需要注意了。看如下代码: 运行结果: 为什么(a==b)返回值会是false呢? 通过对比字符串比较来理解,基本类型100通过包装类Integer包装后生产一个Integer对象的引用a,而“==”使用来判
阅读全文
摘要:建议35: 避免在构造函数中初始化其他类 构造函数是一个类初始化必须执行的代码,它决定着类的初始化效率,如果构造函数比较复杂,而且还关联了其他类,则可能产生意想不到的问题,我们来看如下代码: 这段代码并不复杂,只是在构造函数中初始化了其他类,想想看这段代码的运行结果是什么?是打印“Hi,show m
阅读全文
摘要:建议37: 构造代码块会想你所想 镜像博文:http://www.cnblogs.com/DreamDrive/p/5413408.html http://www.cnblogs.com/DreamDrive/p/5422698.html 上一个建议中我们提议使用构造代码块来简化代码,并且也了解到编
阅读全文
摘要:建议36: 使用构造代码块精炼程序 什么叫代码块(Code Block)?用大括号把多行代码封装在一起,形成一个独立的数据体,实现特定算法的代码集合即为代码块,一般来说代码块是不能单独运行的,必须要有运行主体。在Java中一共有四种类型的代码块: (1)普通代码块 就是在方法后面使用“{}”括起来的
阅读全文
摘要:Java中的数组是定长的,一旦经过初始化声明就不可改变长度,这在实际使用的时候非常不方便.比如要对一个班级的学生信息进行统计,因为我们不知道班级会有多少个学生(随时可能有退学,入学,转学),所以需要一个足够大的数组来容纳所有的学生.可以通过对数组扩容解决该问题. 代码如下: 上述代码中采用的是Arr
阅读全文
摘要:建议62:警惕数组的浅拷贝 一、分析 在日常工作中,我们会遇见很多数组的拷贝和复制的问题,但是在你使用系统提供的API进行编码的时候,无形中会留下浅拷贝的隐患。 一、分析 在日常工作中,我们会遇见很多数组的拷贝和复制的问题,但是在你使用系统提供的API进行编码的时候,无形中会留下浅拷贝的隐患。 在日
阅读全文
摘要:我们经常使用ArrayList,Vector,Hashmap等集合,一般都是直接用new跟上类名声明出一个集合来,然后使用add,remove,等方法进行操作,而且因为它们是自动管理长度的,所以不用我们特别费心超长问题,这确实是一个非常好的优点,但也有我们需要注意的事项. 下面以ArrayList为
阅读全文
摘要:建议89:枚举项的数量限制在64个以内 为了更好的使用枚举,java 提供了两个枚举集合:EnumSet和EnumMap,这两个集合的使用都比较简单,EnumSet表示其元素必须是某一枚举的枚举项,EnumMap表示Key值必须是某一枚举的枚举项,由于枚举类的实例数量固定并且有限,相对来说EnumS
阅读全文
摘要:建议64:多种最值算法,适时选择. 对一批数据进行排序,然后找出其中的最大值或最小值,这是基本的数据结构知识。在Java中我们可以通过编写算法的方式,也可以通过数组先排序再取值的方式来实现。下面以求最大值为例,解释一下多种算法。 (1) 自行实现,快速査找最大值 先来看用快速査找法取最大值的算法,其
阅读全文
摘要:枚举和注解都是在Java1.5中引入的,虽然他们是后起之秀,但是功能不容小觑,枚举改变了常量的声明方式,注解耦合了数据和代码. 建议83:推荐使用枚举定义常量 一、分析 一、分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量。不过,在1.5版之后
阅读全文
摘要:建议60:性能考虑,数组是首选 一、分析 数组在实际的系统开发中使用的越来越少,我们通常只有在阅读一些开源项目时才会看到它们的身影,在Java中它确实没有List、Set、Map这些集合使用起来方便,但是在基本类型处理方面,数组还是占优势的,而且集合的底层也是通过数组实现。 二、场景 比如对一个数据
阅读全文
摘要:建议21: 用偶判断,不用奇判断 输入: 1 2 0 -1 -2 得到结果: 1 >奇数2 >偶数 -1 >偶数-2 >偶数 Java中的取余(%标识符)算法,模拟代码如下: 当输入-1的时候,运算结果是-1当然不等于1了,所以它就被判定为偶数了. 判断是否是偶数即可: (i%2)==0?"偶数":
阅读全文
摘要:建议15:break万万不可忘 此类问题发生得非常频繁,但也很容易发现,只要做一下单元测试(Unit Test),问题立刻就会被发现并解决掉,但如果是在一堆的case语句中,其中某一条漏掉了break关键字,特别是在单元测试覆盖率不够高的时候(为什么不够高?在大点的项目中蹲过坑、打过仗的兄弟们可能都
阅读全文
摘要:建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP、Ruby、Groovy、JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们都是在运行期解释执行的。为什么Java这种强编译型语言会需要这些脚本语言呢?那是因为脚本语言的三大特
阅读全文
摘要:建议17: 慎用动态编译 // 这篇博文暂时理解不透......... 动态编译一直是Java的梦想,从Java 6版本它开始支持动态编译了,可以在运行期直接编译.java文件,执行.class,并且能够获得相关的输入输出,甚至还能监听相关的事件。不过,我们最期望的还是给定一段代码,直接编译,然后运
阅读全文
摘要:建议18: 避免instanceof非预期结果 instanceof是一个简单的二元操作符,它是用来判断一个对象是否是一个类实例的,其操作类似于>=、==,非常简单,我们来看段程序,代码如下: 就这么一段程序,instanceof的所有应用场景都出现了,同时问题也产生了:这段程序中哪些语句会编译通不
阅读全文
摘要:建议19: 断言绝对不是鸡肋 在防御式编程中经常会用断言(Assertion)对参数和环境做出判断,避免程序因不当的输入或错误的环境而产生逻辑异常,断言在很多语言中都存在,C、C++、Python都有不同的断言表示形式。在Java中的断言使用的是assert关键字,其基本的用法如下: 在布尔表达式为
阅读全文

浙公网安备 33010602011771号