本文涉及到的类:String、StringBuffer、StringBulider
一、不可变字符串:String
为什么说String是不可变的字符串?
有两方面来保证它的不可变性:
一是将字符数组用final关键字修饰,被final修饰的引用数据类型值是不可变的,但这只能限制符号引用的值不可变,即指向的内存空间不可变;
二是String作为封装类没有对外提供修改字符数组中的值的方法,以此来限制它指向的内存空间中的值也不可改变;
不同于一中是使用语法规则达到不可变性,二中通过代码实现来达到不可变性,可以被反射破坏
1.1 引用数据类型String
String类是日常开发中最常用的非基本数据类型,它作为一个引用数据类型的类却经常被误认为是基本数据类型,我认为给大家带来误解的地方恰恰就是java虚拟机做的好的地方
char ch = 'a';
boolean b = false;
byte t = 1;
short sh = 1;
int n = 2;
float f = 3.0;
long l = 4;
double d = 5.0;
String str1 = "今天又学习了";
HashMap map = new HashMap();
在变量的声明与初始化上,String成功的伪装成了“基本数据类型”。
作为一个引用数据类型,下面的代码应该更能让大家正确认识它
String str2 = new String("今天有学习吗?");
String str3 = new String("今天又学习了");
虽然new String的写法更符合引用数据类型的特征,但是我们平时却不这么写,而且也不推荐这样去写。那这样写的问题是什么呢?或者说是什么原因导致了String类与一般引用数据类型的差异呢?了解了原因,再来看问题吧。
1.2 java虚拟机对字符串的优化
1、字符串的常见相信不用过分证明了,它可以是声明为String类型的字符串变量(或者可称为常量,因为String是不可变的),也可以是你代码中的一个类名、变量名、方法名等任何可自定义的名称。
2、String作为一个引用类型,它核心的属性只有一个,而且不可变
private final char value[];