程序员必学之String字符串、StringBuffer 、StringBuilder
扫描二维码
随时随地手机看文章
关于Java中的:String字符串、StringBuffer
、StringBuilder
--------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
--< java.lang >-- String字符串:
String类概述
字符串这类事物,被看成是一个对象,字符串对象
就有描述这个对象类,java.lang.String类
是被final修饰的类,不能去继承String类
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
java中,写上 "" 就是String类的对象实例
java中用String类进行描述。对字符串进行了对象的封装。这样的好处是可以对字符串这种常见数据进行方便的操作。对象封装后,可以定义N多属性和行为。
如何定义字符串对象呢?String s = "abc";只要是双引号引起的数据都是字符串对象。
特点:字符串一旦被初始化,就不可以被改变,存放在方法区中的常量池中。
//===============================================================
String s1 = "abc"; // s1指向的内存中只有一个对象abc。
String s2 = new String("abc"); // s2指向的内容中有两个对象abc、new 。
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//true ,字符串中equals比较的是字符串内容是否相同。
//===============================================================
字符串的方法:
1:构造方法:将字节数组或者字符数组转成字符串。 new String()
A. 将字节数组转成字符串 String(byte[] bytes)将所有的元素转成字符串对象,但是查询本机默认码表GBK String(byte[] bytes,int start,int length)将字节数组一部分转成字符串对象,查询GBK B. 将字符数组转成字符串 String(char[] ch)将所有的元素转成字符串对象,不查询编码表 String(char[] ch,int start ,int length)将字符串数组一部分转成字符串对象,不查编码表String s1 = new String();//创建了一个空内容的字符串。
String s2 = null;//s2没有任何对象指向,是一个null常量值。
String s3 = "";//s3指向一个具体的字符串对象,只不过这个字符串中没有内容。
//一般在定义字符串时,不用new。
String s4 = new String("abc");
String s5 = "abc"; 一般用此写法
//===============================================================
--< java.lang >-- StringBuffer字符串缓冲区:
构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。
特点:
1:可以对字符串内容进行修改。
2:是一个容器。
3:是可变长度的。
4:缓冲区中可以存储任意类型的数据。
5:最终需要变成字符串。
容器通常具备一些固定的方法:
1,添加。
StringBuffer append(data):在缓冲区中追加数据。追加到尾部。
StringBuffer insert(index,data):在指定位置插入数据。
2,删除。
StringBuffer delete(start,end);删除从start至end-1范围的元素
StringBuffer deleteCharAt(index);删除指定位置的元素
//sb.delete(0,sb.length());//清空缓冲区。
3,修改。
StringBuffer replace(start,end,string);将start至end-1替换成string
void setCharAt(index,char);替换指定位置的字符
void setLength(len);将原字符串置为指定长度的字符串
4,查找。(查不到返回-1)
int indexOf(string); 返回指定子字符串在此字符串中第一次出现处的索引。
int indexOf(string,int fromIndex);从指定位置开始查找字符串
int lastIndexOf(string); 返回指定子字符串在此字符串中最右边出现处的索引。
int lastIndexOf(string,int fromIndex); 从指定的索引开始反向搜索
5,获取子串。
string substring(start); 返回start到结尾的子串
string substring(start,end); 返回start至end-1的子串
6,反转。
StringBuffer reverse();字符串反转
//===============================================================
--< java.lang >-- StringBuilder字符串缓冲区:
JDK1.5出现StringBuiler;构造一个其中不带字符的字符串生成器,初始容量为 16 个字符。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。
方法和StringBuffer一样;
StringBuffer 和 StringBuilder 的区别:
StringBuffer线程安全。
StringBuilder线程不安全。
单线程操作,使用StringBuilder 效率高。
多线程操作,使用StringBuffer 安全。
//===============================================================
StringBuilder sb = new StringBuilder("abcdefg");
sb.append("ak"); //abcdefgak
sb.insert(1,"et");//aetbcdefg
sb.deleteCharAt(2);//abdefg
sb.delete(2,4);//abefg
sb.setLength(4);//abcd
sb.setCharAt(0,'k');//kbcdefg
sb.replace(0,2,"hhhh");//hhhhcdefg
//想要使用缓冲区,先要建立对象。
StringBuffer sb = new StringBuffer();
sb.append(12).append("haha");//方法调用链。
String s = "abc"+4+'q';
s = new StringBuffer().append("abc").append(4).append('q').toString();
//===============================================================
class Test{
public static void main(String[] args) {
String s1 = "java";
String s2 = "hello";
method_1(s1,s2);
System.out.println(s1+"...."+s2); //java....hello
StringBuilder s11 = new StringBuilder("java");
StringBuilder s22 = new StringBuilder("hello");
method_2(s11,s22);
System.out.println(s11+"-----"+s22); //javahello-----hello
}
public static void method_1(String s1,String s2){
s1.replace('a','k');
s1 = s2;
}
public static void method_2(StringBuilder s1,StringBuilder s2){
s1.append(s2);
s1 = s2;
}
}
案例:字符串缓冲区自定义翻转 public class StringBufferTest { public static void main(String[] args) { StringBuilder builder = new StringBuilder(); builder.append("123true"); myReverse(builder); System.out.println(builder); } //字符串缓冲区翻转,用户传递的就是一个缓冲区,翻转后,返回一个缓冲区 private static StringBuilder myReverse(StringBuilder builder) { //将缓冲区转成String类型 String s = builder.toString(); //通过字符串,转成字符数组 char[] ch = s.toCharArray(); //对数组进行翻转 for(int x=0,y=ch.length-1;x<y;x++,y--) { char temp = ch[x]; ch[x] = ch[y]; ch[y] =temp; } //将数组变成缓冲区返回 return builder.delete(0, builder.length()).append(ch); } //使用数组翻转,使用一个int类型数组,实现翻转 private static void method() { int[] arr ={3,2,1,5,6,9}; for(int x=0,y=arr.length-1;x<y;x++,y--) { //定义零时变量,存储数组的0下标:整体思路就是头和尾互换 int temp = arr[x]; //将数组的 arr[x]=arr[y]; arr[y]= temp; } for(int x=0; x<arr.length; x++) { System.out.println(arr[x]); } } }