`
ray_yui
  • 浏览: 216608 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多

前言:由于上一个星期工作繁忙,利用上下班和晚上睡前空余的时间拜读了秦小波老师的《改善Java程序的151建议》,感觉廓然开朗,注意到了很多平时在编写代码中并不会注意的问题,甚至感觉自己对Java只是略懂皮毛,不足以登大雅之堂,特此与读者分享读书笔记,以下内容摘自《改善Java程序的151建议》一书和笔者的理解


Java高质量代码系列文章
      面向对象篇:http://ray-yui.iteye.com/blog/1926984
      数据类型篇:http://ray-yui.iteye.com/blog/1927251
          字符串篇:http://ray-yui.iteye.com/blog/1927647
      数组与集合(1):http://ray-yui.iteye.com/blog/1928170
      数组与集合(2):http://ray-yui.iteye.com/blog/1930155
      枚举与注解:http://ray-yui.iteye.com/blog/1931408
      泛型与发射:http://ray-yui.iteye.com/blog/1933127
                  异常:http://ray-yui.iteye.com/blog/1938946
                      杂:http://ray-yui.iteye.com/blog/1942591


在Java当中有8种基本数据类型,分别是byte,char,short,int,long,float,double,boolean还有其对应的封装类型Byte,Character,Short,Integer,Long,Float,Double,Boolean,那我们究竟对他们有多少的了解呢?


1.用偶判断,不用奇判断
      在Java中可以使用取余的方式来进行奇数还是偶数的判断,请看以下代码

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


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

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


      现在一切就明了了,-1的运算结果还是-1,以后记得写成num % 2 == 0


2.对精确货币计算使用BigDecimal类型
      在使用货币计算时,我们首先想到的是使用double类型,但在计算机世界中,浮点类型有可能是不准确的,他只能无限的接近某一个值,而不会完全精准,这是因为二进制的原因,就像用10进制无办法表示10 / 3一样,所以对于精确的货币计算,应该使用BigDecimal类型,而且BigDecimal和数据库中的NUMBER和DECIMAL类型很好的匹配


3.注意类型的默认转换
     在Java当中,当大的类型与小类型进行运算时,该运算会自动提升为大类型,这种转换成为加宽类型,例如long类型和int类型进行运算后会自动提升为long类型,请观察一下代码

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


     以上代码中,2147483647为int类型的最大值,我使用long类型来接受int最大值+1应该是没问题的,但事实并不是如此,这是因为在Java中是先运算再进行类型转换的,二者都是int类型,所以运算结果也应该是int类型,所以超出了int类型的最大范围,此时修改为2147483647L + 1 就能成功运算


4.数值类型最大值应使用Java提供常量
      在3的例子当中,我们使用了int的最大值2147483647,当然读者可能是有超人的记忆把int的最大值和最小值记住了,但short类型呢?long类型呢?所以我们应该使用Java自带的常量来获取数值类型的最大值和最小值,请看以下代码

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;

	}


5.注意数值的边界判断
      请来观看下面的代码

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

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


      test方法的逻辑非常简单,若然int类型的数值少于2000就执行,当我使用int类型的最大值+1时,就因为类型越界而变成int的最少值,所以满足少于2000的条件从而执行方法,所以对于严谨的程序,应该进行 业务/正最大/负最小 的边界判断,特别是从前台接受过来的值


6.提防包装类的null值
      包装类型是基本类型的包装类,当使用包装类型时,其实就生成了对象,当然对象是允许为null的,所以需要注意包装类型的!null判断


7.理解基本类型-->包装类型装箱拆箱过程
      以下为Intger类型例子,Double和Float等同理
      从基本类型-->包装类型是调用包装类型的valueOf()方法来进行转换
      从包装类型-->基本类型是调用包装类型的intValue()方法来进行转换


8.优先选择基本类型
      我们都知道,基本类型是存在栈的,而包装类型因为是类,对象,所以是存在堆中,在处理速度上,由于基本类型是原生类型,所以速度更快,其实换个思维也可以思考到,包装类型封装了属性和方法,生成的速度会比基本类型慢,而且当包装类型进行运算时,都将调用intValue()方法然后再调用valueOf()方法封装回包装类型,所以在可行的情况下,优先选择基本类型,但在特定的框架例如Hibernate中,推荐使用包装类型


总结:
      笔者在本文章中只从《改善Java程序的151建议》中提取部分进行归纳性叙述,推荐各位读者购买这本书,该书不仅从事例中学习,而且涉及到原理,底层的实现,不仅告诉你应该怎么做,还告诉你为什么要这样做.
19
8
分享到:
评论
6 楼 longshaojian 2013-08-29  
奇偶判断

num & 1 == 1 ? "奇数" : "偶数"
5 楼 james.zc 2013-08-20  
这个有必要顶下
4 楼 huangyuyun2002 2013-08-20  
都是细节的用法,很好。
3 楼 raph_java 2013-08-20  
num % 2 == 0 亮了
2 楼 jimode2013 2013-08-20  
用偶判断,不用奇判断  这一点确实没有想到
1 楼 桃花源记 2013-08-20  
很不错,楼主快更

相关推荐

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    java源码包---java 源码 大量 实例

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    Java视频安卓版

    无论您是在校大学生,还是职业学员,或者其他开发人员,本书都志在全面提高您的Java编程思想和开发实力,使您能够系统的学习Java语言,写出高质量的Java程序代码,相信看完本软件提供的所有视频后将使您获益匪浅。

    Java学习安卓客户端

    Java学习是Android客户端目前最全面的免费... 无论您是在校大学生,还是职业学员,或者Java开发人员,本书都志在全面提高您的Java编程思想和开发实力,使您能够写出高质量的Java代码,相信读完本书后能使您获益匪浅。

    Java学习(apk)

    Java学习是Android客户端目前最全面的免费... 无论您是在校大学生,还是职业学员,或者Java开发人员,本书都志在全面提高您的Java编程思想和开发实力,使您能够写出高质量的Java代码,相信读完本书后能使您获益匪浅。

    java源码包2

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    java源码包4

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    java源码包3

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    代码自动生成器

    对于追求高质量代码的项目而言,都希望拥有高端的标准SQL语句,而不是相对低端的动态SQL语句。问题是,由于开发初期 大量使用了开源代码生成器产生的低端动态SQL语句,再加上其他开发人员大量拷贝代码等原因,使得...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,...

    Java史上最全面的打印工具类,可以打印本、图片、二维码、订单、病历单等等,并且不会出现乱码问题,各种打印排版都可以实现!

    1、java开发必备工具类,兼容了所有版本的JDK,包含了各种类型的打印,可以打印文本、图片、二维码、订单、病历单等信息,应有尽有,功能强大,代码简洁,使用简单,直接拷贝使用即可; 2、本工具类经过了很多项目...

    java学习;05.Docker容器数据卷.md

    同时,Java还提供了自动内存管理和异常处理机制,使开发人员能够更轻松地编写高质量的代码。 总之,Java是一种功能强大、易学易用、具有广泛应用和强大跨平台特性的编程语言。它的设计目标是提供一种高效的开发工具...

    Java数据结构和算法中文第二版(1)

    抽象数据类型 有序链表 双向链表 迭代器 小结 问题 实验 编程作业 第6章 递归 三角数字 阶乘 变位字 递归的二分查找 汉诺(Hanoi)塔问题 归并排序 清除递归 一些有趣的递归应用 小结 问题 ...

    免费版 Java Barcode组件_Free Spire.Barcode for Java 1.3

    开发人员还可以多角度旋转条形码图片来获取高质量的条形码图片。 3.Barcode 属性和样式设置。开发人员可操作和设置的条形码类型众多,包括设置 Barcode 颜色,边框,边距,宽度以及各种属性,数据样式等等。 4.易...

    java后端宝典进阶版.zip

    Java基础知识:介绍Java语言的基本语法、数据类型、流程控制等基础知识,为后续的高级内容打下坚实的基础。 Java面向对象编程:详细讲解面向对象编程的概念、原则和特性,包括封装、继承、多态等,帮助读者理解和...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,...

    Java编程艺术 PDF

    本书揭示了Java程序员如何创建高质量软件的奥秘。Herbert Schildt 和James Holmes两位编程大师通过将Java应用于某些有趣、实用的计算机问题和编程任务中,全面展示了Java语言的强大功能、敏捷性、多样性和艺术性。...

    Android高级编程--源代码

     由于Android构建在开源代码的框架之上,而且提供了强大的SDK库和开放的理念,所以它为广大的没有任何移动应用程序开发经验的新手开辟了一条开发完美的移动应用程序的康庄大道。而富有经验的移动开发人员现在也可以...

Global site tag (gtag.js) - Google Analytics