在JAVASE中,有关String的用法比较多而且在面试中比较常见,今天总结一下String、StringBuffer及StringBuilder常见的用法及区别
1.s1和s2有什么去别
String s1="abc";//s1是一个类型变量,“abc”是一个对象
//字符串最大的特点,一旦被创建便不可被改变
String s2=new String("abc");
s1代表一个对象
s2代表两个对象
2、相关的几个术语
栈 :由JVM分配区域,用于保存线程执行的动作和数据引用。栈是一个运行的单位,Java中一个线程就会相应有一个线程栈与之对应。主要保存基本类型(或者叫内置类型)(char、byte、short、int、long、float、double、boolean)和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆。
堆 :由JVM分配的,用于存储对象等数据的区域。用于存储对象。
常量池 :在堆中分配出来的一块存储区域,用于存储显式的String,float或者integer.例如String str="abc"; abc这个字符串是显式声明,所以存储在常量池。
3.输出结果及常量池的应用
String s1="abc";
String s2=new String("abc");
String s3="abc";
system.out,println(s1==s2);//false
system.out.println(s1==s3);//true 因为存在常量池 s1中存入abc三个字符 因此内存中包含abc s3时不需再创建地址
因此是true
4.string类适用于描述字符串事物
那么它就提供了多个方法对字符串进行操作
常见的操作有:
(1)获取
1.1字符串中包含的字符数,也就是字符串的长度
int length();获取长度
1.2根据位置获取位置上某个字符
char charAt(int index);
1.3根据字符获取该字符在字符串中位置
int indexOf(int ch);返回的是ch在字符串中第一次出现的位置
int indexOf(int ch,int fromIndex):从fromIndex指定位置开始,获取ch在字符串中出现的位置
int indexOf(String str):返回的是ch在字符串中第一次出现的位置
(2).判断
2.1 字符串中是否包含某一个字符串
boolean contains(str);
特殊之处:indexOf(str):可以索引str第一次出现位置,如果返回-1,表示该str不在字符串中存在,所以也可以用于对指定判断是否包含
if(str.indexof("aa")!=-1) 而且该方法既可以判断,又可以获取出现的位置
2.2 字符串中是否有内容
boolean isEmpty();//原理就是判断长度是否为0
2.3字符串是否是以指定内容开头
boolean startsWith(str);
2.4字符串是否是以指定内容结尾
boolean endswith(str)
2.5判断字符串的内容是否相同 复写了object类中的equals方法
boolean equals(str);
2.6 判断内容是否相同 并忽律大小写
boolean equalsIgnoreCase();
转换
3.1,将字符数组转成字符串
构造函数:String(char[ ])
String(char[ ],offset,count):将字符数组中的一部分转成字符串
静态方法 static String copyValueof(char []);
static String copyValueOf(char[ ]data,int offset,int count)
static String valueOf(char[]);
3.2 将字符串转成字符数组
char[] toCharArray();
3.3将字节数组转成字符串
String(byte[])
String(byte[],offset,count);将字节数组中的一部分转成字符串。
3.4将字符串转成字节数组
byte[] getBytes();
3.5将基本数据类型转成字符串
String valueOf(int/double)
特殊:字符串和字节数组再转换过程中是可以指定编码表的
4.替换
String replace(oldchar,newchar);
String s="hello java";
String s1=s.replace("java",""tanyun");
5、切割
String()split(regex);
String s="zhangsan,wangwu,lisi";
String[ ]arrs.split(",");//以逗号为边切开
for(int x=0;x<arr.length;x++)
{system.out.println(arr[x])};
6.子串,获取字符串中的一部分
String substring(begin);//从指定位置开始到结尾,如果角标不存在,会出现字符串角标越界异常
string substring(begin,end);//包含头不包含尾
7.转换,去除空格,比较
7.1将字符串转成大写或者小写
String toUpperCase();
String toLowerCase();
7.2将字符串两端的多个空格去除
String trim();
7.3对两个字符串进行自然顺序的比较
int compareTo(string);
String s=" Hello Java ";
system.out.print(s.toUpercase);
system.out.print(s.toLowercase)
system.out.print(s.trim);
String s1 ="abc";
String s2="aaa";
system.out.print(s1.compareTo(s2)); //返回0则相等,大于0大于,小于0小于
StringBuffer//不能被继承
String与StringBuffer的区别
1.String创建的字符串一旦被创建便不可被改变
StringBuffer可以用于字符串的修改
StringBuffer是一个容器,是字符串缓冲区,而且是长度可以变化的,可以直接操作多个数据类型
最终会通过toString方法变成字符串,当数据类型不确定,个数不确定时使用StringBuffer
数组也是一个容器但是长度不可变化,一次只能操作一个类型
C create U update R read D delete
1.存储
StringBuffer insert(index,数据 )
StringBuffer append():将指定的数据作为参数添加到已有数据的结尾处
public static void main(String [] args){
StringBuffer sb=new StringBuffer();
StringBuffer sb1=sb.append(34);
//方法调用连 sb.append(34).append("abc").append(true);
system.out.print(sb.toString);
system.out.print(sb1.toSting);
}
2.删除
StringBuffer delete(int start,int end);删除缓冲区中的数据,包含strat,不包含end
StringBuffer deleteCharAt(index):删除指定位置的字符
public static void main(String [] args){
public static void method_del(){
StringBuffer sb=new StringBuffer("abcde");
sb.delete(1,3);
//清空缓冲区
sb=new StringBuffer();
sb.delete(0,sb.length);
sb.delete(2,3);//将C删除
sb.deleteCharAt(2);
system.out.print(sb);
}
}
3.获取
char charAt();
int indexOf();
int lastindexOf();
string int substring();
4.修改
StringBuffer replace(start,end,string);
String setCharAt();
5.反转
StringBuffer reverse();
StringBuilder
JDK1.5版本之后出现了StringBuilder
不同之处为:
StringBuffer是线程同步
StringBuilder是线程不同步
偏向于用StringBuilder
因为线程同步会降低效率,并发执行会产生错乱,即使安全
单线程用StringBuilder 多线程用StringBuffer