直接赋值
String str = "Hello Bit";
传统方法(构造法)
String str = new String("Hello Bit");
这两种方法存在差异:
详见:
String类中两种对象实例化的区别
String的变量可以通过两种方式进行比较,一种是“==”方式,另一种是通过.equals()方法进行比较,二者虽然都可以进行比较,但比较的内容不同:
“==” 是比较变量所指向的值在堆空间上的内存地址值
.equals() 是比较字符串的值
详见:字符串比较分析
用双引号“”引起来的内容就是String类的匿名对象
如:“hello”
如果字符串变量和字符串匿名对象进行equals比较,字符串匿名对象放在前面。
如:"hello".equals(str1);
有如下代码:
String str1 = "hello" ;
str1 = str1 + " world" ;
str1 += "!!!" ;
System.out.println(str);
此时一共产生了5个String对象,分析如下:
由此看出字符串对象的引用一直在改变,而且会形成大量的垃圾空间。所以在代码中要防止出现如下代码:
String str = "hello" ;
for(int x = 0 ; x<1000 ; x++) {
str += x ;
}
System.out.println(str);
原则:
注:更多String方法请前往API中查看。
通常来讲String的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBuffer类。
线程安全: 在多线程中使用时,不会造成线程干扰。
默认构造方法: 构造一个没有字符的字符串缓冲区,初始容量为16个字符4个构造方法。
如:
对象名.append("java") //链式调用
.append("is")
.append("best"); //在字符串缓冲区中追加 return 这个对象
String变为StringBuffer: 利用StringBuffer的构造方法或append()方法;
StringBuffer变为String: 调用toString()方法。
面试题:String、StringBuffer、StringBuilder区别:
String的内容不可修改,StringBuffer和StringBuilder的内容更可以修改StringBuilder类 同StringBuffer类功能一样,唯一不同的是线程不安全。
注:面试时要详细讲解各个类的功能
1.重复某个字符
例如:
代码如下:
public static String repeat(char c, int count) {
if(count<=0) {
return "";
}
StringBuffer str = new StringBuffer();
while (count>0){
str.append(String.valueOf(c));
count--;
}
return str.substring(0);
// 测试用例
// System.out.println(repeat('b',5));
// System.out.println(repeat('b',0));
// System.out.println(repeat('b',-1));
// System.out.println(repeat('2',2));
}
2.将已有字符串填充为规定长度(字符填充于字符串前)
将已有字符串填充为规定长度,如果已有字符串超过这个长度则返回这个字符串
代码如下:
public static String fillBefore(String str, char filledChar, int len) {
if(str.length()>=len){
return str;
}
int count = len - str.length();
StringBuffer s = new StringBuffer();
while(count>0){
s.insert(0,filledChar);
count--;
}
return s.substring(0)+str;
// 测试用例
// System.out.println(fillBefore("abc",'A',5)); //AAabc
// System.out.println(fillBefore("abc",'A',3));//abc
// System.out.println(fillBefore("",'A',5)); //AAAAA
// System.out.println(fillBefore("abcdef",'A',5));//abcdef
}
3.将已有字符串填充为规定长度(字符填充于字符串后)
代码如下:
public static String fillAfter(String str, char filledChar, int len) {
if(str.length()>=len){
return str;
}
int count = len - str.length();
StringBuffer s = new StringBuffer();
while(count>0){
s.append(filledChar);
count--;
}
return str+s.substring(0);
// 测试用例
// System.out.println(fillAfter("abc",'A',5)); //abcAA
// System.out.println(fillAfter("abc",'A',3));//abc
// System.out.println(fillAfter("",'A',5)); //AAAAA
// System.out.println(fillAfter("abcdef",'A',5));//abcdef
}
4.移除字符串中所有给定字符串
代码如下:
public static String removeAll(CharSequence str, CharSequence strToRemove) {
if(str==null){
return null;
}
String s = new String(str.toString());
if(s.contains(strToRemove)){
s = s.replace(strToRemove,"");
}
return s;
// 测试用例
// System.out.println(removeAll("aa-bb-cc--dd","-")); //aabbccdd
// System.out.println(removeAll("aa-bb-cc--dd","--")); //aa-bb-ccdd
// System.out.println(removeAll("aa-bb-cc--dd","hh")); //aa-bb-cc--dd
// System.out.println(removeAll("","--")); //
}
5.反转字符串
代码如下:
public static String reverse(String str) {
if(str == null){
return null;
}
if(str.length()<=1){
return str;
}
char[] charArray = str.toCharArray();
int left = 0;
int right = charArray.length-1;
char tmp;
while(left<=right){
tmp = charArray[left];
charArray[left] = charArray[right];
charArray[right] = tmp;
left++;
right--;
}
String s = new String(charArray);
return s;
// 测试用例
// System.out.println(reverse("abcdefg")); //gfedcba
// System.out.println(reverse(""));//
// System.out.println("a");//a
}