public final class StringBuilder
extends Object
implements Serializable, CharSequence
StringBuilder类是final修饰的没有子类,不能被继承。
StringBuilder类表示一个可变的字符序列,不保证线程同步。
1.StringBuilder()创建一个初始容量为16个字符的空StringBuilder对象。
2.StringBuilder(String str)创建一个初始值为指定字符串内容的StringBuilder对象。
3.StringBuilder(int capacity)创建一个指定初始容量的空StringBuilder对象。
package com.wangxing.stringbuilderdemo1;
public class TestMain1 {
public static void main(String[] args) {
//StringBuilder()创建一个初始容量为16个字符的空StringBuilder对象。
StringBuilder str1=new StringBuilder();
//StringBuilder(String str)创建一个初始值为指定字符串内容的StringBuilder对象。
StringBuilder str2=new StringBuilder("hello");
String teststr="world";
StringBuilder str3=new StringBuilder(teststr);
//StringBuilder(int capacity)创建一个指定初始容量的空StringBuilder对象。
StringBuilder str4=new StringBuilder(20);
}
}
StringBuilder类的常用方法
1.StringBuilder append(Object o)
将参数中指定的数据追加到StringBuilder表示的字符序列的末尾中。
append方是重载的,以便接受任何类型的数据,可以有效地将给定的数据转换为字符串。
2.int capacity()返回当前容量。
3.char charAt(int index)得到元素字符串中指定位置的字符数据
4.StringBuilder delete(int start, int end)删除指定开始位置和指定结束位置之间的子字符串.
5.StringBuilder deleteCharAt(int index) 删除元素字符串中指定位置上的字符。
6.int indexOf(String str)得到指定字符串在原始字符串中第一次出现的位置
7.int lastIndexOf(String str)得到指定字符串在原始字符串中最后一次出现的位置
8.StringBuilder insert(int index,Object o)将指定的数据插入到原始字符串中指定的位置。
insert方是重载的,以便接受任何类型的数据,可以有效地将给定的数据转换为字符串。
9.int length() 返回长度(字符数)。
10.StringBuilder replace(int start, int end, String str)使用指定的字符串替换开始位置和结束位置之 间的字符串
11.StringBuilder reverse()反转字符串【????】
12.void setCharAt(int index, char ch)使用指定的字符数据替换原始字符串中指定位置的字符
13.String substring(int start)从原始字符串的指定开始位置截取到结束之间的子字符串.【String】 14.String substring(int start, int end)从原始字符串的指定开始位置截取到结束位置之间的子字符 串. 【String】
15.String toString() 将StringBuilder可变字符串转换成String不可变字符串。
package com.wangxing.stringbuilderdemo1;
public class TestMain2 {
public static void main(String[] args) {
StringBuilder str1=new StringBuilder();
//1.StringBuilder append(Object o)
//将参数中指定的数据追加到StringBuilder表示的字符序列的末尾中。
//append方是重载的,以便接受任何类型的数据,可以有效地将给定的数据转换为字符串。
str1.append(true);
str1.append(1001);
str1.append("hello");
str1.append(12.5);
str1.append("hello");
System.out.println("str1=="+str1);
//2.int capacity()返回当前容量。
//System.out.println("str1=="+str1.capacity());
//3.char charAt(int index)得到元素字符串中指定位置的字符数据
//System.out.println("str1=="+str1.charAt(1));
//4.StringBuilder delete(int start, int end)删除指定开始位置和指定结束位置之间的子字符串.
//System.out.println("str1=="+str1.delete(8,13));
//5.StringBuilder deleteCharAt(int index) 删除元素字符串中指定位置上的字符。
//System.out.println("str1=="+str1.deleteCharAt(15));
//6.int indexOf(String str)得到指定字符串在原始字符串中第一次出现的位置
//System.out.println("str1=="+str1.indexOf("world"));
//7.int lastIndexOf(String str)得到指定字符串在原始字符串中最后一次出现的位置
//System.out.println("str1=="+str1.lastIndexOf("hello"));
//8.StringBuilder insert(int index,Object o)将指定的数据插入到原始字符串中指定的位置。
//System.out.println("str1=="+str1.insert(str1.lastIndexOf("1"),"world"));
//9.int length() 返回长度(字符数)。
//System.out.println("str1=="+str1.length());
//10.StringBuilder replace(int start, int end, String str)使用指定的字符串替换开始位置和结束位置之间的字符串
//int startindex=str1.indexOf("h");
//int endindex=startindex+5;
//System.out.println("str1=="+str1.replace(startindex,endindex,"world"));
//11.StringBuilder reverse()反转字符串
//System.out.println("str1=="+str1.reverse());
//12.void setCharAt(int index, char ch)使用指定的字符数据替换原始字符串中指定位置的字符
//str1.setCharAt(0,'A');
//System.out.println("str1=="+str1);
//13.String substring(int start)从原始字符串的指定开始位置截取到结束之间的子字符串.【String】
//14.String substring(int start, int end)从原始字符串的指定开始位置截取到结束位置之间的子字符串.【String】
//String sunstr=str1.substring(str1.lastIndexOf("1"),str1.lastIndexOf("1")+4);
//System.out.println("sunstr=="+sunstr);
//15.String toString() 将StringBuilder可变字符串转换成String不可变字符串。
System.out.println("toString=="+str1.toString());
}
}
StringBuilder可变字符串与String不可变字符串转换的转换
StringBuilder可变字符串---》String不可变字符串
1.StringBuilder的toString()方法
2.String类的构造方法String(StringBuilder builder)
String不可变字符串---》StringBuilder可变字符串
StringBuilder类的构造方法StringBuilder(String str)
public final class StringBuffer
extends Object
implements Serializable, CharSequence
StringBuffer类是final修饰的没有子类,不能被继承。
StringBuffer类表示一个可变的字符序列,保证线程同步。
1.StringBuffer()创建一个初始容量为16个字符的空StringBuffer对象。
2.StringBuffer(String str)创建一个初始值为指定字符串内容的StringBuffer对象。
3.StringBuffer(int capacity)创建一个指定初始容量的空StringBuffer对象。
1.StringBuffer append(Object o)
将参数中指定的数据追加到StringBuffer表示的字符序列的末尾中。
append方是重载的,以便接受任何类型的数据,可以有效地将给定的数据转换为字符串。
2.int capacity()返回当前容量。
3.char charAt(int index)得到元素字符串中指定位置的字符数据
4.StringBuffer delete(int start, int end)删除指定开始位置和指定结束位置之间的子字符串.
5.StringBuffer deleteCharAt(int index) 删除元素字符串中指定位置上的字符。
6.int indexOf(String str)得到指定字符串在原始字符串中第一次出现的位置
7.int lastIndexOf(String str)得到指定字符串在原始字符串中最后一次出现的位置
8.StringBuffer insert(int index,Object o)将指定的数据插入到原始字符串中指定的位置。
insert方是重载的,以便接受任何类型的数据,可以有效地将给定的数据转换为字符串。
9.int length() 返回长度(字符数)。
10.StringBuffer replace(int start, int end, String str)使用指定的字符串替换开始位置和结束位置之 间的字符串
11.StringBuffer reverse()反转字符串【????】
12.void setCharAt(int index, char ch)使用指定的字符数据替换原始字符串中指定位置的字符
13.String substring(int start)从原始字符串的指定开始位置截取到结束之间的子字符串.【String】 14.String substring(int start, int end)从原始字符串的指定开始位置截取到结束位置之间的子字符 串. 【String】
15.String toString() 将StringBuffer可变字符串转换成String不可变字符串。
StringBuffer可变字符串---》String不可变字符串
1.StringBuffer的toString()方法
2.String类的构造方法 String(StringBuffer buffer)
String不可变字符串---》StringBuffer可变字符串
StringBuffer类的构造方法StringBuffer(String str)
(1)String是不可变字符串;StringBuilder、StringBuffer可变字符串
(2)String、StringBuffer是线程安全,StringBuilder非线程安全
(3)String不适合大量字符串的拼接,在JDK1.8时字符串常量拼接被自动优化成了StringBuiler
StringBuilder适合单线程情况下大量字符串的拼接
StringBuffer适合多线程大量字符串的拼接
(4)执行速度String(慢) < StringBuffer(较快) < StringBuilder(快)
(5)String[JDK1.0], StringBuffer[JDK1.0 ],StringBuilder[[JDK1.5 ]
String重写了Object类中的equals、hashCode方法
2."=="与equals方法的区别?(1)"=="是比较运算符;equals是java.lang.Object类中的方法。
(2)"=="可以比较两个基本数据类型的变量是否相等,比较的是基本数据类型的数据值是否相等,
"=="也可以比较两个引用数据类型的变量是否相等,只是比较的是引用数据类型所指向的对象的地址是否相等
(3)equals方法不能比较两个基本数据类型的变量是否相等,
equals方法可以比较两个引用数据类型的变量是否相等,默认情况下比较的是引用数据类型变量所指向的对象的地址是否相等;equals方法被重写之后,比较的是引用数据类型变量所指向的对象的内容是否相等。
要想充分了解创建了几个对象,我们需要了解JVM底层原理,String s1 = new String("abc")
分别在栈,堆,常量池的位置。
在JDK1.6即以前,常量池位于JVM的方法区中。
在JDK1.7即以后,常量池放在堆区中。
创了两个对象:一个是堆空间中new结构[new String()]
一个是常量池中的数据:"abc"
String s1="abc";到底创建了几个对象?
创建了一个对象,就是常量池中的数据"abc"。
(1)利用字符串的拼接(charAt()方法),把后遍历出来的放在前面即可实现反转
public static String charAtReverse (String s){
int length = s.length();
String reverse = " ";
for (int i = 0; i < length; i++) {
//字符串中获取单个字符的字符的放法
reverse = s.charAt(i)+reverse;
}
return reverse;
}
(2)利用字符串的拼接(toCharArray()处理成字符数组的方法),把后遍历出来的放在前面即可实现反转
public static String reverseCharArrays(String s){
char []array = s.toCharArray();//把字符串分割成单个字符的数组
String reverse = "";
for(int i = array.length -1 ; i>=0 ; i--){
//遍历数组,从后向前拼接
reverse +=array[i];
}
return reverse;
}
(3)利用StringBuffer的reverse()方法
public static String reverseStringBuffer(String s){
StringBuffer sb = new StringBuffer(s);
String afterReverse = sb.reverse().toString();
return afterReverse;
}
(4)利用递归的方法,类似与二分查找的折半思想
public static String reverseRecursive(String s){
int length = s.length();
if(length<=1){
return s;
}
String left = s.substring(0,length/2);
String right = s.substring(length/2 ,length);
//此处是递归的方法调用
String afterReverse = reverseRecursive(right)+reverseRecursive(left);
return afterReverse;
}



