`
web001
  • 浏览: 99363 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

java编程中容易犯错的地方之BigInteger

    博客分类:
  • Java
阅读更多

 

在java中,有很多容易被忽视的地方,今天在网上看到一个java的谜题,代码如下:

 

 

BigInteger five  = new BigInteger("5");
BigInteger four = new BigInteger("4");
BigInteger total = BigInteger.ZERO;
total.add(five);
total.add(four);  

System.out.println(total);

 

乍一看,觉得这个代码应该输出9,毕竟4+5=9嘛。其实,如果你运行一下这段代码(这段代码不能直接运行,你得需要修改一下),会惊奇的发现,这段代码居然打印出了0。

 

分析:

  1. 不可变类型种类:String、BigDecimal、BigInteger和各种包装器类型都是不可变类型。
  2. 对于String不可变的特性在我另一篇博文中说到。
  3. 比如BigInteger的add方法,并不会改变两个操作数即现有实例,而是返回新的实例。

 

结论:

在调用不可变对象的方法时,如果对于看起来是对对象进行改变的方法,则现有实例并不会改变,而是返回一个新的实例。

3
22
分享到:
评论
9 楼 解未知数 2012-09-04  
我觉得 BigInteger total = BigInteger.ZERO; 这种写法, 是不好的习惯.
total.add 其实操作的是BigInteger的静态ZERO变量.
幸好BigInteger是不可改变的, 要不然麻烦就大了.

最好还是写成 BigInteger total = new BigInteger("0");
8 楼 tlde_ti 2012-09-04  
tlde_ti 写道
web001 写道
kimmking 写道
scala中的val和var

求详细解释?

不太一样,val var 是 变量的指向可变与不可变。而这里是object的可变与不可变。
val 相当于 final.

题外话,让我想到了 java一直在讨论的值传递还是引用传递问题,其实那个讨论忽略了一个前提,mutable object并不是值,因为它不符合 值 不可更改 的定义。
immutable object 和 primitive type 倒是符合值的定义,从抽象上来说,不管 值 传 的是 值的复制还是值,其实都是一个东西,因为所有相等的值抽象上都是一样的。你不用考虑任何区别。thinking in java 的值的复制的说法 完全是无谓增加复杂度。

然后就只需要考虑mutable object的传递,首先我们不应该考虑底层这里是怎么实现的,这只会把人的脑子缴晕。我们只需要考虑展示给我们看的抽象概念就可以了。
第一点,传递的肯定不是 变量,因你将变量的引用改变并不会改变原变量的 指向。
第二点,传递的是变量的复制,还是mutable object呢?thinking in java 说是 reference的复制,我觉得是多此一举。因为reference的复制意义就是现在的变量和原来的变量不是一个东西!!
这里完全可以简单的理解为 是直接将 mutable object 传了过来 然后我们给予他一个新的变量。

结论就是:如果传的是 值,那传的就是值,传的是mutable object,传的就是mutable object,只是给了个新变量。 多好理解啊...thinking in java害人不浅.最近还放话说要写
atomic scala 继续祸害 java转到 scala的人们 - -
7 楼 HeartArea 2012-09-04  
说白了  就是这些类型的方法调用结束以后 你得用变量接收一下,否则运算无效
6 楼 ray_linn 2012-09-04  
真丑陋...
5 楼 tlde_ti 2012-09-04  
web001 写道
kimmking 写道
scala中的val和var

求详细解释?

不太一样,val var 是 变量的指向可变与不可变。而这里是object的可变与不可变。
val 相当于 final.
4 楼 web001 2012-09-04  
kimmking 写道
scala中的val和var

求详细解释?
3 楼 kimmking 2012-09-04  
scala中的val和var
2 楼 web001 2012-09-04  
zhushaolong 写道
就像String是不可变的

对啊,是不可变的。
1 楼 zhushaolong 2012-09-04  
就像String是不可变的

相关推荐

    java练习_大数运算_BigInteger.pdf

    正如我们在 Java 中处理大数运算时,需要使用 BigInteger 类来实现,这是因为 Java 的基本数据类型无法存储非常大的数字。BigInteger 类提供了几个重要的方法来进行大数运算,包括加、减、乘、除和取余等。 在了解 ...

    JAVABigInteger包.pdf

    BigInteger 包是 Java 语言中用于处理大整数的类库。该类库提供了多种构造方法和运算方法来处理大整数。 构造方法 BigInteger 类提供了多种构造方法来创建 BigInteger 对象。这些方法包括: * `BigInteger(byte[]...

    RSA.rar_BigInteger_RSA BigInteger_RSA java biginteger_RSA 类 java

    在Java中,我们可以使用`java.math.BigInteger`类来处理大整数,这在实现RSA算法时非常关键,因为加密过程中涉及的数字通常超过了普通整型变量的范围。以下是关于`BigInteger`类以及如何在Java中实现RSA加解密的详细...

    Java中BigInteger方法总结

    ### Java中的BigInteger方法详解 #### 一、引言 在Java中处理大整数运算时,`BigInteger` 类提供了一种高效且灵活的方式。与基本数据类型如 `int` 和 `long` 不同,`BigInteger` 可以表示任意大小的整数,只要不...

    Java中BigInteger.docx

    在Java编程语言中,`BigInteger` 类是用来处理大整数的,它支持任意精度的整数运算。这个类是 `java.math` 包的一部分,它提供了比 `int` 和 `long` 更大的范围,可以用来处理超过64位的整数值。在处理大数据量的...

    java-BigInteger-BigDecimal类源码

    总之,`BigInteger`和`BigDecimal`是Java中处理大整数和高精度浮点数的关键工具,它们的源代码为我们提供了深入学习和定制这两个类的机会。理解并掌握这些类的使用能极大地提升在处理数学计算时的精确性和效率。

    关于Biginteger的分数类期末课程设计

    在Java编程语言中,BigInteger类是用于处理大整数的一种数据类型,它可以处理超过long类型所能表示的最大值的整数。在"关于Biginteger的分数类期末课程设计"这个项目中,你创建了一个分数类,其中分子和分母都是用...

    BigInteger

    用java写的BigInteger,主要是实现一个内库

    基于Java BigInteger类的大整数运算应用.pdf

    本文将介绍Java BigInteger类的大整数运算应用,包括BigInteger类的介绍、BigInteger类的构造方法、BigInteger类的运算方法、BigInteger类在高精度计算中的应用等。 1. BigInteger类的介绍 BigInteger类是Java....

    java练习_大数运算_BigInteger[参考].pdf

    在Java中,BigInteger类提供了多种方法来处理大整数,包括加、减、乘、除、求余数等操作。 BigInteger类的使用: BigInteger类是Java中用于处理大整数的类,它提供了多种方法来处理大整数。BigInteger类的使用非常...

    JAVA_API1.6文档(中文)

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...

    poj1001java biginteger

    用java的biginteger实现的poj1001,比较简单的方法

    BigInteger:为Java实现BigInteger

    在Java编程语言中,`BigInteger`类是用于处理大整数的一种重要工具。它属于`java.math`包,专门设计来处理超过`long`类型所能表示的最大范围的整数。当我们需要进行大整数的算术运算,如加法、减法、乘法、除法以及...

    OC之-BigInteger

    这时,我们可以借鉴Java中的`BigInteger`类,通过引入第三方库来实现OC中的大数存储和计算功能。 `BigInteger`是一种能够处理任意大小整数的类,它不受平台或编程语言内置数据类型的限制,可以进行高效且精确的大数...

Global site tag (gtag.js) - Google Analytics