String类概述
字符串是由多个字符组成的一串数据(字符序列)的字符串常量,java中所有字
符串都是String类的实例.
有两种创建形式:
-
第一种:String s = “abc”;
先在栈中创建一个对String类的对象引用变量s,然后去字符串常量池中查找
有没有"abc", 如果没有则在常量池中添加”abc”, s引用变量指向常量池中
的”abc”,如果常量池中有,则直接指向改地址即可,不用重新创建.
-
第二种: String s = new String(“abc”);
一概在堆中创建新对象,值存储在堆内存的对象中。
String类的特点
一旦创建,内容无法改变。
为什么呢?,其实很简单,因为String类本身没有提供,没有向外提供改变其内容的方法,所以无法改变(但是String提供了很多操作方法),所以,就算你改变了String的内容,那也是更改了对象的内存指向了,对象的栈引用指向了新的内容的堆地址。
举个例子
String str="abc";
str="abcdef";
分析一下内存过程:
可以发现,这是一个简单的常量;
首先,栈中创建一个str,然后常量池中去寻找知否有一个内容是abc,如果有直接将str指向这个内容,如果没有则在常量池创建这个内容,并将str指向这个内容。
然后,将str的内容改为了abcdef,(还是一样会去常量池去寻找有没有abcdef这样一个字符串,如果有直接使用,如果没有再进行创建),这个时候,str引用先打断指向abc,重新指向abcdef。
也就是说只是str引用的指向变了,而创建的内容并没有改变。