参考文章:Java StringBuffer 和 StringBuilder 类
String、StringBuffer与StringBuilder之间区别
用java写代码时,总会一不小心超出内存限制,这时候就需要摒弃String,考虑多使用可变长字符串了。
String:每次拼接都会生成个新的变量,遇见多次拼接的情况极容易超出内存限制!
StringBuffer:改变字符串,不产生新的对象,线程安全。
StringBuilder:改变字符串,不产生新的对象,线程不安全,但是速度更快!因为算法竞赛中通常不涉及多线程,所以一般情况使用StringBuilder!
StringBuffer类和StringBuilder类的方法几乎一样,所以在此列出StringBuilder的方法,同样适用于StringBuffer类
// 此处仅举例常用的方法,如果后续有其他方法常用,我再来进行补充
// 创建StringBuilder变量
StringBuilder stringBuilder = new StringBuilder();
// append() 拼接
stringBuilder.append("abcde"); // abcde
// insert() 插入
stringBuilder.insert(5,"f"); // abcdef
// deleteCharAt() 删除指定位置的字符
stringBuilder.deleteCharAt(1); // acdef
// delete() 删除一段字符,【左,右)
stringBuilder.delete(0,2); // def
// length() 获取字符串长度
System.out.println(stringBuilder.length()); // 3
题目测试:P1706 全排列问题
用String时,超出内存限制。
用StringBuffer,时间大约是334ms
用StringBuilder,时间大约是296ms
代码如下,大家可以自行测试:
package 算法竞赛;
import java.io.*;
public class Interface1{
// 静态的成员变量看作是全局变量理解就好了
static int k = 1;
static int[] pd = new int[12];
static int[] cc = new int[12];
static StringBuilder stringBuffer = new StringBuilder();
static BufferedReader ins = new BufferedReader(new InputStreamReader(System.in));
static StreamTokenizer in = new StreamTokenizer(ins);
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException{
in.nextToken();
int n = (int)in.nval;
dfs(1,n);
out.println(stringBuffer);
out.close();
}
// 这种方法真是妙啊,以后要多用递归啊
public static void dfs(int t,int n){
if(t>n)
{
out(n);
}
for(int i = 1;i<=n;i++)
{
if(pd[i]==0)
{
cc[k]=i;
k++;
pd[i]=1;
dfs(t+1,n);
pd[i]=0;
}
}
k--;
}
public static void out(int n){
for(int i = 1;i<=n;i++)
{
stringBuffer.append(" ").append(cc[i]);
}
stringBuffer.append("\n");
}
}
如有谬误,请务必告知,以免误导他人
如果各位看官觉得写得不错,对你有帮助,能不能给个赞啊,这是对我最大的鼓励!