<--
注意:
String在方法操作后不会改变自身,不同于StringBuilder!!!
-->
一.字符串的存储
* 1.字符串缓冲区
字符串是常量, 不能被修改, 所以可以共享, 多个引用指向相同的字符串常量时, 其实引用的是同一个对象, 这个对象在缓冲区中
示例1:
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
结果为: true
原理是: 第一个字符串"abc"创建后,存储在了字符串常量池中,所以第二个可以直接使用该字符串
这段代码总共创建了几个字符串对象: 1个
示例2:
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2);
结果为: false
原理是: 第一个字符串"abc"创建后,存储在了字符串常量池中,而第二个先创建对象,然后再指向了已存在的"abc".
这段代码总共创建了几个字符串对象: 2个
* 2.字符串串联
示例1:
String s1 = "abc";
String s2 = "a";
String s3 = "bc";
String s4 = s2 + s3;
System.out.println(s1 == s4);
结果为: false
原理是: 字符串串联使用的是字符串缓冲区的append()方法,使用new重新创建了字符串,所以不相等
示例2:
String s1 = "abc";
String s2 = "a" + "bc";
结果为: true
原理是: 字符串常量相加,编译时就会直接相加,等价于String s2="abc",而"abc"已经在字符串常量池里存在了
3.字符串类构造函数
使用平台默认码表, 将字节数组转为字符串: new String(byte[] b)
使用指定码表, 将字节数组转为字符串: new String(byte[] b, String s)
使用指定码表, 将字节数组中的一部分数据转为字符串: new String(byte[] b,int offset,int len,String s)
使用字符数组创建字符串: new String(char[] c)
*** 4.字符串常用方法
查找指定位置上的字符: charAt(int index)
查找指定字符第一次出现的位置: indexOf(char c)
查找指定字符最后一次出现的位置: lastIndexOf(char c)
替换字符串: replace(String old, String new)
截取字符串的子串: substring(int beginindex)/substring(int beginindex, int endindex)
分割字符串: split(String s)
判断是否包含一个字符串: contains(String s)
按字典顺序比较两个字符串: compareTo(String s)
获取长度: length()
去掉前后空白: trim()
5.StringBuffer和StringBuilder的区别
StringBuffer: 线程安全
StringBuilder: 线程不安全
6.写出下面代码的运行结果
public class Foo {
public static void main(String[] args) {
String strValue = "ABCDEFG";
strValue.substring(3);
strValue.concat("123");
System.out.println(strValue);
String value = new String ("ABCDEFG");
System.out.println(strValue == value);
}
}
结果:
ABCDEFG
false