一、前言
在了解StringBuffer和StringBuilder之前,我们需要回顾一下String
任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。所以为了方便修改字符串,才有了StringBuffer和StringBuilder。
二、StringBuffer
在String中使用"+"来进行字符串连接,但是这个操作在StringBuffer类中需要更改为append()方法
public class Test{ public static void main(String[] args) { StringBuffer sb = new StringBuffer(); sb.append("Hello").append("World"); System.out.println(sb); } }
String和StringBuffer最大的区别在于:String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的情况考虑使用StingBuffer。
注意:
String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
String变为StringBuffer:利用StringBuffer的构造方法或append()方法
StringBuffer变为String:调用toString()方法。
除了append()方法外,StringBuffer也有一些String类没有的方法:
1.字符串反转:
StringBuffer sb = new StringBuffer("helloworld"); System.out.println(sb.reverse());
2.观察删除操作:
StringBuffer sb = new StringBuffer("helloworld"); System.out.println(sb.delete(5, 10));
面试题:请解释String、StringBuffer、StringBuilder的区别:
String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
StringBuffer与StringBuilder大部分功能是相似的
StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作
小结
- 字符串的比较, ==, equals, compareTo 之间的区别.
- 了解字符串常量池, 体会 “池” 的思想.
- 理解字符串不可变
- split 的应用场景
- StringBuffer 和 StringBuilder 的功能.
习题
三、回文串
给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。
示例 1:输入: s = “A man, a plan, a canal: Panama”
输出: true
class Solution { public boolean isPalindrome(String s) { s=s.toLowerCase(); int i = 0; int j = s.length()-1; while(i<j){ while(i<j&&!isNumber(s.charAt(i))){ i++; } while(i<j&&!isNumber(s.charAt(j))){ j--; } if(s.charAt(i)==s.charAt(j)){ i++; j--; }else{ return false; } } return true; } public boolean isNumber(char n){ if((n>='0'&&n<='9')||(n>='a'&&n<='z')){ return true; }else{ return false; } } }
四、字符串中的唯一字符
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
示例 2:
输入: s = “loveleetcode”
输出: 2
class Solution { public int firstUniqChar(String s) { int count[] = new int[26]; for(char ch:s.toCharArray()){ count[ch-'a']++; } for(int i = 0;i<s.length();i++){ if(count[s.charAt(i)-'a']==1){ return i; } } return -1; } }