Java高质量代码之 — 数据类型

[size=large]
前言:由于上一个星期工作繁忙,利用上下班和晚上睡前空余的时间拜读了秦小波老师的《改善Java程序的151建议》,感觉廓然开朗,注意到了很多平时在编写代码中并不会注意的问题,甚至感觉自己对Java只是略懂皮毛,不足以登大雅之堂,特此与读者分享读书笔记,[color=red]以下内容摘自《改善Java程序的151建议》一书和笔者的理解[/color]
[/size]
[size=large]
Java高质量代码系列文章
面向对象篇:[url]http://ray-yui.iteye.com/blog/1926984[/url]
数据类型篇:[url]http://ray-yui.iteye.com/blog/1927251[/url]
字符串篇:[url]http://ray-yui.iteye.com/blog/1927647[/url]
数组与集合(1):[url]http://ray-yui.iteye.com/blog/1928170[/url]
数组与集合(2):[url]http://ray-yui.iteye.com/blog/1930155[/url]
枚举与注解:[url]http://ray-yui.iteye.com/blog/1931408[/url]
泛型与发射:[url]http://ray-yui.iteye.com/blog/1933127[/url]
异常:[url]http://ray-yui.iteye.com/blog/1938946[/url]
杂:[url]http://ray-yui.iteye.com/blog/1942591[/url]
[/size]
[size=large]
在Java当中有8种基本数据类型,分别是[color=red]byte,char,short,int,long,float,double,boolean[/color]还有其对应的封装类型[color=red]Byte,Character,Short,Integer,Long,Float,Double,Boolean[/color],那我们究竟对他们有多少的了解呢?
[/size]
[size=large]
[color=red]1.用偶判断,不用奇判断[/color]
在Java中可以使用取余的方式来进行奇数还是偶数的判断,请看以下代码
[/size]

public static void main(String[] args) {
int num = -1;
System.out.println(num % 2 == 1 ? "奇数" : "偶数");
// 输出结果为偶数
}

[size=large]
从上面代码中,-1怎么可能是偶数呢?首先我们就需要了解Java是如何取余的
[/size]

public static int remainder(int dividend, int divisor) {
return dividend - dividend / divisor * divisor;
}

[size=large]
现在一切就明了了,-1的运算结果还是-1,以后记得写成num % 2 == 0
[/size]
[size=large]
[color=red]2.对精确货币计算使用BigDecimal类型[/color]
在使用货币计算时,我们首先想到的是使用double类型,但在计算机世界中,浮点类型有可能是不准确的,他只能无限的接近某一个值,而不会完全精准,这是因为二进制的原因,就像用10进制无办法表示10 / 3一样,所以对于精确的货币计算,应该使用BigDecimal类型,而且BigDecimal和数据库中的NUMBER和DECIMAL类型很好的匹配
[/size]
[size=large]
[color=red]3.注意类型的默认转换[/color]
在Java当中,当大的类型与小类型进行运算时,该运算会自动提升为大类型,这种转换成为加宽类型,例如long类型和int类型进行运算后会自动提升为long类型,请观察一下代码
[/size]

public static void main(String[] args) {
// 2147483647为int最大值
long num = 2147483647 + 1;
System.out.println(num);
// 运行结果为 -2147483648
}

[size=large]
以上代码中,2147483647为int类型的最大值,我使用long类型来接受int最大值+1应该是没问题的,但事实并不是如此,这是因为在Java中是先运算再进行类型转换的,二者都是int类型,所以运算结果也应该是int类型,所以超出了int类型的最大范围,此时修改为2147483647L + 1 就能成功运算
[/size]
[size=large]
[color=red]4.数值类型最大值应使用Java提供常量[/color]
在3的例子当中,我们使用了int的最大值2147483647,当然读者可能是有超人的记忆把int的最大值和最小值记住了,但short类型呢?long类型呢?所以我们应该使用Java自带的常量来获取数值类型的最大值和最小值,请看以下代码
[/size]

public static void main(String[] args) {
// int类型最大值
int maxInt = Integer.MAX_VALUE;
// int类型最小值
int minInt = Integer.MIN_VALUE;
// long类型最大值
long maxLong = Long.MAX_VALUE;
// long类型最小值
long minLong = Long.MIN_VALUE;
// short类型最大值
short maxShort = Short.MAX_VALUE;
// short类型最小值
short minShort = Short.MIN_VALUE;

}

[size=large]
[color=red]5.注意数值的边界判断[/color]
请来观看下面的代码
[/size]

public static void main(String[] args) {
test(Integer.MAX_VALUE + 1);
}

public static void test(int num) {
if (num < 2000) {
System.out.println("执行");
}
}

[size=large]
test方法的逻辑非常简单,若然int类型的数值少于2000就执行,当我使用int类型的最大值+1时,就因为类型越界而变成int的最少值,所以满足少于2000的条件从而执行方法,所以对于严谨的程序,应该进行 业务/正最大/负最小 的边界判断,特别是从前台接受过来的值
[/size]
[size=large]
[color=red]6.提防包装类的null值[/color]
包装类型是基本类型的包装类,当使用包装类型时,其实就生成了对象,当然对象是允许为null的,所以需要注意包装类型的!null判断
[/size]
[size=large]
[color=red]7.理解基本类型-->包装类型装箱拆箱过程[/color]
以下为Intger类型例子,Double和Float等同理
从基本类型-->包装类型是调用包装类型的valueOf()方法来进行转换
从包装类型-->基本类型是调用包装类型的intValue()方法来进行转换
[/size]
[size=large]
[color=red]8.优先选择基本类型[/color]
我们都知道,基本类型是存在栈的,而包装类型因为是类,对象,所以是存在堆中,在处理速度上,由于基本类型是原生类型,所以速度更快,其实换个思维也可以思考到,包装类型封装了属性和方法,生成的速度会比基本类型慢,而且当包装类型进行运算时,都将调用intValue()方法然后再调用valueOf()方法封装回包装类型,所以在可行的情况下,优先选择基本类型,但在特定的框架例如Hibernate中,推荐使用包装类型
[/size]
[size=large]
总结:
笔者在本文章中只从《改善Java程序的151建议》中提取部分进行归纳性叙述,推荐各位读者购买这本书,该书不仅从事例中学习,而且涉及到原理,底层的实现,不仅告诉你应该怎么做,还告诉你为什么要这样做.
[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值