String类
表示的是不可变的字符串对象!
使用的方法所产生的字符串返回值,都是新的字符串对象。
本质原因是在其内部存储数据的字符数组,都是final修饰的。无 法进行二次赋值
String构造方法:
String(String original);
String (byte[] bys);
String (char [] chs);
String (byte[] bys, int off,int len);
String (char[] chs,int off, int len);
除了第一种,都是在堆中创建字符串对象!!然后再把字符串拷贝到常量池中做一个备份!!!
常量池的主要作用:复用!!
第一种是先在常量池中创建一个参数字符串,然后再去堆中创建字符串对象。
常用方法:
1. int length();返回字符串中的字符个数!!
2. char charAt(int index); 返回指定位置上的字符!!
3. String (char[] value); 用字符数组value创建一个String对象。
4. String(char chars[] ,int x,int n); 用字符数组以x开始的n个字符创建一个String对象。
5.boolean equals(String s)比较字符串与参数s是否相等。
equals判断字符串的内容是否相等,==判断引用是否相等,是否为同一地址
以String类的equals方法:
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;
}
遇到字符串比较的地方,都是使用equals方法,基本不会使用==。
6. boolean startsWith(String s ) ;boolean endsWith(String s);判断字符串前缀是否为s
求子串在长串中出现的次数:
优化:发现子串开头后,截取字符串直接把子串长度的字符去掉!否则还是截掉首字母!
7.int compareTo(String s);按字典排序与参数s指定的字符串比较大小如果当前字符串与s相同,返回0,如果当前字符串大于s返回正值,小于s返回负值
compareTolgnoreCase(String s)方法忽略大小进行比较
8.boolean contains(String s);判断当前字符串是否含有参数指定的字符串s。
9. int indexOf(String s);返回字符串中首次出现参数s的索引位置,若没有检索到s则返回-1
lastIndexOf(String s)返回最后出现s的索引位置
10. String subString(int start);返回从字符串start位置截取到最后位置的字符串
subString (int start,int end);返回start到end位置(不包含end)的字符串。
求子串在长串中出现的次数:
优化:发现子串开头后,截取字符串直接把子串长度的字符去掉!否则还是截掉首字母!
11.String trim();返回去掉字符串前后空格后的字符串
12.String concat(String s);返回字符串与s连接后的字符串。
13. String toLowerCase(Locale locale);转换为小写
14.String toUpperCase(Locale locale); 转换为大写
15.String replace(CharSequence target,CharSequence replacement);返回将字符串中所有target替换为replacement的字符串
16. boolean matches(String regex);匹配正则表达式
17.String replaceAll(String regex,String replacement);
根据正则表达式进行替换
18.String[] split(String regex);根据正则表达式分割字符串。
StringBuffer:可变的字符串缓冲区:
内部保存数据的依然是一个字符数组!!
只不过数组不是final修饰的,可以随时指向其它的字符数组!!
在外界看来,就是这个StringBuffer对象可以发生变化。
一旦StringBuffer不想再发生变化了, 就可以使用toString方法,得到一个对应的String对象。
toString();转换成不可变的字符串;
特殊方法:
append(int x);在末尾添加内容
insert(int index,String str)在指定位置插入内容,
delete(int start,int end)删除指定范围的内容。
String类与StringBuffer类的区别:
String对象一旦发生变化,由于其内部的字符数组是final修饰的,所以是形成了一个新的对象!
StringBuffer对象发生变化,其内部的字符数组就发生变化。
StringBuilder类:
jdk1.5出现的,非线程安全的,效率高。
StringBuffer是线程安全的,效率低。
线程安全:同一时刻是否只有一个线程访问资源!
StringBuilder和StringBuffer的方法基本一致,区别只是是否安全而已。
StringBuffer测试题:
class StringBufferDemo{
public static void main(String[] args) {
StringBuffer s1 =new StringBuffer("A");
StringBuffer s2 =new StringBuffer("B");
test(s1,s2);
System.out.println(s1 +"," + s2);
}
private static void test(StringBuffer x,StringBuffer y) {
x.append(y);
y=x;
}
在方法中,x表示的对象是一个内容可以改变的对象,所以,使用x调用它的方法会真正的改变s1和x指向的内存地址的内容发生变化。
y是一个局部变量,这个引用变量本身的值发生的变化,不会影响到方法外。
网友评论