• 【JAVA】【基础类型】Java中的不可变类型


    参考:https://blog.csdn.net/jingjbuer/article/details/42419305】

    一、Java中的不可变类型

    什么叫不可变类型呢?我们先看两个例子

    样例1:

    public class Test {
      public int num;
    
      public static void main(String[] args) {
        Test t = new Test();
        t.num = 11;
        
        Test t1 = t;
        t1.num = 111;
    
        System.out.println(t.num);
      }
    }
    

    //输出结果是111

    样例2:

    public class Test_1 {
      public static void main(String[] args) {
        int i = 0;
    
        int i1 = i;
        i1 = 10;
    
        System.out.println(i);
      }
    }
    

    //输出结果仍然是0

    为什么如上两个例子返回的结果是不一致的呢?这就涉及到Java中的 可变数据类型不可变数据类型 的概念了。

    1. 不可变数据类型:当该数据类型对应的变量的值发生了改变,那么它对应的内存地址也发生改变,对于这种数据类型,就称不可变数据类型。即:原有内存地址中的内容不变,为变化后的值分配了新的内存。
    2. 可变数据类型:当该数据类型对应的变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称之为可变数据类型。可变数据类型改变时实际上更改了内存中的内容。
    • 如上样例1中: t是Test类型,属于可变数据类型。对象t和t1的值其实是一个地址,也可以看成一个指向堆内存中某个对象的指针。让t1=t时,实际上也是让t1指向t指向的对象,通过t1改变num的值,也就是改变了堆内存中的对象的值,通过t再调用时,num的值自然也是改变后的结果。

    • 如上样例2中: 虽然i1=i的时候,i1和i共用0,但是一旦i1赋值10,此时不是将内存中的0改成10,而是又创建一个10,让i1指向10,而i还是指向0的,所以最后的结果还是0

    在Java中,如下这些都是不可变数据类型(对象类型的不可变数据类型也称之为immutable Objects): /这个存在争议,貌似不是(1)所有基本数据类型(boolean、char、byte、short、int、long、float、double)。/ (2)所有基本数据类型的封装类(Boolean、Char、Byte、Short、Integer、Long、Float、Double)。 (3)String (4)其他:BigInteger、BigDecimal等 (BigInteger、BigDecimal:Java中精度最高的数据类型。这两个类支持任意精度的整数和任意精度的浮点数。)

  • 相关阅读:
    zabbix报警把特定的应用集发送给developer
    logstash 判断接口响应时间发送zabbix告警
    zabbix 对于logstash告警连续发邮件
    java使double保留两位小数的多方法
    Vagrant 和 docker
    golang binarySearch
    go channel实现
    5个jvm命令
    字符串匹配的Boyer-Moore算法
    Rabin-Karp 算法
  • 原文地址:https://www.cnblogs.com/yickel/p/14593913.html
Copyright © 2020-2023  润新知