什么是字符串:
字符串就是一串字符(多个字符排列在一起,好比羊肉串).
本质,就是char数组(char[]).
String str = "ABC";
char[] data = {'A','B','C'};
字符串的分类:
不可变的字符串: String类
可变的字符串: StringBuilder/StringBuffer类.
String类: 就表示字符串.
不可变的字符串,一个String对象只能表示一个固定的字符串,若内容改变,则对象也改变.
------------------------------------------------------------------------------------
String对象的创建:
1):直接赋字面量. 如,String name = "will";
2):使用构造器创建. 如,Stirng name = new String("will");
String对象的空值.
1):引用为空: String name = null; 在内存没有开辟/没有引用空间.
2):空 字 符: String name = ""; 在内存开辟空间,只是没有内容数据.
-------------------------------------------------------------------------------------
开发中经常判断非空的字符串:
public static boolean hasLength(String str){
TODO
}
------------------------------------------------------------------------------------
测试代码:
hasLength(null):false
hasLength(""):false
hasLength(" "):false
hasLength("XX"):true
String相关面试题:
-------------------------------------------------------------------------------------
面试题1: 问题:下述两行代码,分别创建了几个对象?(字符串的存储问题/常量池.)
String name = "Will"; //创建了0个或1个String对象.
//若常量池已经存在"Will",则直接引用,不存在,先创建"Will"对象.
String name = newString("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.