StringBuffer
字符串缓冲区,其实就是用来存储数据用的。也可视为容器(应该有:增删改查,四种功能)。StringBuffer的使用场合:数据较多,数据的类型和个数均不确定,且数据最终处理结果为String。
特点:
1. 这个容器可以直接存储所有基本数据类型(虽然API中没有提供参数为byte和short型数据的添加方法,但是有参数为int型的方法,将byte和short直接传入也没有问题)和引用数据类型。
2.这个容器和数组比较,不同的是长度是自动可变的。而数组是固定的。
3.这个容器使用的最终还是要把它变成String,也就是调用toString()方法。
4.他可以对字符串本身进行修改,而不是修改引用。
原理:String 的底层是StringBuffer,而StringBuffer的底层是数组。当向开始new StringBuffer()【默认长度为16字节】或者new StringBuffer(40)【指定容量为40】的StringBuffer中存储的数据长度大于开始本身长度时,jvm自动new一个更长的StringBuffer并将原来的数据复制进去,把新增加的数据添加到原数据的尾部。
方法:
添加数据:
@ 将数据追加到缓冲区的尾部 : StringBuffer append(data)
例子:
StringBuffer sb = new StringBuffer("abcd");
StringBuffer s1 = append(4);
s.o.p(s1);
s.o.p(sb);//上面两句话打印出来的结果一样,说明s1和sb指向同一个对象
s.o.p(s1 == sb);
String s2 = new String("abcd");
s2 ="heart";//只是将s2的引用改为指向"heart"
s2.CharAt();//后面只可以使用一次方法,因为使用这个方法后返回的结果不再是string对象。
sb.append(5).append(98.7);//方法调用链,只要方法调用后返回的还是对象,就可以继续调用。而对应于StringBuffer的append()方法,调用后不但返回的是对象,而且返回的还是原对象,引用都没有变化
@在指定位置插入指定数据:StringBuffer insert(index,data)【含头不含尾】
删除数据:
@删除部分数据:StringBuffer delete(int start, int end)
@删除指定数据:StringBuffer deleteCharAt(int index)
修改数据:
@将指定位置(index)上的字符改为char字符:void setCharAt(index,char)
@用指定的String去替换从start到end处的字符:StringBuffer replace(int start,int end,String)
获取数据:
@ int indexOf()
@ int lastIndexOf()
@ String substring(int start,int end )
@ String substring(int start) //返回类型怎么成了字符串了?
特有方法:
@ 反转StringBuffer中的字符序列:StringBuffer reverse()
@ 设置StringBuffer的长度:void setLength()
练习:翻转字符串
public class StringReverse {
/**
* 将字符串内的字符顺序翻转
*/
public static void main(String[] args) {
String s = "String!!!";
char[] arr = new char[s.length()];
for(int x=0 ;x < s.length();x++){
arr[x] = s.charAt(x);
System.out.print(arr[x]);
}
System.out.println();
for(int x=0 ;x < s.length()/2;x++){
char temp = arr[x];
arr[x] = arr[arr.length - x-1];
arr[arr.length - x-1] = temp;
}
for(char x:arr){
System.out.print(x);
}
}
}
StringBuffer和String的区别
String是StringBuffer调用toString方法构造的对象。注意:toString()方法只有在输出语句(s.o.p)中由于输出语句会自动调用此方法,故仅在输出StringBuffer时可以省去toString方法的调用。其他地方不可以。
StringBuilder(Jdk1.5才有的)
StringBuilder的功能和StringBuffer的功能是完全一致的。二者区别在于,StringBuffer线程安全是同步的,而StringBuilder的线程是非安全的,不是同步的。在单线程情况下优先使用StringBuilder,因为它不判断锁,故效率比StringBuffer要高。多线程时使用StringBuffer。
【附注】:JDK升级的因素:简化书写;提高效率;增强安全性。
基本数据类型对象包装类
Java把基本数据类型也描述成对象。即一个数值就是一个对象。可以对基本数据类型提供更多的属性和方法对其进行操作。
基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
Integer的构造函数:
Integer(int):将一个整数封装成整数对象。
Integer(String):将一个字符串封装成整数对象,这个字符串必须是数字格式的才行。如果传入”abc”则会保持数字格式异常。故可以看到基本数据类型包装类常用于基本数据和字符串之间的转换。特别是将字符串转换成基本数据类型尤其频繁(例如:网上注册时在文本框中输入姓名和年龄,其中年龄由于是在纯文本框形式,获取到的自然是字符串,需将其转成int再让它加入运算)。
例子:
int num = (new Integer(“12”)).intValue();
int num0= Inerger.parseInt(“12”);
注意:基本数据类型的包装类中仅有Character没有parseCharacter方法。
Integer的数制转换
十进制转成其他进制
static String |
toBinaryString(int i) 二进制 |
static String |
toHexString(int i) 十六进制 |
static String |
toOctalString(int i) 八进制 |
toString(int num,radix):将整数num按照radix(进制的基数)指定的进制方式转换并以String方式返回。
S.o.p(4+” ”)等价于S.o.p(Integer.toString(4))
其他进制转换成十进制: Integer.parseInt(String s,int radix).
例子:Integer.parseInt(“60”,16) //将16进制的字符串“60“转成十进制整数
自动装箱拆箱
Jdk1.5出现
像操作int数据类型一样来操作Integer:
int n = 4 ;
Integer i = 4 ;//自动将4封装成Integer对象,等价于Integer i = new Integer(4)
i = i + 5;//对i进行拆箱然后运算:i.intValue()+ 5,加法运算结束后又对结果进行装箱,变成Integer对象,赋值给i。
Integer i = null;//由于Integer是引用类型,故i可以为null,即不指向任何对象。
i = i + 5;//抛出空指针异常,故在使用拆箱装箱功能时应进行判断i是否为null
Integer x = new Integer(127);
Integer y = new Integer(“127”);
s.o.p(x==y);//false,因为new出来的是两个对象
s.o.p(x.equals(y));//ture,Integer重写了equals方法,比较对象中的内容
Integer a = 127;【128】
Integer b = “127”;【128】
s.o.p(a==b);//127时ture;128时false:在Integer中如果一个值小于Byte能存储的值[即小于128]而且已经有此对象在自动装包拆包中就不会开辟新的空间,而是让新的引用指向旧的引用
s.o.p(a.equals(b));//ture,Integer重写了equals方法,比较对象中的内容