String
String:字符串类型 /引用数据类型 “hello” 由双引号引起来的若干字符,字符串不可变
"a"字符串类型
'a’单引号只能引一个字符
字符串常量池:JDK源码当中,对字符串常量池的定义其实就是一个哈希表,其特点为:如果以前有这个字符串常量,那么就不会重复的进行存储,提高效率。
面试题:String类中两种对象实例化的区别
- 直接赋值:只会开辟一块内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用
- 构造方法:会开辟两块内存空间,不会自动保存在对象池中,可以使用intern()方法手动入池
字符,字节和字符串
- 字符和字符串
String(char);//数组转字符串
charAt();//拿到字符串某个下标的元素
toCharArray();//把字符串转为数组 - 字节和字符串
Sring(bytes);//字节数组转字符串
str.getBytes();//字符串转字节数组
str.getBytes(UTF8);//字符串转字节数组,用UTF8编码转换处理
字符串比较
equals比较 true/false
equalsIgnoreCase 忽略情况比较(大小写…)
compareTo 比较字符串大小 abe>abcde 从不同的字符开始比较
字符串查找
- contains查找字符串是否存在
- indexOf 查找字符串下标 //从头到尾找到的第一个 利用了KMP算法:字符串匹配算法
- fromIndex //从fromindex到尾找到的第一个
- lastIndex //从后往前找
- startWith (字符串,数字)判断是否以…开头的,也可判断指定位置的…
- endsWith 判断是否以…结束
例:求最后一个单词的长度
public static int strLen(String s){
int index = s.lastIndexOf(" ");
return s.length()-index-1;
}
public static void main(String[] args) {
String str = "abc abcd abcdef";
System.out.println(strLen(str));
}
字符串替换
str1.replace(a,p) //把字符串中的a替换成p
str1.replace(ab,ppp) //把字符串中的ab替换成ppp
str1.replaceFirst(a,p) //把字符串中的第一个a替换成p
字符串拆分
拆分完的要用数组接收
str1.split(" “) //空格处拆分,空格不再保留,即分割的字符不保留
str1.split(”# “,2)//最多以#分两组
str1.split(”\. “) //以.分割,要加转义字符
str1.split(”#|&|@ ") //依次以# & @进行分割
例:字符串多次拆分
public static void main(String[] args) {
String str = "name=zhnagsan&age=18";
String[] ss1 = str.split("&");
for (String sx : ss1) {
// System.out.println(sx);
String[] ss2 = sx.split("=");
for (String sx2 : ss2) {
System.out.println(sx2);
}
}
}
字符串截取
str1.subString(2);//截取2号位置本身以及后面的所有元素
str1.subString(2,5)//左闭右开截取2-5位置的元素,不包括5
其他操作
str1.trim();//去除左右两边的空格
str.toUpperCase()//小写转大写
str.toLowerCase()//大写转小写
str.intern()//字符串入池操作
str.concat(“zw”)//连接操作
练习题
1.反转字符串
public String solve (String str) {
// write code here
if(str == null) return null;
char[] chars = str.toCharArray();//把字符串转化成数组
int i = 0;
int j = chars.length - 1;
while(i < j){
char tmp = chars[i];
chars[i] = chars[j];
chars[j] = tmp;
i++;
j--;
}
return new String(chars);
}
- 第一个只出现一次的字符
public int FirstNotRepeatingChar(String str) {
if(str == null || str.length() == 0){
return -1;
}
int[] array = new int[128];
for(int i = 0;i < str.length();i++){
char ch = str.charAt(i);
array[ch]++;
}
for(int i = 0;i < str.length();i++){
char ch = str.charAt(i);
if(array[ch] == 1){
return i;
}
}
return -1;
}
StringBuffer&StringBuilder
-
StringBuilder可运用appened()方法来拼接字符串
StringBuffer&StringBuilder大部分功能相同,StringBuffer适用于多线程,可保证线程安全(锁)StringBuilder适用于单线程 -
StringBuffer和String最大的区别在于:String的内容无法修改,而 StringBuffer的内容可以修改,频繁修改字符串考虑使用StringBuffer
-
append()方法:http://t.csdn.cn/tn8sg
面试题:解释String,StringBuffer和StringBuilder的区别
4. String内容不可修改,StringBuffer和StringBuilder内容可修改
5. StringBuffer和StringBuilder大部分功能是相似的
6. StringBuffer采用同步处理,属于线程安全操作,适用于多线程;而StringBuilder未采用同步处理,属于线程不安全操作,适用于单线程