深入Java不可变类型的详解

2016-02-19 09:29 7 1 收藏

想不想get新技能酷炫一下,今天图老师小编就跟大家分享个简单的深入Java不可变类型的详解教程,一起来看看吧!超容易上手~

【 tulaoshi.com - 编程语言 】

我们先看下面一个例子:
代码如下:

    import java.math.BigInteger; 
    public class BigProblem { 
        public static void main(String[ ] args) { 
            BigInteger fiveThousand  = new BigInteger("5000"); 
            BigInteger fiftyThousand = new BigInteger("50000"); 
            BigInteger fiveHundredThousand = new BigInteger("500000"); 
            BigInteger total = BigInteger.ZERO; 
            total.add(fiveThousand); 
            total.add(fiftyThousand); 
            total.add(fiveHundredThousand); 
            System.out.println(total); 
        } 
    } 

你可能会认为这个程序会打印出555000。毕竟,它将total设置为用BigInteger表示的0,然后将5,000、50,000和500,000加到了这个变量上。如果你运行该程序,你就会发现它打印的不是555000,而是0。很明显,所有这些加法对total没有产生任何影响。

对此有一个很好理由可以解释:BigInteger实例是不可变的。String、BigDecimal以及包装器类型:Integer、Long、Short、Byte、Character、Boolean、Float和Double也是如此,你不能修改它们的值。我们不能修改现有实例的值,对这些类型的操作将返回新的实例。起先,不可变类型看起来可能很不自然,但是它们具有很多胜过与其向对应的可变类型的优势。不可变类型更容易设计、实现和使用;它们出错的可能性更小,并且更加安全[EJ Item 13]。

为了在一个包含对不可变对象引用的变量上执行计算,我们需要将计算的结果赋值给该变量。这样做就会产生下面的程序,它将打印出我们所期望的555000:
代码如下:

    import java.math.BigInteger; 
    public class BigProblem { 
        public static void main(String[] args) { 
            BigInteger fiveThousand  = new BigInteger("5000"); 
            BigInteger fiftyThousand = new BigInteger("50000"); 
            BigInteger fiveHundredThousand = new BigInteger("500000"); 
            BigInteger total = BigInteger.ZERO; 
            total = total.add(fiveThousand); 
            total = total.add(fiftyThousand); 
            total = total.add(fiveHundredThousand); 
            System.out.println(total); 
        } 
    } 

来源:http://www.tulaoshi.com/n/20160219/1591014.html

延伸阅读
1:gc日志输出 在jvm启动参数中加入 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimestamps -XX:+PrintGCApplicationStopedTime,jvm将会按照这些参数顺序输出gc概要信息,详细信息,gc时间信息,gc造成的应用暂停时间。如果在刚才的参数后面加入参数 -Xloggc:文件路径,gc信息将会输出到指定的文件中。其他参数还有 -verbose:gc和-XX:+Pr...
冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 代码如下: 代码如下: public class nums {      public static void main(String[] args){        &n...
JAVA关键字final用于修饰数据、方法或类,通常意味着“无法改变的”,既数据不能改变,方法不能覆盖,类不能继承。一般采用final有两种原因:设计和效率。而随着JAVA版本的更新,一些效率上的问题可以交由编译器和JVM处理。因此,采用final来解决效率问题就显得不是那么重要了。 Final修饰符大多运用于基本数据类型(primitive)域或者不可变...
Java.awt.Robot 类用于控制鼠标和键盘。一旦你得到这种控制,你能够通过你的Java代码做与鼠标和键盘任何类型的操作。这个类通常用于自动化测试。下面的代码样例将向您展示Robot类如何处理键盘事件。如果你运行此代码,并打开notepad,您将在notepad中看到HI CAOER.赶快试一试吧。 代码如下: import java.awt.AWTException; import java.awt.R...
主要相同点:Lock能完成Synchronized所实现的所有功能。 主要不同点:Lock有比Synchronized更精确的线程予以和更好的性能。 Synchronized会自动释放锁,但是Lock一定要求程序员手工释放,并且必须在finally从句中释放。 synchronized 修饰方法时 表示同一个对象在不同的线程中 表现为同步队列 如果实例化不同的对象 那么synchronized就不会出现...

经验教程

969

收藏

43
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部