字符串的分类:
不可变的字符串: String类
可变的字符串: StringBuilder/StringBuffer类.
本质:就是char数组(char[]).
String对象的创建:
1):直接赋字面量. 如,String name = "will";
2):使用构造器创建. 如,Stirng name = new String("will");
String对象的空值.
1):引用为空: String name = null; 在内存没有开辟/没有引用空间.
2):空 字 符: String name = ""; 在内存开辟空间,只是没有内容数据.
String相关面试题:
-------------------------------------------------------------------------------------
面试题1: 问题:下述两行代码,分别创建了几个对象?(字符串的存储问题/常量池.)
String name = "Will"; //创建了0个或1个String对象.
//若常量池已经存在"Will",则直接引用,不存在,先创建"Will"对象.
String name = new String("Will");//创建了1和2个对象.
//new就决定会在堆空间创建对象.必须有1个.
若常量池已经存在"Will",则直接引用,不存在,先创建"Will"对象.
--------------------------------------------------------------------------------------
面试题2:判断下列代码创建了几个String对象,彼此直接是否相等.
String str1 = "ABCD";
String str2 = "A" +"B"+"C"+"D"; 编译器优化之后,该代码等价于 str1.
String str3 = "AB"+"CD";
String c = "CD"; String str4 = "AB" + c;
String str5 = "AB" + getXX(); (备注:getXX方法返回"CD");
-----------------------------
String对象比较:
1:单独使用""引号创建的字符串都是直接量,编译期就已经确定存储到常量池中;
2:使用new String("")创建的对象会存储到堆内存中,是运行期才创建;
3:使用只包含直接量的字符串连接符如"aa" + "bb"创建的也是直接量编译期就能确定,已经确定存储到常量池中;
4:使用包含String直接量(无final修饰符)的字符串表达式(如"aa" + s1)创建的对象是运行期才创建的,存储在堆中;
-----------------------------
比较字符串: ==:只能比较内存地址,若要比较内容:equals.
String是不可变的类,每次内容改变就会创建新的String对象.
----->不擅长做字符串的连接操作,性能太低.
-------------------------------------------
解决方案:使用可变的字符串,内容改变之后,对象依然不变.
StringBuidler/StringBuffer:
------面试----------------------跑男(baby);
StringBuffer :特点: 线程安全性较高,但是性能较低. 多线程使用StringBuffer.
StringBuilder :特点: 线程安全性较低,当时性能较高. 推荐 单线程使用StringBuilder.