字符串(String&StringBuffer&StringBuilder)知识点的总结(含代码)
1、字符串常用赋值:
1)利用双引号引用字符串常量
2)利用构造方法来直接实例化String类型的变量
3)利用字符数组实例化 字符数组--->String
2、字符串的拼接(+,+=,concat())
碰到字符串后直接输出后面的内容;
碰到字符串前,先做运算,后输出内容;
碰到大括号,先运算大括号中的值,后输出内容
3、字符串的缓冲区(常量池)
当定义字符串的时候,首先会先去字符串常量池中查找是否有该字符串的对象,如果有就直接引用,如果没有就会创建对象
4、字符串的相关方法
5、String类型: 不能改变的字符序列
StringBuffer: 可以改变的字符序列
StringBuilder:可以改变的字符序列
类名 String StringBuilder StringBuffer(排队,同步)
对象类型 字符串常量 字符串变量 字符串变量
线程安全性 不安全 不安全 安全
执行效率 低 高 中
操作小,数据少,用String
单线程,操作多,数据多,用StringBuilder
多线程,操作多,数据多,用Stringbuffer
1 字符串赋值的方法
//1、利用双引号引用字符串常量
String str = "好好学习";
//2、利用构造方法来直接实例化String类型的变量
String str1 = new String("天天向上");
//3、利用字符数组实例化 字符数组--->String
char[] chs = {'j','a','v','a'};
String str2 = new String(chs);
2 字符串拼接
//字符串的拼接(+,+=,concat())
String str3 = str+"abc"; //结果:好好学习abc
String str4 = str.concat("abc"); //结果:好好学习abc
//注意:
String a = "1"+2+3+4;//1234 碰到字符串后直接输出后面的内容
String b = 1+2+3+"4";//64 碰到字符串之前先做运算,后输出内容
String c = "1"+(2+3+4);//19 碰到大括号,先运算大括号中的值,后输出内容
System.out.println("a:"+a);
System.out.println("b:"+a);
System.out.println("c:"+a);
3 字符串缓冲区(常量池)
在jdk1.7之前,字符串常量池是在方法区中
在jdk1.8之后,字符串常量池是在堆中
字符串常量池:
当定义字符串的时候,首先会去字符串常量池中查找是否有该字符串对象
如果有,就字节引用,如果没有才创建对象
//字符串的缓冲区(常量池)
String s1 = "abc";
String s2 = "abc";
String s3 = s1;
System.out.println(s1 == s2); //true
System.out.println(s2 == s3); //true
/**
* ==: 作用在基本数据类型,比较的就是数值
* ==: 作用在引用数据类型,比较的就是地址
*/
比较字符串是否相等
String name = new String("tom");
String dbName = new String("tom");
System.out.println(name == dbname);//false
System.out.println(name.equals(dbName));//true
String name1 = "tom";
String dbName1 = "tom";
System.out.println(name == dbName1);//ture
System.out.println(name.equals(dbName1));//ture
String e = "Hello";
String f = new String("World");
String str1 = e + f;
String str2 = "Hello"+"World";
String str3 = "HelloWorld";
System.out.println(str1 == str2);//false
System.out.println(str2 == str3);//ture
System.out.println(str1.equals(str2));//true 比较两者的内容
4 字符串的相关方法
String name = "我欲乘风归去,乘风归去~";
//获取数组长度 length属性
//获取集合长度 size()方法
//获取字符串长度 length()方法
System.out.println("长度为:"+name.length);
//获取指定位置上的字符 charAt()
System.out.println(name.charAt(1));
System.out.println(name.charAt(name.length-1));
//获取字符串第一次出现位置的下标 indexOf()
System.out.println(name.indexOf("乘风"));//2
//从指定字符串开始查询
System.out.println(name.indexOf("乘风",4));//7
System.out.println(name.lastIndexOf("乘风"));//7
System.out.println(name.listIndexOf("乘风",6));//2
//判断字符串的首位内容
System.out.println(name.startsWith("我"));//true
System.out.println(name.endsWith("去"));//false
//获取字符数组:字符串--->字符数组
char[] chs = name.toCharArray();
System.out.println(Arrays.toString(chs));
//字符数组--->String
char[] chss = {'j','a','v','a'};
String str2 = new String(chss);
//判断字符是否存在
System.out.println(name.contains("琼楼"));//false
System.out.println(name.indexOf("琼楼"));//-1
//截取字符串
System.out.println(name.substring(5));//去,乘风归去~
System.out.println(name.startsWith(5,11));//去,乘风归去
//大小写转化
String pwd = "Zero";
String dbPwd = "ZEro"
System.out.println(pwd.toUpperCase());//全部转换为大写
System.out.println(pwd.toLowerCase());//全部转换为小写
//比较字符串是否相等
System.out.println(pwd.equals(dbPwd));//false
System.out.println(pwd.equalslgnoreCase(dbPwd));//ture
//去除空白 trim():去除首尾空格
String id = " 123 321 ";
System.out.println(id.trim());
//去除所有空格 "\\s":正则表达式
System.out.println(id.replaceAll("\\s",""));
5 String&StringBuffer&StringBuilder的比较
String:不能改变的字符序列
StringBuffer:可以改变的字符序列
5.1 StringBuffer常用方法
StringBuffer sbf = new StringBuffer("门前大桥下");
sbf.append("游过一群鸭");
System.out.println(sbf);
//插入字符串 insert()
System.out.println(sbf.insert(5,"石头"));
System.out.println(sbf);
//其他方法和String类似
//charAt(index)
//indexOf(str)
//subString()
5.2 三者之间的相互转换
//三者时间相互转换
//String--->StringBuffer/StringBuilder
String str = "张三";
StringBuffer sbf1 = new StringBuffer(str);
System.out.println(sbf1.getClass);//查看变量类型
//StringBuffer/StringBuilder--->String
String str1 = sbf1.toString();
//StringBuffer和StringBuilder互转
//1、StringBuffer--->String
//2、String--->Stringbuilder
5.3 三者之间的区别
类名 | String | StringBuilder(卡车) | StringBuffer(排队上公交,同步) |
---|---|---|---|
对象类型 | 字符串常量 | 字符串变量 | 字符串变量 |
线程安全性 | 不安全 | 不安全 | 安全 |
执行效率 | 低 | 高 | 中 |
- 操作少,数据少,用String
- 单线程,操作多,数据多,用StringBuilder
- 多线程,操作多,数据多,用StringBuffer
public class StringDemo03{
//比较String\StringBuffer\StringBuilder的执行效率
public static void mian(String[] args){
String str = "";
//1、获取当前系统时间的毫秒数
long startTime = System.currentTimeMillis();
for(int i=0;i<10000;i++){
str += i;
}
//获取结束时的毫秒数
long endTime = System.currentTimeMillis();
System.out.println("String消耗的时间:"+(endTime-startTime));
StringBuilder sbd = new StringBuilder();
//2、获取当前系统时间的毫秒数
long startTime1 = System.currentTimeMillis();
for(int i=0;i<10000;i++){
sbd += i;
}
long endTime1 = System.currentTimeMillis();
System.out.println("String消耗的时间:"+(endTime1-startTime1));
StringBuffer sbf = new StringBuffer();
//3、获取当前系统时间的毫秒数
long startTime2 = System.currentTimeMillis();
for(int i=0;i<10000;i++){
sbf += i;
}
long endTime2 = System.currentTimeMillis();
System.out.println("String消耗的时间:"+(endTime2-startTime2));
}
}