一:创建
- 直接赋一个字面量
String str="ABCD"
- 通过构造器
String string=new String("ABCD);
二:字符串对象的空串与NUll串
//Null串
String str=null //表示引用为空,没有初始化,没有分配内存空间
要检查一个字符串是否为 null, 要使用以下条件:if (str == null)
//空串 "" 是长度为 0 的字符串
String str="" //内容为空字符串,初始化了,也分配内存空间了,只不过没有内容
//可以调用以下代码检查一个字符串是否为空:
if (str.lengthQ = 0)
或
if (str.equals(""))
三:字符串的分类
- 可变字符串
当对象创建以后,对象的内容可以保持变化,变化以后对象保持不变。
1.StringBuffer
2.StringBuilder(效率最高)
区别:StringBuffer使用了synchronized,线程安全,但是效率低,反之StringBuilder效率高
- 不可变字符串(String)
当前对象创建完毕以后,该对象的内容是不可改变的,一旦改变就是一个新对象。
四:判断字符串为空
- 引用不能为空
- 字符串内容不能为空字符串
五:字符串的比较操作
- 使用"=="
只能比较引用的地址是否相同 - 使用"equal"(覆盖父类的方法)
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
- 面试必备
单独使用"=“创建的字符串都是直接量,编译时期就已经存储到常量池里面
使用new String(”")创建的对象会存储到堆内存,运行期才创建
使用包含直接量的字符串链接如"aa"+"bb"创建也是直接编译时期就确定,已经存储到常量池
使用包含String的直接量(无finally修饰符)的字符串表达式创建的对象也是运行时期才创建的存储在堆中
通过变量/调用方法去连接字符串,都只能在运行时期才能确定变量的值和方法的返回值,不存在编译优化操作
其他:常用方法
方法名 | 说明 |
---|---|
public String(String original) | 初始化新创建的String对象,使其表示与参数相同的字符序列; 换句话说,新创建的字符串是参数字符串的副本。 |
public int length() | 返回此字符串的长度。 |
public char charAt(int index) | 返回char指定索引处的值。 |
public String concat(String str) | 将指定的字符串连接到该字符串的末尾。 |
public static String join(CharSequence delimiter, CharSequence… elements) | 返回一个新的字符串,由CharSequence elements的副本组成,并附有指定的delimiter的delimiter 。 |
public String[] split(String regex, int limit) | 将此字符串拆分为给定的regular expression的匹配。 |
public boolean equals(Object anObject) | 将此字符串与指定对象进行比较。 |
public boolean equalsIgnoreCase(String anotherString) | 将此String与其他String比较,忽略案例注意事项。 如果两个字符串的长度相同,并且两个字符串中的相应字符等于忽略大小写,则两个字符串被认为是相等的。 |
public String toLowerCase() | 转换成小写。 |
public String toUpperCase() | 转换为大写。 |