一、可变类型与不可变类型
不可变数据类型: 当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型。
可变数据类型 :当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型,当可变数据类型改变时它实际上是更改了内存中的内容。
可变类型

java中基本数据类型以及String类型均为不可变类型。

BigInteger,BigDecimal,List,Set,Map为可变类型。

举个简单的例子说明一下可变与不可变

String s = "a";
s = s + "b";
StringBuilder sb = new StringBuilder("a");
sb.append("b");

String类型的s会重新指向新的地址内容,而sb只是在原地址内容中做修改

不注意这一点的话,编代码很有可能出现错误

String s1 = new String("abc");
List<String> list = new ArrayList<String>();
list.add(s1);
s1 = s1.concat("d");
System.out.println(list.get(0));
String s2 = s1.concat("e");
list.set(0, s2);
System.out.println(list.get(0));

代码输出为:

abc

abcde

原因是String类型不可变,s1进行concat时s1十几指向了新的数据地址,而List中保存的仍然是老的地址内容。

二、不可变引用

在声明变量时用final进行修饰,此时变量不可改变其指向的地址,但可以改变其中存储的值。

final StringBuilder sb = new StringBuilder("abc");
sb.append("d");
sb = new StringBuilder("e");
System.out.println(sb);

以上代码在编译阶段会在第三行报错,但第二行不会报错。

三、不可变封装

此处的不可变与上述不可变并不是一回事,而是通过封装让数据只能看,不能修改。且这里的不可变是在运行阶段获得的,编译阶段无法发现。

利用以下三个函数进行封装

Collections.unmodifiableList Collections.unmodifiableSet  Collections.unmodifiableMap

List<String> list = new ArrayList<>();
list.add("ab");
List<String> listCopy = Collections.unmodifiableList(list);
listCopy.add("c");
list.add("c");
System.out.println(listCopy.size());

以上代码运行到第四行会报错。

java中可变类型,不可变类型,不可变引用,不可变封装相关推荐

  1. 【Groovy】Groovy 方法调用 ( Java 中函数参数是接口类型 | 函数参数是接口类型 可以 直接传递闭包 )

    文章目录 一.Java 中函数参数是接口类型 二.函数参数是接口类型 可以 直接传递闭包 三.完整代码示例 一.Java 中函数参数是接口类型 在 Android 中经常使用如下形式的接口 : 定义一 ...

  2. Java中的8种原始类型

    几年前,当我开始编辑Java Basics系列时,我认为将一些非常详细的信息拉到自己的帖子中是很有意义的. 这样,初学者的内容就更容易消化. 首先,我要介绍有关Java的8种原始类型的所有信息. Ja ...

  3. java整型转换为数组_基于java中byte数组与int类型的转换(两种方法)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...

  4. Java中的两种异常类型及其区别?

    Java中的两种异常类型及其区别? 参考文章: (1)Java中的两种异常类型及其区别? (2)https://www.cnblogs.com/zxfei/p/11182730.html (3)htt ...

  5. <随笔03>Java中的两种异常类型

    <随笔03>Java中的两种异常类型 参考文章: (1)<随笔03>Java中的两种异常类型 (2)https://www.cnblogs.com/newlyfly/p/744 ...

  6. java中关于输出三角形图案类型题目的思路

    java中关于输出三角形图案类型题目的思路 初学java,在学到循环相关的知识的时候,老师总会拿出一些图形打印相关的题目来让大家来练习,其中比较经典的就是如下类似题目. 这种图形类的题目,只要能做出其 ...

  7. Java中String是个什么类型?

    Java中String是个什么类型 Java中的八大基本数据类型 String 是个什么类型 String常见的方法 Java中的八大基本数据类型 面试官的套路 Java中的数据类型分为四类 1.整型 ...

  8. JAVA中的八种基本类型

    一.JAVA中的八种基本类型 1.数字类型(6种)   ①byte:     占的位数:byte数据类型占八位: 最小值为:-128(-2^7): 最大值为:127(2^7-1): 默认值为:0: 作 ...

  9. java中byte数组与int类型的转换(两种方式)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...

  10. java中char类型转换成int类型的两种方法

    java中char类型转换成int类型的两种方法 方法一: 第一种利用Integer包装类的方法Integer.parseInt Copychar ch = '9'; if (Character.is ...

最新文章

  1. DQL查询语句约束数据库设计备份和还原
  2. 西人马聂泳忠:打造机器神经系统,成为中国的特斯拉
  3. 第2篇 C#数据类型-值类型与引用类型
  4. easyui前端实现多选框_前端:Element UI 多选框组用法笔记
  5. jQuery 判断是否为数字的方法 及 转换数字函数
  6. spark Docker镜像构建及push脚本
  7. 【LeetCode笔记】199. 二叉树的右视图(Java、二叉树、层序遍历)
  8. 思考、学习新技术的原则和方式
  9. 类 workbooks 的 open 方法无效_第十九章 Cach 命令大全 OPEN 命令
  10. oracle执行带有nbsp参数,Oracleamp;nbsp;参数文件amp;nbsp;spfileamp;nbsp;a
  11. Linux 网络编程 —— TCP编程之客户端 向服务器发送数据 接收服务器发来的数据
  12. aix系统查看服务器型号齐全,查看AIX系统位数
  13. masm5安装教程_MASM 6.11的安装与设置
  14. matlab latex 中文字体,LaTeX - 设置中文字体
  15. Adobe Photoshop CC2014 安装过程
  16. python语言书写格式_设置Python代码格式
  17. 测绘-空中三角测量程序设计
  18. java 模板 word转pdf 可分页 带图片
  19. 5个常用的CMD命令
  20. 【数据结构】什么是拓扑排序—关于图的拓扑排序

热门文章

  1. Microsoft Ignite China, Shenyang After Party - Power Pages Web 开发介绍 直播预告
  2. 今日头条如何申请优质科技领域创作者
  3. 模拟退火法在TSP上的应用及算法实现
  4. 单因子分析和对比分析
  5. 2022-2028年中国真空包装酱猪蹄行业投资策略探讨及市场规模预测报告
  6. Regular、Normal、Medium、Light 对应的font-weight值
  7. [教育部文件]教育部 国家民委 公安部 国家体育总局 中国科学技术协会关于进一步减少和规范高考加分项目和分值的意见...
  8. WWDC第一天内容汇总,keynote+各平台整体状态介绍
  9. HTML+CSS制作一款情人节一款带音乐播放的情人节网页背景素材
  10. Andiod 是什么