字符串 String
字符串缓冲区(池):StringBuffer StringBuilder
String StringBuffer StringBuilder的区别?
String 是内容不可变的字符串
StringBuffer和StringBuilder 是内容可变的字符串
面试题:String StringBuffer和 StringBuilder的区别
StringBuffer类是线程安全的
StringBuilder类线程是不安全的
StringBuffer在JDK1.0中就有,而StringBuilder在JDK5.0以后才出现
StringBuilder的一些方法实现要比StringBuilder快点
string
String创建对象的区别
静态创建对象:String s = "abc"; 使用静态方式创建的字符串,在方法取得常量池中只会产生唯一一个字符串对象,使用该方式产生同样一个字符串时,内存中不再开辟另一块空间,而是两个引用变量指向同一个字符串对象
动态创建对象:String s2 = new String("abc");使用动态方式创建的字符串,在堆内存中会产生不同的对象
//String的创建 使用静态方式创建对象
String s = "abc";
String s1 = "abc";
System.out.println(s==s1);//true 比较的是地址
System.out.println(s.equals(s1));//true 此时equals被重写
//String的创建 使用动态方式创建对象
String s2 = new String("abc");
String s3 = new String("abc");
System.out.println(s2==s3);//false 比较的是地址
System.out.println(s2.equals(s3));//true 此时equals被重写
System.out.println(s2);//abc
1.使用一个字符数组组建一个String对象
char[] arr = {'a','b','c','d'};
String sarr = new String(arr);
System.out.println(sarr);//abcd
2.通过字符数组中指定位置,指定个数的元素 去创建String对象
char[] arr = {'a','b','c','d'};
String s4 = new String (arr,1,2);
//第一个参数表示目标数组 第二个参数表示起始下标(从0开始) 第三个表示个数
System.out.println(s4);//bc
3.将StringBuffer对象转换为String对象
StringBuffer sb = new StringBuffer("abc");
String s5 = new String(sb);
System.out.println(s5);//abc
4.将字节数组按照指定的编码形式转换为字符串
Byte[] barr = {1,2,3,4};
try {
String s6 = new String(barr,"utf-16");
//将barr 按照utf-16的编码方式转换为字符串
System.out.println(s6);//乱码
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
5.getBytes("utf-8");字符串按照指定的解码形式转换为字节数组
byte[] bname = new byte[10];
String name1 = "张三";
bname = name1.getBytes("utf-8");//乱码
//遍历数组
for (int i = 0; i < bname.length; i++) {
System.out.print(bname[i]);//-27-68-96-28-72-119a
}
6.字符串不能直接转换为字符,但是可以用toCharArray();转换为字符数组
String s = "abcd";
char[] arr = s.toCharArray();
for(char c : arr) {
System.out.println(c);//a b c d
}
String方法
1.s1.equalsIgnoreCase(s2) 比较两个字符串的内容是否相同,忽略大小写
String s = "abc";
String s2 = "ABC";
//比较两个字符串的内容是否相同,忽略大小写
System.out.println(s.equalsIgnoreCase(s2));//true
2.s.toUpperCase() 将String对象中的所有字符转换为大写
String s = "abc";
System.out.println(s.toUpperCase());//ABC
3.s.toLowerCase() 将String对象中的所有字符转换为小写
String s2 = "ABC";
System.out.println(s2.toLowerCase());//abc
4.s.charAt(下标) 返回指定索引处的char值
String s = "abc";
System.out.println(s.charAt(1));//b
5.s.substring(下标) 返回一个新字符串,该字符串是从下标数(begin)开始截取之后的所有字符 包含该下标数的元素
String s3 = "abcdefg";
String s4 = s3.substring(2);
System.out.println(s4);//cdefg
6.s.substring(开始下标, 结束下标-1)返回一个新字符串,该字符串开始是从下标数(begin)到下标数-1(end-1)结束的内容
String s3 = "abcdefg";
String s5 = s3.substring(2, 5);
System.out.println(s5);//cde
7.s.indexOf(字符或者字符串) 返回指定字符或字符串在此字符串中第一次出现的位置(下标)
String s3 = "abcdefg";
int i = s3.indexOf('c');
System.out.println(i);//2 下标
8.s.indexOf(字符或者字符串,下标位置) 指定位置开始搜索 返回指定字符或者字符串在此字符串中第一次出现的位置(下标) 如果查不到指向字符或者字符串 会显示-1
String s3 = "abcdefg";
int indexof2 = s3.indexOf('c',1);
System.out.println(indexof2);//2 c所在的位置下标为2
//如果查不到指向字符或者字符串 会显示-1
9.s.trim() 返回新的字符串,忽略前导空白和尾部空白(去除字符串两端空白)
String s6 = " abc ";
System.out.println(s6.trim());//abc
10.s.length() 返回此字符串的长度
String s7 = "123456";
System.out.println(s6.length());//6
11.s1.concat(s2)将指定字符串连接到此字符串的结尾u(拼接) s2接在s1后
String s1 = "aaa";
String s2 = "haha";
String c = s1.concat(s2);
System.out.println(c);// aaahaha
12.s1.split(",") 根据给定正则表达式的匹配拆分此字符串(切割)
String s = "a,b,c,d,e,f";
String [] split = s.split(",");
for(String str : split) {
System.out.println(str);//a b c d e f
}
13.s.replace(将要被替换的元素,想替换成的元素);返回一个新的字符串,它是通过用newchar替换词字符串中出现的所有oldchar得到的(替换)
String s = "abcdefg";
String replace = s.replace("d", "@");
System.out.println(replace);//abc@efg
14.s.startsWith("开头") 测试此字符串是否以指定的的字符或者字符串开头
String s = "abcdefg";
//测试此字符串是否以指定的的字符或者字符串开头
boolean b = s.startsWith("abc");
System.out.println(b);//true
StringBuffer
StringBuffer:内容可变的字符串 节省内存开销
stringbuffer用equal比较时,比较的是地址 不是内容 equal方法没有被重写
1.创建stringbuffer对象
1.1 第一种方式 直接创建 StringBuffer sb = new StringBuffer();
1.2 第二种 创建时直接赋初始容量 StringBuffer sb2 = new StringBuffer(10);
2.sb2.capacity()获取StringBuffer容量值
StringBuffer sb2 = new StringBuffer(10);
System.out.println(sb2.capacity());//10
3.将字符串内容转换为StringBuffer
StringBuffer sb3 = new StringBuffer("abc");
System.out.println(sb3);//此时字符串abc被转换为stringbuffer类型
4.返回长度 sb.length()
5.sb.reverse()将此字符序列用其反转形式取代
StringBuffer sb = new StringBuffer("abc");
sb.reverse();
System.out.println(sb);//cba
6.sb.setCharAt(下标, '想要替换的字符'); 将给定索引处的字符设置为...(替换,修改)
StringBuffer sb3 = new StringBuffer("abc");
sb3.setCharAt(0, '#');
System.out.println(sb3);//#bc
7.sb.delete(开始删除下标,下标减一结束);移除此序列的子字符串中的字符(删除)
StringBuffer sb5 = new StringBuffer("abcdefg");
sb5.delete(2, 4);//从2开始 到4-1结束 包头不包尾
System.out.println(sb5);//abefg
8.sb.charAt(下标); 回此序列中指定索引处的char值
StringBuffer sb5 = new StringBuffer("abcdefg");
char c = sb5.charAt(0);
System.out.println(c);
9.sb5.toString();将stringbuffer类型转换为string类型 String string = sb5.toString();
10.sb.append("添加内容")指定的字符串追加到此字符序列
StringBuffer sb5 = new StringBuffer("abcdefg");
System.out.println(sb5);
System.out.println(sb5.append("w"));//abcdefgw
11.sb5.insert(下标, "要插入内容") 将字符串插入此字符序列中 插在此下标前
StringBuffer sb5 = new StringBuffer("abcdefg");
sb5.insert(1, "@@@");
System.out.println(sb5);//a@@@bcdefg