- 浏览: 59466 次
- 性别:
- 来自: 成都
文章分类
第三条 了解和使用类库
假如我们想产生位于0到某个数之间的随机整数,一般会像这样做
这个方法看起来不错,但是却有三个缺点。第一个缺点是,如果n是一个比较小的2的乘方
,经过一段相当短的周期后,它产生的随机数序列将会重复。第二个缺点是,如果n不是2的乘
方,那么平均起来,有些数会比其他数出现的更为频繁。如果n比较大,这个缺点会非常明显
。这个可以通过下面的程序直观地体现出来,
如果random方法工作正常的话,这个程序打印出来的数将接近一百万的一半,但是如果真正
运行这个程序,就会发现它打印出来的数字接近于66666,由random方法产生的数字有2/3落在
随机数取值范围的前半部分。 radom 方法的第三个缺点是,在极少数情况下,它的失败是灾难性的,返回一个落在指定范围之外的数。之所以如此,是因为这个方法试图通过调用Math.abs(),将rnd.nextInt()返回的值映射为一个非负整数int,如果nextInt()返回Integer.MIN_VALUE,那么Math.abs也会返回Integer.MIN_VALUE,假设n不是2的乘方,那么取摸操作符(%)将返回一个负数.这几乎肯定会
使程序失败,而且这种失败很难重现。
使用类库可以充分利用这些编写标准库的专家知识,以及在你之前的其他人的经验。可以不必浪费时间为那些与工作不太相关的问提供特别的解决方案。最后类库的性能将会随着时间推移性能将不断提高。
第四条 如果需要精确的答案,请避免使用float 和double
float 和double 类型主要是为了科学计算和工程计算而设计的,它们执行二级制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们并没有提供完全的精确的结果,所以不应该被用于需要精确结果的场合,float和double类型尤其不适合货币计算。
例如,假如你的口袋有$1.03,花掉了42$之后还剩下多少钱,
结果是0.6100000000000001
解决这个问题需要用BigDecimal,int,long进行货币计算
注:以上摘自《effective java 中文版》
假如我们想产生位于0到某个数之间的随机整数,一般会像这样做
private static final Random rd=new Random(); static int random(int n){ return Math.abs(rd.nextInt())%n; }
这个方法看起来不错,但是却有三个缺点。第一个缺点是,如果n是一个比较小的2的乘方
,经过一段相当短的周期后,它产生的随机数序列将会重复。第二个缺点是,如果n不是2的乘
方,那么平均起来,有些数会比其他数出现的更为频繁。如果n比较大,这个缺点会非常明显
。这个可以通过下面的程序直观地体现出来,
public static vodi main(String []args){ int n=2*(Integer.MAX_VALUE/3); int low=0; for(int i=0;i<1000000;i++){ if(random(n)<n/2) low++; System.out.println(low); } }
如果random方法工作正常的话,这个程序打印出来的数将接近一百万的一半,但是如果真正
运行这个程序,就会发现它打印出来的数字接近于66666,由random方法产生的数字有2/3落在
随机数取值范围的前半部分。 radom 方法的第三个缺点是,在极少数情况下,它的失败是灾难性的,返回一个落在指定范围之外的数。之所以如此,是因为这个方法试图通过调用Math.abs(),将rnd.nextInt()返回的值映射为一个非负整数int,如果nextInt()返回Integer.MIN_VALUE,那么Math.abs也会返回Integer.MIN_VALUE,假设n不是2的乘方,那么取摸操作符(%)将返回一个负数.这几乎肯定会
使程序失败,而且这种失败很难重现。
使用类库可以充分利用这些编写标准库的专家知识,以及在你之前的其他人的经验。可以不必浪费时间为那些与工作不太相关的问提供特别的解决方案。最后类库的性能将会随着时间推移性能将不断提高。
第四条 如果需要精确的答案,请避免使用float 和double
float 和double 类型主要是为了科学计算和工程计算而设计的,它们执行二级制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们并没有提供完全的精确的结果,所以不应该被用于需要精确结果的场合,float和double类型尤其不适合货币计算。
例如,假如你的口袋有$1.03,花掉了42$之后还剩下多少钱,
System.out.println(1.03-.42);
结果是0.6100000000000001
解决这个问题需要用BigDecimal,int,long进行货币计算
注:以上摘自《effective java 中文版》
发表评论
-
Spring源码分析之IOC2
2013-03-16 23:25 849本篇将介绍下ApplicationCo ... -
Spring源码分析之IOC
2013-03-16 21:40 765先看两种方式在IOC容器取得bean 1 beanFactor ... -
一些在工作中遇到的问题汇总
2012-12-10 23:31 0保留一定的小数位数 1 DecimalFormat ... -
Set集合源码初探
2012-12-06 23:07 0[color=green][size=medium] ... -
一些常用的jar包
2012-12-04 22:44 0一些常用的jar 放在网上方便使用 Did your c ... -
java 获取请求ip
2012-11-20 23:11 3269public class IpUtil { publ ... -
mongodb
2012-11-20 22:09 729mongodb文档, -
padingtoolbar 的扩张
2012-10-31 22:01 0在Ext的原有分页控件中,服务器端方法是根据传入的起始数据记录 ... -
extjs的一些组件
2012-10-17 22:34 714<script type="text/java ... -
extjs
2012-10-14 23:09 635extjs的一些文档 -
jquery ui
2012-09-11 22:54 736一个jquery ui 后台 -
重拾java之线程1
2012-09-10 00:17 953[size=medium] 接触java也有一段时间了,以前选 ... -
dom4j 一些使用
2012-07-30 22:40 0dom4j使用 -
一个http请求
2012-07-18 00:04 0ackage com.sxit.phoenix.common; ... -
读书笔记effective之对所有对象通用的方法
2012-03-18 17:22 894读书笔记effective之对所有对象通用的方法 第一条 覆 ... -
读书笔记effective java 之条目
2012-03-18 15:05 836最近看了下effective java 有编程许多经验值得学 ... -
读书笔记effective java 之通用程序设计3
2012-03-15 22:21 890第五条 基本类型优先于装箱基本类型 java有一个类型系 ... -
effective java 之通用程序设计
2012-03-15 16:15 761第一条 将局部变量的作用域最小化 将局部变量的作用域最小 ... -
http与socket连接区别
2011-11-08 01:11 468相信不少初学手机联网 ... -
HashMap 一般遍历
2011-11-04 16:28 784Map map=new HashMap() Iterator ...
相关推荐
"Effective Java读书笔记" Effective Java是一本关于Java编程语言的经典书籍,本笔记主要总结了Java语言的发展历程、静态工厂方法的应用、构造器模式的使用等重要知识点。 一、Java语言的发展历程 Java语言的发展...
《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...
JAVA 程序设计学习笔记 JAVA 程序设计学习笔记是一个详细的学习笔记,涵盖了 JAVA 程序设计的基本概念、语言特征、类库、环境设置、安装等方面的知识点。 1. JAVA 程序设计的基本概念 JAVA 程序设计是一种基于...
读书笔记:java高并发程序设计实战
《实战Java高并发程序设计》是一本专注于Java并发编程实践的书籍,试读版提供了前两章的内容,为读者提供了一个初步了解并发编程基础的窗口。在Java领域,并发编程是构建高性能、高效率系统的关键技术,对于软件开发...
### Java程序设计习题集知识点总结 #### 第一章:Java基础 1. **Java的垃圾回收机制** Java语言内置了一套垃圾回收机制,它能够自动地管理内存资源,减少程序员对内存释放的干预。当我们不再使用某些对象时,...
实战Java高并发程序设计 葛一鸣 / 郭超 著 高清 带目录下载 内容简介: 在过去单核CPU时代,单任务在一个时间点...《实战Java高并发程序设计》内容丰富,实例典型,实用性强,适合有一定Java基础的技术开发人员阅读。
读书笔记:Effective Java中文版 第2版
Java语言程序设计-进阶篇(原书第10版) 学习笔记 Java语言程序设计-进阶篇(原书第10版) 学习笔记 Java语言程序设计-进阶篇(原书第10版) 学习笔记 Java语言程序设计-进阶篇(原书第10版) 学习笔记 Java语言程序...
Java语言程序设计学习笔记是为初学者和有一定基础的开发者准备的一份详尽教程,它涵盖了从基础到进阶的各个重要知识点。这份笔记以Markdown(md)文件的形式组织,便于阅读和检索,使得学习过程更为高效。 首先,...
读书笔记:Effective Java中文版第3版笔记
读书笔记:实战Java高并发程序设计学习笔记
读书笔记:实战java高并发程序设计
读书笔记:实战Java高并发程序设计第2版源码
读书笔记:Java练习包括《Java编程思想》《算法》《Effective Java》等
读书笔记:Effective Java 中文版(2版和3版)
读书笔记:实战Java高并发程序设计 实例
读书笔记:实战Java高并发程序设计练习
读书笔记:Effective Java中文版学习项目