一、字符串是引用类型 ,值一旦确定不可改变。
String str ="bjsxt";
str ="good"; //重新开辟空间
二、String类常用方法
1)长度 length()
2)比较 地址与内容
a)地址 ==
b)内容
boolean equals(Object)
boolean equalsIgnoreCase(String) //不区分大小写
3)截取
a)String subString(int beginIndex)
b)String subString(int beginIndex,int endIndex)
4)判断子串存在
a)查找第一次出现的位置 不存在为-1
如果传入的为空串,则返回fromIndex
int indexOf(String)
int indexOf(String,int fromIndex)
int lastIndexOf(String)
int lastIndexOf(String,int fromIndex) 只从子字符串(长度为fromIndex+str.length)中查找
b)判断是否存在
boolean contains(String);
5)替换 String replaceAll(String regex,String)
String replace(String substr,String)
String replaceFirst(String ,String)
6)去除空格
String trim()//去除左右
7)转换大小写
String toLowerCase();
String toUpperCase();
8)判断开头结尾
boolean startsWith(String)
boolean endsWith(String)
9)返回字符常量池地址
intern()
三、String的构造器
1、使用字面值构造 String str ="bjsxt";
2、使用构造器
new String() 这里创建了一个String对象
new String("") 这里创建了一个String对象,并且指向字符串常量池中的“”对象
str1 =new String("bjsxt");
str2 =new String("bjsxt");这里产生了3个对象,两个String对象,一个“bjsxt”
四、String的地址问题
//编译时就能确定值
String s1 ="a1";
String s2 ="a"+1;
这样s1和s2都指向同一个字符串常量
//运行确定值 (变量)
String s3 ="a";
s2 = s3+1; // new String(s3+1)
s2创建了一个String对象,指向了“a1"这个常量
//常量 与字面值相同 编译时就能确定值
final String S4 ="a";
s2 =S4+1;
但是注意:方法的返回结果时运行期才能确定值。这时候也相当于先new一个String对象,然后在指向字符串常量
四、有一种蛋疼叫做乱码
1、编码与解码
解码:字节------》字符
编码:字符------》字节
2、java编码
getBytes()
getBytes(String charsetName) //使用指定字符集进行编码
3、解码
new String(byte[]);
new String(byte[],起始索引,长度)
new String(byte[],解码集)
new String(byte[],起始索引,长度,解码集)
4、
出现乱码的原因
1、字节数不够
2、编码集与解码集不统一
五、其他字符串类:StringBuilder StringBuffer
1、String、StringBuilder、StringBuffer区别
1)线程安全 String StringBuffer 线程安全 StringBuilder 不安全
2)String长度不可变,StringBuilder StringBuffer长度可变
3)方法重写: equals
String:比较内容
StringBuilder StringBuffer:没有重写equals 比较地址
六、分割字符串
1、StringTokenizer——————》迭代器 :不支持正则
用法如下图:
结果为
用法2:将分隔符显示出来
结果为
2、String的split方法
这个方法支持正则,直接用string对象.split()就可以