Java中String,StringBuffer,StringBuilder的区别及相关常用函数

今天在刷算法题的时候,题目上传入的参数类型是StringBuffer,而需要返回的却是String类型。其中我在写的时候用了两种不同的写法产生的结果相同,但是速度却不同。所以在网上查找了一些资料。下面做一个String,StringBuffer,StringBuilder的区别及常用函数介绍。

1.String,StringBuffer,StringBuilder在JVM中的处理情况

在这三种情况下,String是执行最慢的。因为Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。而对StringBuffer,StringBuilder操作则不许要重新创建和回收直接在其上面更改便可。反映到程序中就是String在改变后的哈希码会和之前完全不同,而StringBuffer,StringBuilder的哈希码依然一样。
如下

	String str="exception";
	System.out.println("String的哈希码"+str.hashCode());
	str=str+"%";
	System.out.println("String的哈希码"+str.hashCode());
	StringBuffer strbf=new StringBuffer("exception");
	System.out.println("StringBuffer的哈希码"+strbf.hashCode());
	strbf=strbf.append("%");
	System.out.println("StringBuffer的哈希码"+strbf.hashCode());
	StringBuilder strbd=new StringBuilder("exception");
	System.out.println("StringBuilder的哈希码"+strbd.hashCode());
	strbd=strbd.append("%");
	System.out.println("StringBuilder的哈希码"+strbd.hashCode());

运行结果如图:
在这里插入图片描述

2.线程安全

String为不可变类,在java中不可变类都是线程安全的,
StringBuffer也是线程安全的。但是是靠StringBuffer中的方法中的synchronized关键词来保持线程安全。
StringBuilder是线程不安全的。

3.String中常用方法

String str=new String("a");	//创建a字符串
str.length();	//字符串长度
str.charAt(int i);//第i个字符
str.indexOf(String p);	//p第一次出现的位置,没有则返回-1
str.indexOf(String p,inti);	//p在第i个字符后第一次出现的位置,没有则返回-1
str.concat(String t);	//将t附在字符串的末尾,也可用+号来连接
str.substring(int i,int j); //从i到j的子字符串
str.split(String a);	//把字符串以a字符分开,返回一个字符串数组
str.hashCode();	//哈希码
str.equals(String a);	//和a字符串进行比较是否相等

4.StringBuffer常用方法

StringBuffer strbf=new StringBuffer("exception");	//创建一个StringBuffer类的字符串
strbf.append(String s);//将指定的字符串追加到此字符序列。
strbf.reverse();		//将此字符序列用其反转形式取代。
strbf.delete(int start, int end);	//移除此序列的子字符串中的字符。
strbf.insert(int offset, int i);	//将 int 参数的字符串表示形式插入此序列中。
strbf.replace(int start, int end, String str);	//使用给定 String 中的字符替换此序列的子字符串中的字符。

最后说明一下作者本人水平有限,若有什么地方整理不到位,请指出。同时这些常用方法在以后写算法题碰到新的,会进行更新

没有更多推荐了,返回首页