引子:
1)上周学习的java.lang包中:String,StringBuffer, StringBuilder 三个类的区别
2)java.util包中 集合类的接口:Collection,Map,Set、List、Queue 使用场景。
3)实际应用:两个集合的比较,一组数据其中被修改几条后统一提交到后台,如何快速处理save到库中。
一、String、StringBuffer、StringBuilder三者最大的区别在于后两者表示的字符串可以在后边改变字符串的长度,长度可变。而String是一个固定长度的字符串, String中的对象是不可变的,也就可以理解为常量,线性安全是必然的。
二、StringBuffer、StringBuilder两者的区别在于速度和安全性,StringBuilder的速度比较快。
AbstractStringBulider(抽象类)是StringBuffer、StringBuilder的公共父类,定义了很多常用的公共方法如expandCapacity、append、insert、indexOf等。
三、StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线性安全的。
四、StringBuilder并没有对方法进行加同步锁,所以是线性安全的。
五、StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。
六、StringBuffer线性安全(同步),平常推荐使用StringBuffer,也有当程序不是多线程的时候推荐使用StringBuilder,因为StringBuilder更有效率。
补充知识:
抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。
字符串类
字符串是字符的序列。在 Java 中,字符串无论是常量还是变量都是用类的对象来实现的。java.lang 提供了三种字符串类:String 类和 StringBuffer 类、StringBuilder类。
1.String 类
按照 Java 语言的规定,String 类是 immutable 的 Unicode 字符序列,其作用是实现一种不能改变的静态字符串。例如,把两个字符串连接起来的结果是生成一个新的字符串,而不会使原来的字符串改变。实际上,所有改变字符串的结果都是生成新的字符串,而不是改变原来字符串。
字符串与数组的实现很相似,也是通过 index 编号来指出字符在字符串中的位置的,编号从0 开始,第 2 个字符的编号为 1,以此类推。如果要访问的编号不在合法的范围内,系统会产生 StringIndexOutOfBoundsExecption 异常。如果 index 的值不是整数,则会产生编译错误。
String 类提供了如表 所示的几种字符串创建方法。
String 创建字符串的方法 | |
方法 | 功能 |
String s=”Hello!” | 用字符串常量自动创建 String 实例。 |
String s=new String(String s) | 通过 String 对象或字符串常量传递给构造方法。 |
public String(char value[]) | 将整个字符数组赋给 String 构造方法。 |
public String(char value[], int offset, int count) | 将字符数组的一部分赋给 String 构造方法,offset 为起始下标,count为子数组长度。 |
2.StringBuffer 类
String 类不能改变字符串对象中的内容,只能通过建立一个新串来实现字符串的变化。如果字符串需要动态改变,就需要用 StringBuffer 类。StringBuffer 类主要用来实现字符串内容的添加、修改、删除,也就是说该类对象实体的内存空间可以自动改变大小,以便于存放一个可变的字符序列。
StringBuffer 类提供的三种构造方法 | |
构造方法 | 说明 |
StringBuffer() | 使用该无参数的构造方法创建的 StringBuffer 对象,初始容量为 16 个字符,当对象存放的字符序列大于 16 个字符时,对象的容量自动增加。该对象可以通过 length()方法获取实体中存放的字符序列的长度,通过 capacity()方法获取当前对象的实际容量。 |
StringBuffer(int length) | 使用该构造方法创建的 StringBuffer 对象,其初始容量为参数 length 指定的字符个数,当对象存放的字符序列的长度大于 length 时,对象的容量自动增加,以便存放所增加的字符。 |
StringBuffer(Strin str) | 使用该构造方法创建的 StringBuffer 对象,其初始容量为参数字符串 str 的长度再加上 16 个字符。 |
几种 StringBuffer 类常用的方法 | |
方法 | 说明 |
append() | 使用 append() 方法可以将其他 Java 类型数据转化为字符串后再追加到 StringBuffer 的对象中。 |
insert(int index, String str) | insert() 方法将一个字符串插入对象的字符序列中的某个位置。 |
setCharAt(int n, char ch) | 将当前 StringBuffer 对象中的字符序列 n 处的字符用参数 ch 指定的字符替换,n 的值必须是非负的,并且小于当前对象中字符串序列的长度。 |
reverse() | 使用 reverse()方法可以将对象中的字符序列翻转。 |
delete(int n, int m) | 从当前 StringBuffer 对象中的字符序列删除一个子字符序列。这里的 n 指定了需要删除的第一个字符的下标,m 指定了需要删除的最后一个字符的下一个字符的下标,因此删除的子字符串从 n~m-1。 |
replace(int n, int m, String str) | 用 str 替换对象中的字符序列,被替换的子字符序列由下标 n 和 m 指定。 |