首页 > 代码库 > String/StringBuffer/StringBuilder基础

String/StringBuffer/StringBuilder基础

String类:
特点:
1)字符串字面值"hello"可以看做一个字符串对象
2)字符串是常量,一旦被赋值,就不能被改变。

构造:
public String()
public String(byte[] bytes)
public String(byte[] bytes,int index,int length):表示从该字节数组的offset索引处开始获取length个字节数结合成字符串
public String(char[] value)
public String(char[] value,int offset,int count)
public String(String original)
------------------------------------------------------------
例1:byte[] bytes = {97,98,99,100,101,102};
String ss = new String(bytes);
System.out.println(ss);       //abcdef
System.out.println(ss.length());   //6
分析:将每一个字节的常量转成字符,然后组成字符串。
-------------------------------------------------------------
例2:char[] chars = {‘a‘,‘d‘,‘c‘,‘我‘,‘你‘,‘亲‘};
String ss = new String(chars);
System.out.println(ss);     //adc我你亲
System.out.println(ss.length());    //6

String s2 = new String(chars,1,3);
System.out.println(s2); //dc我

注意:中文可以用一个字符表示。
--------------------------------------------------------------
问题:
String s1 = new String("abcd");
String s2 = "abcd";
问:s1与s2产生的方式的区别???(即使用new和不使用new的区别)
答:从图中看出二者的区别:

技术分享

 


 

字符串直接赋值的方式是先到字符串常量池(方法区内)里面去找,如果有就直接返回,没有,就创建并返回。
一旦被赋值就不能改变意思是:值不能变,但是引用是可以变的。

字符串如果是变量相加(即字符串连接),先开空间,再拼接。
字符串如果是常量相加,先加,然后在常量池找,如果有就直接返回,否则,就创建

String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
System.out.println(s3==s1+s2); //false
System.out.println(s3=="hello"+"world");//true
-----------------------------------------------------------------------------------
字符串的功能:
1)判断功能:
boolean equals(Object obj)
boolean equalsIgnoreCase(Object obj)
boolean contains(String str) :内部调用indexof(),只要求结果>-1,就表示含有该字符串
boolean startsWith(String str)
boolean endsWith(String)
boolean isEmpty():主要是查看字符串的长度是否为零

String s = "";
String s1;或者 String s1=null;
问题:字符串为空和字符串对象为空?
字符串为空:仅是内容为空,但是对象存在。可以调用String类的方法
对象为空:没有对象,仅有一个引用,不能调用String类的方法
s.isEmpty();//true
s1.isEmpty();//error有异常,Exception in thread "main" java.lang.NullPointerException
---------------------------------------------------------------------------------------
2)String类的获取功能:
int length()
char charAt(int index) 获取指定索引处的字符
int indexOf(int ch) 返回指定字符在此字符串中第一次出现的索引
为什么这里是int类型,而不是char类型?
原因:‘a‘和97都可以代表‘a‘,但是由于char类型转int类型可以直接转,而int转char就会出现精度损失,需要强转,而且可能会报错。
当然,在传参数时可以传一个字符。
int indexOf(String str) 返回指定字符串在此字符串中第一次出现处的索引
int indexOf(int ch,int fromIndex)
int indexOf(String str,int fromIndex)
String substring(int start) 从指定位置开始截取字符串,默认到末尾
String substring(int start,int end) 从指定位置开始到指定位置结束截取字符串(包左不包右)

例:String s1 = "hello";
int index = s1.indexOf(‘e‘);或int index = s1.indexOf(101);
System.out.println(index);//1
----------------------------------------------------------------------------------------
3)转换功能
byte[] getBytes() 转换成字节数组
char[] toCharArray() 转成字符数组
static String valueOf(char[] chs) 将一个字符数组转成字符串
static String valueOf(int i) 把int转成字符串
该方法可以把任意类型的数据转成字符串
String toLowerCase() 将字符串转成小写
String toUpperCase() 将字符串转成大写
String concat(String str) 将字符串进行连接
-------------------------------------------------------------------
4)替换功能
String replace(char old,char new)
String replace(String old,String new)

去掉字符串两边的空格
String trim()
按照字典顺序比较两个字符串
int compareTo(String str)
int compareToIgnoreCase(String str)
----------------------------------------------------------------------

StringBuffer类:final定义的,不能被继承
如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时又浪费空间,而StringBuffer就可以解决这个问题。
构造:
public StringBuffer()
public StringBuffer(int capicity)
public StringBuffer(String str)

例如:
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = sb.append("hello");
System.out.println(sb); //hello
System.out.println(sb2); //hello
System.out.println(sb==sb2); //true 说明他俩指向同一个缓存区

增加功能:返回缓存区被改变后本身
public StringBuffer append(String str) 可以把任意类型数据添加到字符缓冲区里面,并返回字符串缓冲区本身
public StringBuffer insert(int index,String str)在指定位置追加字符串到缓冲区
append每次都在末尾追加,而insert每次都在指定的位置追加

删除功能:返回本身
public StringBuffer deleteCharAt(int index) 删除指定位置的字符,并返回本身
public StringBuffer delete(int start,int end)删除从指定位置开始到指定位置结束的内容,并返回本身
包左不包右

反转功能:对字符串进行反转操作,并返回字符串本身
public StringBuffer reverse():反转

替换功能:返回缓冲区本身
public StringBuffer replace(int start,int end,String str):将字符串代替从start开始到end结束截取的字符串

截取功能:唯独截取功能和以上的功能不相同,它的操作并不是返回缓冲区本身,而是一个新的字符串
public String subString(int start)
public String subString(int start,int end)

-----------------------------------------------------------------------------------------------------
String StringBuffer StringBuilder相关问题:
1 String StringBuffer StringBuilder三者的区别:
1)String是内容不可变的,而StringBuffer StringBuilder都是内容可变的
2)StringBuffer是同步的,数据安全,效率低;而StringBuilder是不同步的,数据不安全,效率高

2 StringBuffer和数组的区别??
二者都可以看做是一个容器。
1)虽然StringBuffer可以添加任意类型的数据,但是最终都变成了字符串类型的数据
2)而数组可以放置多种数据类型,但是必须是同一种类型的数据

3)String 作为形参
StringBuffer作为形式参数
注意:String作为形参传递,效果和基本类型作为参数传递是一样的。

形式参数一般情况:
基本类型:形式参数的改变不影响实际参数
引用类型:形式参数的改变直接影响实际参数










String/StringBuffer/StringBuilder基础