String\StringBuffer\StringBuilder
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
String是不可变的对象(String类的声明是public final,每次对String更改都会生成一个新的String对象,会对系统性能产生影响)
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
String是不可变的对象(String类的声明是public final,每次对String更改都会生成一个新的String对象,会对系统性能产生影响)
StringBuffer:线程安全的可变字符序列,通过某些方法调用可以改变该序列的长度和内容。
StringBuffer上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。
append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的位置添加字符。
(例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,
则此方法调用 z.append(“le”) 会使字符串缓冲区包含“startle”,
而 z.insert(4, “ab”) 将更改字符串缓冲区,使之变为“starabtle”。)
append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的位置添加字符。
(例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,
则此方法调用 z.append(“le”) 会使字符串缓冲区包含“startle”,
而 z.insert(4, “ab”) 将更改字符串缓冲区,使之变为“starabtle”。)
StringBuilder:一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步。
建议优先采用该类,因为在大多数实现中,它比StringBuffer要快。两者的方法基本相同。
使用步骤:
1、通过用一个重载的构造函数方法初始化变量,可以创建StringBuilder类的新实例,例如
StringBuilder textStringBuilder = new StringBuilder();
1、通过用一个重载的构造函数方法初始化变量,可以创建StringBuilder类的新实例,例如
StringBuilder textStringBuilder = new StringBuilder();
2、设置容量和长度
StringBuilder textStringBuilder = new StringBuilder("Hello"); //长度为 5的一个新实例
或者
StringBuilder textStringBuilder = new StringBuilder("Hello World",25); //使用重载的构造函数之一来指定 StringBuilder类的容量
3、append方法:
将文本或对象的字符串表示形式添加到由当前StringBuilder对象表示的字符串的结尾处。
4、Insert方法:
将字符串或对象添加到当前StringBuilder中的指定位置。
5、remove方法:
从当前StringBuilder中移除指定数量的字符,移除过程从指定的索引处开始。
6、replace方法:
可以用另一个指定的字符来替换StringBuilder对象内容的字符。
区别:
运行速度快慢为:StringBuilder > StringBuffer > String。
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
synchronized关键字是做什么的?
防止多个线程同时操作同一个对象,防止访问量过大而出错。在多线程中非常常见,根据用法不同,可以给方法、代码块或者对象加锁。
当多个线程访问加锁的方法时,每次只有一个线程获得锁,其他线程必须等待该线程释放锁(执行完这个方法),
再由下一个线程获得锁,才允许执行该方法。(加锁会带来性能的损耗,还包括锁等待时的线程阻塞)
当多个线程访问加锁的方法时,每次只有一个线程获得锁,其他线程必须等待该线程释放锁(执行完这个方法),
再由下一个线程获得锁,才允许执行该方法。(加锁会带来性能的损耗,还包括锁等待时的线程阻塞)