这三种都是字符串类型的,String 是字符串常量,StringBuilder、StringBuffer是字符串变量
String | StringBuffer | StringBuilder |
---|---|---|
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 | StringBuffer是可变类,利用缓存区把数组长度设为可变的,线程安全,可以同步 | 可变类,速度更快;利用缓存区把数组长度设为可变的,不能安全使用多线程,不能同步 |
不可变 | 可变 | 可变 |
线程安全 | 线程不安全 | |
多线程操作字符串 | 单线程操作字符串 |
三个的改变字符的速度:
StringBuilder>StringBuffer>String
1.String类:
首先是String类的地址判断:
判断可以根据String的值在编译时产生的,还是运行时产生。含有变量的就是运行时产生的,和编译时产生的地址肯定不同
String是一个final类,abc是一个常量存在常量池中str1="abc"是编译完成时,赋值。先在常量池找abc,找到了就不再继续存了。所以第一个是为true。第二个因为实例化了两次,所以地址肯定不同。第三个内容都不一样所以为false。第四个和第五个都含有变量都是运行时才产生的,所以和编译时产生的ss1地址不同,所以都为false。第六个ss6不含有变量,所以在编译时产生的,所以为true。
String str1="abc";
String str2="abc";
System.out.println(str1==str2); //true
System.out.println("--");
String s3=new String("abc");
String s4=new String("abc");
System.out.println(s3==s4);//false
String ss1="abc";
String ss2="ab";
String ss3=ss2+"c";
String ss4="c";
String ss5=ss2+ss4;
String ss6="ab"+"c";
System.out.println(ss1==ss2);//false
System.out.println(ss1==ss3);//false
System.out.println(ss1==ss5);//false
System.out.println(ss1==ss6);//true
String的常用方法:
String类的方法:
- equals:判断两字符串是否相等
- toUpperCase:字母大写
- toLowerCase:字母小写
- trim:去掉两边的空格
- indexOf:第一次出现的位置
- lastindexOf:最后一次出现的位置
- substring:截取字符串(不含末尾的那个)
- endWish:以什么为结尾,返回true和false
- toCharArray:转换成char数组
String s6="ABCDabcd中国";
String s7=s6.toUpperCase();//大写
String s8=s6.toLowerCase();//小写
System.out.println(s7); //ABCDABCD中国
System.out.println(s8); //abcdabcd中国
String name=" javasun ";
System.out.println(name.trim());//去掉两边的空格 javasun
String em="1045535878@qq.com";
System.out.println(em.indexOf("@")); //第一次出现 10
System.out.println(em.lastIndexOf("@")); //最后一次出现 10
System.out.println(em.substring(em.lastIndexOf("@"),em.lastIndexOf("."))); //截取字符串 @qq
System.out.println(em.endsWith(".com")); //是否以啥结尾 true
String str0="AB中国";
char[] ch1=str0.toCharArray(); //转换成char[]数组
System.out.println(Arrays.toString(ch1)); //[A, B, 中, 国]
2.StringBuilder、StringBuffer类:
这两个类的常用方法相同。使用时注意需要初始化。
StringBuilder和StringBuffer类的方法:
- append:连接字符,添加字符串
- insert:按照指定的数位,添加字符
- delete:删除指定数位,不包含后面那个
- replace:指定数位的替换
- reverse:将字符串相反过来
- toString:返回String类型
//StringBuilder实例化
StringBuilder sb=new StringBuilder();
//append连接字符,相当于String +
sb.append("江西南昌").append("javasun");
System.out.println(sb);//江西南昌javasun
//在下标2处,增加个u
sb.insert(2,"u");
System.out.println(sb);//江西u南昌javasun
//从下标0到下标3不含结束位置,删除
sb.delete(0,3);//南昌javasun
System.out.println(sb);
sb.replace(3,5,"中国");//替换
System.out.println(sb);//南昌j中国asun
sb.reverse();//反过来
System.out.println(sb);//nusa国中j昌南