1.①String类是不可变类,而StringBuffer\StringBuilder是可变类
示例
String a = "123"; //1
a = "456"; //2
以上代码,看似是a被从原本的"123"修改为了"456",其实并不是,
在代码行2,对a进行“赋值”操作,其实是创建了一个新的String对象,
并且a指向新创建的这个对象,原来的对象直到被回收之前仍会存在。
②而StringBuilder\StringBuffer,则是可变类
即,他们的对象都是可变字符串,它没有重新生成一个对象,而是在原对象的基础上连接新的字符串。
③但是如果执行添加操作
String x ="abc";
x+="defg";
在形式上等价于以下操作
StringBuffer a = new StringBuffer("abc");
//创建一个StringBuffer类的对象a
a.append("defg"); //给字符串a的结尾追加字符串"defg"
x = a.toString(); //将a以String形式赋给x
StringBuffer字符串修改方法是首先创建一个StringBuffer,其次调用StringBuffer的append方法,最后调用StringBuffer的toString()方法把结果返回
牵扯到一个知识点append方法
代码
(str); //给字符串a追加子串str
在添加字符串的操作上,String性能不及StringBuffer,如果这种操作较多的话(如循环)建议使用StringBuffer。
StringBuilder性能比StringBuffer更强,但线程不够安全
——————————————分割线———————————————
和StringBuffer非常类似
但因为StringBuffer的所有方法中都添加了synchronized关键字,也就是给这个方法添加了一个锁,用来保证线程安全。
所以StringBuffer的速度略慢,但线程安全。
而StringBuilder没有上述关键字,故性能略高。
——————————————分割线———————————————
3.关于二者均包含的的reverse()方法的反转字符串的功能的示例及解释
示例
public class Test{
public static void main(String args[]){
String ans = "Mustang";
String reverse_ans = new StringBuffer(ans).reverse().toString();//1
System.out.println(reverse_ans);
//最终输出gnatsuM
}
}
1行处toString()是将StringBuffer以String类形式输出,返回给reverse_ans;
——————————————分割线———————————————
4.关于利用 String 的 toCharArray 方法先将字符串转化为 char 类型数组的反转字符串方法
以做题的形式实现。
问题:
用户从键盘输入一个1~9999之间的数,判断这个数是几位数,并判断这个数是否是回文数。回文数是指将该数含有的数字逆序排列后得到的数和原数相同,例如12121,3223都是回文数。
代码
import java.util.*;
public class Test{
public static void main(String args[]){
Scanner reader = new Scanner(System.in);
String x = reader.nextLine();
char []arr = x.toCharArray();
String ans = "";
for(int i =arr.length-1;i>=0;i--)
ans = ans+arr[i];
if(ans.equals(x)) //1111111111
System.out.println("是回文数");
else
System.out.println("不是回文数");
}
}
注释处的判断ans和x是否相等的方法是
(b);
而不是
a==b //错!
因为a和b都是字符串String类型,如果用==判断两个字符串是不是相等,只是判断的他们的引用是否相等。这是不对的。
想要判断他们的内容是否相等,应该用(b)判断。
——————————————分割线———————————————
5.利用toCharArray()方法来将String字符串转化为char数组,后反转
String a = "123456";
char [] x = a.toCharArray();
String ans = "";
for(i=x.length;i>=0;i--)
ans = ans+x[i];
System.out.println(ans);//得到反转字符串654321
——————————————分割线———————————————
6.利用String的CharAt方法,将字符串挨个取出后附加
public class Test{
public static void main(String args[]) {
String reverse = "";
String str = "abc";
int length = str.length();
for (int i = length-1; i >= 0; i--) {
reverse = str.charAt(i) + reverse;
}
System.out.println(str);
}
}