目录
前言
String的内部机制
String的两种创建方式
前言
关于String字符串我们并不陌生,在我们的程序中经常使用String这个类,甚至有的同学会把string当成基本数据类型,今天我们就来了解一下String这个类
String的内部机制
我们把string称为不可变字符串,意思是字符串一旦创建其内容就不能改变了,我们之前使用的字符串连接也好或者别的操作,只要是string这个类,并且结果返回了一个字符串,那么这个字符串就一定是新产生的字符串,而不是在原有字符串的基础上修改得到的
那么string的内部机制是什么样的呢?
通过源码我们知道,string的底层也是用一个字符数组来存储字符串的
我们进一步分析这个名为value的成员变量中存放的是什么?
因为数据类型是字符数组类型,所以这个value中存的是数组在堆内存中的地址,并且这个value被final修饰了,被final修饰的属性我们称为常量其值不能改变,并且只能赋值一次
通过分析我们知道了string的内部存放数据的数组的地址值不能改变,所以这个数组不能进行扩容,那么理论上我们应该可以改变数组中的值,但是为什么改变不了呢?
是因为string内部并没有对外提供可以改变内部数据的方法,所以我们没法改变,并不是不能变,是string不想让外界改变内部数据
String的两种创建方式
string的创建方式有两种
- 使用构造方法创建对象
这种方法就是用new关键字正常创建对象,string提供了很多构造方法
String s = new String();
String s = new String("123") ;
String s = new String(new char[]{'1','2','3'}) ;
String s = new String(new byte[]{97,98});
·我们可以创建空参的,直接传入一个字符串,传入一个字符数组,或者传入一个byte类型的数组,再通过ASCII码转换成对应的字符
- 使用双引号创建字符串
这也是string特别的地方,正是因为这种看上去像直接赋值的方式,让很多同学觉得string是一基本数据类型,其实string是一个引用数据类型,无论哪种方式变量中存的都是地址,所有双引号中的字符串都是存在常量池中的
如果我们使用双引号,底层会去内存中的常量池中查看这个双引号中的字符串在常量池中存不存在 ,如果存在那么就直接使用常量池中的,如果不存在就在常量池中新创建一个
这就是两种创建方法是区别,常量池中的一样的字符串只会创建一个,下次再使用这个字符串就是一个地址的字符串,而new的字符串对象每次都是一个新的对象,即使内容相同,地址也不同。