构建字符串对象具有三种方式,分别为String、StringBuffer和StringBuilder。
- String
String最大的特性就是具有不可变性,整个类采用了final来进行修饰。String字符串内存空间被分配在方法区的常量池中,在进行等值方式进行赋值时,它首先在方法区的常量池中寻找是否有相同(内容相同)的字符串,如果存在相同字符串,则String类并不会创建一个新的对象,而是在栈上创建了一个新的引用指向常量池中的地址空间,这也就造就了String类的一个显著缺点,只要原字符串发生改变,则必定会在常量池中创建一个新的对象,如此频繁的操作对象势必会造成时间和空间上的浪费,但之所以设计者这样设计实际上是在共享机制所带来的效率和提取、拼接字符串所带来的效率进行了权衡,认为共享所提高的效率远远高于改变字符串所引起的低效率。
String类提供了50多种方法,以下是个人认为较为常用的方法:
方法 | 功能 |
char charAt(int index) | 返回给定位置的代码单元,也就是指定位置的char |
boolean equals(Object. other) | 判断字符串与other内容、类型是否相同,判断流程: 1. “==”判断,若想等不进行之后判断,提高效率 2. "instanceof"进行类型判断 3. 内容判断 |
int indexOf(String str ) int indexOf(int cp) int lastindexOf(String str ) int lastindexOf(int cp) | 返回与字符串str或代码点cp匹配的第一个字串的开始/最后位置 |
int length() | 返回字符串的长度 |
int replace(CharSequence oldString , CharSequence newString) | 字符串代替,传入的数据处理成字符串特殊处理时可能会使用此方法去掉空格 |
String substring(int beginIndex) String. substring(int beginIndex , int endIndex) | 截取字串,从开始想截取的位置到最先不想截取的位置的字串,也就是beginIndex~endIndex-1 |
String tirm() | 去掉字符串首位的空格 |
String join(CharSequence delimiter , CharSequence... elements) | 构建特殊字符串,如字符串用/分隔开 |
- StringBuffer
String适用于改变频率较低的字符串构建,Java也提供StringBuffer类来动态构建字符串,一般采用append()方法在原对象上追加,避免了String类不断创建字符串造成空间和时间上的浪费。常用方法如下:
方法 | 功能 |
int length() | 返回构建器或者缓冲器中的代码单元数量 |
StringBuffer append(String str) | 追加字符串 |
void setCharAt(int i , char c) | 将第i个代码单元设置为c |
StringBuffer insert(int offset , String str) | 在offset位置插入一个代码单元并返回this |
StringBuffer delete(int startIndex , int endIndex) | 删除偏移量从startIndex到endIndex-1的代码单元 |
String toString() | 返回一个与构建器或缓冲器内容相同的字符串 |
- StringBuilder
StringBuilder类是JDK1.5之后引入的一个类,因为StringBuffer是线程安全的,它是通过重量级锁synchronized来解决并发问题的,在这种粒度的锁下,虽然允许采用多线程的方式执行添加或者删除字符串的操作,但同时也带来了效率问题,特别是在单线程情况下是非常不实用的,所以JDK1.5之后推出了StringBuilder类在单线程情况下去代替StringBuffer类,同时也不会丢失StringBuffer动态修改字符串的特性。