String类简介
关系图:
value不可修改的是value指向的地址,因为可以value为一个数组,而数组名其实就相当于一个指针,指向着一块地址,然后在指向的地址里存放相应的值,值可以任意是什么,但是地址不可改变
创建对象方式
内存分布图
现在堆开辟空间将value数组存放在其中然后在常量池找有没有想要的这串字符,有就直接指向拿来,没有就新创建
例题
去常量池找有没有相应的字符串,有就直接指向,没有就新建
b.intern返回的是b的字符串地址,而b他是指向堆中的地址由堆中地址指向常量池的,所以两个地址不同最后一个为false
没有new一个String,只要常量池有这串字符,那么就是相等的指向已有的
特性以及例题
他是先在常量池创建一个对象存放hello,然后再在常量池找有没有haha,没有就重新创建一个哈哈,而不是直接改变hello
我们Debug进去可以发现,直接来到了StringBuilder的无参构造器,那么代表其实进行了StringBuilder stringbuilder=new StringBuilder()动作
再然后我们可以看出来,先把hello传入其中
、然后再是abc
再来到了toString 他return了一个new String(value ,0,count),就代表新创建了一个对象,value为一个字符串数组存放了之前传进来的值,count为个数,所以,c其实新建了个对象在堆中用,其中的value指向常量池存放了字符串
这个其实值得注意的是调用方法时,传进去的是地址还是参数,首先,我们都知道,数组名代表的其实就是数组的地址,所以,传进去的是地址,那么在方法中改变数组的值,实际值也会改变,但是,字符串传进去的就是字符串而已,并非其地址所以,他在方法中改变,并不会影响外部的值
所以最终的结果是hspandhava
String类常见方法
StringBuffer类简介
关系图
String类与StringBuffer类比较
StringBuffer类构造器简介
String与StringBuffer转换方式
StringBuffer类常用方法
append源码
改写的toSTring
delete
replace
例题
import java.util.Scanner;/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
*/public class StringBurber_
{public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String str=scanner.next();String str1=scanner.next();StringBuffer stringBuffer = new StringBuffer(str1);int i=stringBuffer.indexOf(".");for (i=i-3;i>0;i=i-3){stringBuffer=stringBuffer.insert(i,",");}System.out.println(stringBuffer);}
}