本文为转载文章,并添加了一点点的示例
原文:https://blog.csdn.net/qq_33958946/article/details/82734909
原文:https://blog.csdn.net/jisuanjiguoba/article/details/82531868
原文:https://www.cnblogs.com/dolphin0520/p/3778589.html
1.三者的运行速度 String最慢的原因: String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。以下面一段代码为例: String str="abc"; 而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。另外,有时候我们会这样对字符串进行赋值: String str="abc"+"de"; String str1="abc"; 2. 线程安全性 3.三者的使用总结 由于字符串String 本身是不可变的,所以想要对其操作时,比较麻烦,这个时候就要想到转为StringBuffer的类型。 2、char→String: 方法如下: 方法四:String str=‘a’+“”; StringBuilder转换情况类比StringBuffer String和int,short,long,float,double之间的转换:(基本类型.toString(相应的类型变量) 和 基本类型.parse类型(字符串)) int和char之间的转换: 2、char→int:单个数字字符转化为int:int a=(int)(‘5’-48); 小例子:将整型数字反转 方法一: 整型数字转换成字符串String ,再转换成 StringBuffer ,利用StringBuffer 中的reverse函数 方法二:方法二:数学方法,取余和取模的方式
首先从三者的执行速度来看,String
System.out.println(str);
str=str+"de";
System.out.println(str);
如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");
System.out.println(str);
System.out.println(stringBuilder.toString());
这样输出结果也是“abcde”和“abcde”,但是String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和String str="abcde";是完全一样的,所以会很快,而如果写成下面这种形式:
String str2="de";
String str=str1+str2;
那么JVM就会像上面说的那样,不断的创建、回收对象来进行这个操作了,这样速度就会很慢。
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的。如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
String:适用于少量的字符串操作的情况;
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况;
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况。
4.相互转换
String转换成StringBuffer:构造方法和append方法;
StringBuffer转换成String:构造方法和toString方法。
二 :String和char、int等基本类型之间的转换
1、 String→char:因为String是字符串,而char是单个字符,只能把String
转化为char数组,方法为 char []ch=str.toCharArray();
方法一:String str=String.valueOf(char);
方法二:可把char数组转化为String字符串
String str=String.valueOf(char[] ch);
方法三:可在String初始化时传入char数组进行转化:
String str=new String(char[] ch);
方法五:String str=Character.toString(‘c’);
String和StringBuffer(线程安全)、StringBuilder(线程不安全)之间的转换:
1、String→StringBufferr:
方法一:通过StringBuffer构造方法:StringBuffer sb=new StringBuffer(str);
方法二:通过append()方法:
String str;
StringBuffer sb=new StringBuffer();
sb.append(str);
2、StringBuffer→String:
方法一: StringBuffer sb=new StringBuffer(“abs”);
String str=new String(sb);
方法二: StringBuffer sb=new StringBuffer(“abs”);
String str=sb.toString();
1、String→int: int a=Integer.parseInt(str);
String→short:short a=Short.parseShort(str);
String→long:long a=Long.parseLong(str);
String→float:float a=Float.parseFloat(str);
String→double:double a=Double.parseDouble(str);
2、int→String:String str=Integer.toString(int);
short→String:String str=Short.toString(short);
long→String:String str=Long.toString(long);
float→String:String str=Float.toString(float);
double→String:String str=Double.toString(double);
1、int→char:单个数字转换为char ch=(char)(48+int);
大于9的数字转化(int→String→char)
String str=Integer.toString(int);
char[] ch=str.toCharArray();
字符数组转化为int(char→String→int):
char []ch=new ch[]{‘1’,‘2’,‘3’}
String str=String.valueOf(ch);
int a=Integer.parseInt(str);
int和Integer之间的转换:
1、Integer→int:单个Integer类型数据进行转换:
Integer i=new Integer(5);
int in=i.intValue();
2、int→Integer:
int i=6;
Integer in=new Integer(i);
或者:
Integer in=Integer.valueOf(i);public int ReverseNum(int a){
String str=Integer.toString(a);
StringBuffer s=new StringBuffer(str);
s.reverse();
return Integer.parseInt(s.toString());
}
public int ReverseNum(int n){
int num;
int sum=0;
while(n>0){
num=n%10;
sum=sum*10+num;
n=n/10;
}
return sum;
}