1.String两种实例化方式比较
1、直接赋值的对象实例化模式
String strA = "mldn";
String strB = "mldn";
System.out.println(strA=strB);//true
主要原因在java程序的底层里面提供有一个专门的字符串池(字符串数组)。新建字符串的时候,先去池中找是否存在,存在则引用,不存在则创建,可以节约空间。
在采用直接赋值的处理过程中,对于字符串而言可以实现池数据的自动保存,这样如果再有相同数据定义时,可以减少对象的产生,以提升操作性能;
2.构造方法实例化String类对象
String str = new String("mldn");
"mldn"字符串一个匿名对象,会开辟一个堆内存(由匿名对象开辟的),因为关键字new也开辟了堆内存空间,且两个空间内容是一样的,引用指向new,而后只会使用一块,而两外一个由于字符串常量所定义的匿名对象将成为垃圾空间,造成了空间上的浪费。
2.String对象(常量)池
对象池的主要目的是实现数据的共享处理。
但是java之中的对象池实际上可以分为两种:
- 静态常量池:程序(*.class)在加载的时候会自动将此程序之中保存的字符串,普通的常量,类和方法等等,全部进行分配;
例子:
String strA = "www.mldn.cn";
String strB ="www."+"mldn"+".cn";
System.out.println(strA==strB);//true
- 运行时常量池:当一个程序(*.class)加载之后,里面可能有一些变量.
例子:
String info = "mldn";
String strA = "www.mldn.cn";
String strB ="www."+info+".cn";
System.out.println(strA==strB);//false
这个时候之所以是false,是因为程序在加载的时候并不确定info是什么内容。因为在进行字符串连接的时候info采用的是一个变量,变量的内容是可以修改的,所以它不认为最终的strB的结果就是一个所需要的真实的最终的结果。
3.字符串内容不可修改
在String类之中包含的是一个数组,数组的最大缺点在于长度不可改变,当设置了一个字符串之后,会自动的进行一个数组空间的开辟,开辟的内容长度是固定的。
String str ="www.";
str += "mldn.";
str = str + "cn";
System.out.println(str);
引用传递图:
分析图2,字符串是匿名对象,就会在堆内存开辟一块空间,但"mldn"不是最终想要的,最终会再以"www.mldn"开辟一块空间,"str"的引用最终指向了"www.mldn",剩下两块空间就成了垃圾空间,等待回收。
分析图3,字符串"cn"开辟了一块空间,最后想要的是"www.mldn.cn",且指向最后进行了重连,其它的空间指向断开,最终指向了"www.mldn.cn"。
在整个处理过程之中,字符串常量的内容并没有发生改变,改变的只是一个String类对象的引用,并且这种改变将有可能带来大量的垃圾空间。
String类在开发中不要进行内容的频繁修改,否则将会造成更多的垃圾空间。
4.字符串格式化
可以利用占位符实现数据的输出,对于占位符而言,常用的:字符串(%8)、字符(%c)、整数(%d)、小数(%f)等来描述
方法:String format(Stirng format,各种类型... args)
普通方法
描述:根据指定的结构进行文本格式化显示。
案例:
String name = "小嘿";
int age = 18;
double score = 98.765321;
String str = String.format("姓名:%s、年龄%d、成绩:%5.2f", name, age, score);
System.out.println(str);
5.字符串比较
String类所提供的一个比较方法:public boolean equals(String str)
;
常见面试题:请解释String比较中==与equals()的区别?
- ==:进行的是数值比较,如果用于对象比较上比较的是两个内存的地址数值;
- equlas():是类所提供的一个比较方法,可以直接进行字符串内容的判断;