String,StringBuffer,StringBuilder类
String类
String:字符串,使用一对""号表示
- String声明为final的,不可以被继承
- String实现了Serializable接口,表示String支持序列化
- Comparable接口,String可以比较大小
- String内部定义了final char value[]用于存储字符串数据
- String:代表不可变的字符序列,简称不可变性
- 通过字面量定义方式给一个字符串赋值,此时字符串值声明在字符串常量池中
- 字符串常量池中不会存储相同内容的字符串的
public class Test2 {
public static void main(String[] args) {
//字面式定义
//体现:String时不可变性的三中方式
//当对字符串重新赋值时,会创建新的内存地址指向新的内存地址,不会改变原来内存地址的值
String s1="abc"; //字面量定义方式
String s2="abc";
s1="hello";
System.out.println(s1);
System.out.println(s2);
//当对现有的字符串进行拼接操作时,会创建新的内存地址指向新的内存地址,不会改变原来内存地址的值
String s3="abc";
s3+="def";
System.out.println(s3);
//当对现有的今天替换,会创建新的内存地址指向新的内存地址,不会改变原来内存地址的值
String s4="abc";
String replace = s4.replace("a", "c");
System.out.println(replace);
System.out.println(s4);
}
}
public class Test3 {
public static void main(String[] args) {
//new+构造器创建
//字面式定义,声明在方法区常量池中
String s1="hello";
String s2="hello";
//new+构造器定义是在堆中开辟空间以后对应的地址值
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println(s1 == s2);//true
System.out.println(s1 == s3);//false
System.out.println(s3 == s4);//false
//面试题
//String s3 = new String("hello");在内存中创建了几个对象
//两个,一个是堆空间new结构,一个是char[] 常量池中的数据"abc"
}
}
不同拼接操作的比较
public class Test4 {
public static void main(String[] args) {
String s1="javase";
String s2="javaee";
String s3="javasejavaee";
String s4="javase"+"javaee";
String s5=s1+"javaee";
String s6="javase"+s2;
String s7=s1+s2;
//在比较是常量的时候,拼接的结果是相同的
System.out.println(s3 == s4);//true
//拼接的时候有变量,拼接的结果是不不相同的
System.out.println(s3 == s5);//false
System.out.println(s3 == s6);//false
System.out.println(s3 == s7);//false
//如果想要它在常量池中,就可以使用intern()方法,返回值放在常量池中
String intern = s5.intern();
System.out.println(intern==s3);
}
}
String类的常用方法
-
查看字符串的长度
-
取出指定下标的字符
-
判断字符串是否为空
-
把字符串变成小写
-
把字符串变成大写
-
返回字符串的副本,忽略前导空白与尾部空白
-
比较字符串的内容是否相同
-
比较字符串的内容是否相同 忽略大小写
-
把s2的内容拼接到s1后面,等价于+
-
比较两个字符串的大小
-
字符串截取从哪个位置开始
-
字符串截取从哪个位置开始到哪个位置结束,不包括最后那个位置
-
测试字符串是否可以使用指定的前缀
-
测试字符串是否可以使用指定的后缀
-
测试字符串是否可以使用指定的前缀,从那个下标开始
-
判断字符串是否包含括号里的字符串
-
返回括号里第一次出现字符串的下标
-
下标从哪个位置开始,第一次出现的str字符串
-
返回指定字符串在最右边出现的下标
-
返回指定下标开始,从右往左,最后出现的字符串的下标
-
indexOf()和lastIndexOf()找不到指定的字符串的下标会返回-1
-
把指定的字符串替换成新的字符串
-
把指定的字符替换成新的字符
-
根据正则表达式来替换字符串
-
先把数字替换成逗号,在把前缀逗号和后缀逗号替换成空字符
-
根据正则表达式判断字符串是否全是数字组
-
根据正则表达式判断字符串是否是一个杭州固定电话
public class Test4 {
public static void main(String[] args) {
String s1="HelloWorld";
//查看字符串的长度
System.out.println(s1.length());
//取出指定下标的字符
System.out.println(s1.charAt(0));
//判断字符串是否为空
System.out.println(s1.isEmpty());
//把字符串变成小写
System.out.println(s1.toLowerCase());
//把字符串变成大写
System.out.println(s1.toUpperCase());
String s2=" Hello World ";
//返回字符串的副本,忽略前导空白与尾部空白
System.out.println(s2.trim());
//比较字符串的内容是否相同
System.out.println(s1.equals(s2));
//比较字符串的内容是否相同 忽略大小写
System.out.println(s1.equalsIgnoreCase(s2));
//把s2的内容拼接到s1后面,等价于+
System.out.println(s1.concat(s2));
//比较两个字符串的大小
System.out.println(s2.compareTo(s1));
//字符串截取从哪个位置开始
System.out.println(s1.substring(4));
//字符串截取从哪个位置开始到哪个位置结束,不包括最后那个位置
System.out.println(s1.substring(2, 5));
String s3="helloworld";
//测试字符串是否可以使用指定的前缀
System.out.println(s3.startsWith("he"));
//测试字符串是否可以使用指定的后缀
System.out.println(s3.endsWith("ld"));
//测试字符串是否可以使用指定的前缀,从那个下标开始
System.out.println(s3.startsWith("wo", 5));
//判断字符串是否包含括号里的字符串
System.out.println(s3.contains("lo"));
//返回括号里第一次出现字符串的下标
System.out.println(s3.indexOf("ll"));
//下标从哪个位置开始,第一次出现的str字符串
System.out.println(s3.indexOf("wo", 4));
//返回指定字符串在最右边出现的下标
System.out.println(s3.lastIndexOf("ld"));
//返回指定下标开始,从右往左,最后出现的字符串的下标
//indexOf()和lastIndexOf()找不到指定的字符串的下标会返回-1
System.out.println(s3.lastIndexOf("r", 8));
String s4="好好学习,天天向上";
//把指定的字符串替换成新的字符串
System.out.println(s4.replace("好好", "认真"));
//把指定的字符替换成新的字符
System.out.println(s4.replace('学', '复'));
String str ="12hello034world5java7891mysql456";
//根据正则表达式来替换字符串
//先把数字替换成逗号,在把前缀逗号和后缀逗号替换成空字符
System.out.println(str.replaceAll("\\d+", ",").replaceAll("^,|,$",""));
str="1234567";
//根据正则表达式判断字符串是否全是数字组成
System.out.println(str.matches("\\d+"));
str="0571-4534289";
//根据正则表达式判断字符串是否是一个杭州固定电话
System.out.println(str.matches("0571-\\d{7,8}"));
}
}
String类型的转换
String number="123456";
//String-->基本数据类型,包装类通过parsexxx();
int i = Integer.parseInt(number);
System.out.println(i);
//基本数据类型,包装类-->String通过String.valueOf()
System.out.println(String.valueOf(i));
StringBuffer,StringBuilder常用方法
//StringBuffer,StringBuilder的常用方法
//1.append() 用于进行字符串的拼接
//2.delete(int start,int end) 删除指定位置的内容,不包括end长度的字符
//3.replace(int start,int end,String str) [start-end]位置中间替换成str
//4.insert(int offset,xxx) 在指定位置插入xxx
//5.reverse() 把当前的字符串序列逆转
//6.indexOf(String str) 返回指定字符串的下标序列
//7.substring(int start,int end) 返回从start位置开始到end结束的字符串,不包括end长度的字符
//8.length() 获取字符串的长度
//9.charAt(int n) 取出n的下标的字符
//10.setCharAt(int n,char ch) 指定的n的下标字符替换成ch
StringBuffer sb = new StringBuffer("abc123");
sb.append("4");
System.out.println(sb);
sb.delete(6,7);
System.out.println(sb);
sb.replace(5,6,"4");
System.out.println(sb);
sb.insert(5,3);
System.out.println(sb);
System.out.println(sb.reverse());
System.out.println(sb.indexOf("a"));
System.out.println(sb.substring(4,7));
System.out.println(sb.length());
System.out.println(sb.charAt(6));
sb.setCharAt(0,'d');
System.out.println(sb);
String,StringBuffer,StringBuilder区别
区别及源码分析
// String,StringBuffer,StringBuilder三者的异同
// String:不可变的字符序列,底层都是使用char[]存储
// StringBuffer:可变的字符序列,线程安全,效率低,底层都是使用char[]存储
// StringBuilder:可变的字符序列,jdk5新增的,线程不安全,效率高,底层都是使用char[]存储
// 源码分析:
// StringBuffer,StringBuilder使用构造方法创建对象时,底层会获取构造方法的字符长度加上16
// 当获取长度时,它的长度是有效字符,而不是16
// 当字符的长度过多时
// 扩容:扩容原来长度的两倍+2 同时将原有的数据添加到新的数组里里面
StringBuffer stringBuffer = new StringBuffer("a");
StringBuilder stringBuilder = new StringBuilder("b");
stringBuffer.append('c');
System.out.println(stringBuffer.length());
String,StringBuffer,StringBuilder的效率比较
//String,StringBuffer,StringBuilder的效率区别
//由慢到快:String>StringBuffer>StringBuilder
long start=0L;
long end=0L;
String s="";
StringBuffer stringBuffer1 = new StringBuffer();
StringBuilder stringBuilder1 = new StringBuilder();
start = System.currentTimeMillis();
for (int i = 0; i <40000 ; i++) {
s=s+i;
}
end=System.currentTimeMillis();
System.out.println(end-start);
start = System.currentTimeMillis();
for (int i = 0; i <40000 ; i++) {
stringBuffer1.append(String.valueOf(i));
}
end=System.currentTimeMillis();
System.out.println(end-start);
start = System.currentTimeMillis();
for (int i = 0; i <40000 ; i++) {
stringBuilder1.append(String.valueOf(i));
}
end=System.currentTimeMillis();
System.out.println(end-start);
结果:
2597
6
4
It's never too late to be the person you want to be.
去做你想成为的那个人永远都不会晚

浙公网安备 33010602011771号