目录
1、String类型并不是Java基本数据类型之一,Java的8中基本数据类型如下:
1、String类型并不是Java基本数据类型之一,Java的8中基本数据类型如下:
8位:Byte(字节型);16位:short(短整型)、char(字符型);32位:int(整型)、float(单精度型/浮点型);64位:long(长整型)、double(双精度型);Boolean(布尔型)
2、String对象内部结构:
3、String对象的3个基本特点:
(1)不变性:
String对象一旦生成,就不能对它进行改变,可以提高多线程程序的性能。
(2)针对常量池的优化:
假如两个String对象拥有相同的值,它们只引用常量池中的同一个拷贝。
(3)类的final定义:
保证String对象没有子类,这是对系统安全性的保护。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
......
}
4、字符串的分割和查找:
(1)split()方法:
进行字符串切割,功能十分强大,传入的参数可以是一个正则表达式,进行复杂逻辑的字符串分割,但是效率非常低。
(2)StringTokenizer类
进行分割字符串,效率比split()更高一些。
它是JDK专门提供的用来处理字符串分割字串的工具类。
它的构造函数如下:
public StringTokenizer(String str, String delim) {
this(str, delim, false);
}
其中str是要分割处理的字符串,delim是分割符号。
(3)更优化的字符串分割方式:
使用indexOf()和subString()组合:
indexOf(),执行速度快,返回指定字符在String对象中的位置;
subString(),对字符串进行截取。
两个函数的执行速度非常快,很适合作为高频函数使用。
String temp = abc;123;def;
for(int i=0; i<10000; i++) {
while (true) {
String splitStr = null;
int j = temp.indexOf(';'); //找到分隔符的位置
if (j<0) break;
splitStr = temp.subString(0,j); //找到分隔符,截取子字符串
temp = temp.subString(j+1); //剩下的需要处理的字符串
}
}
(4)具体情况下需要根据实际情况进行使用
(5)charAt()函数是返回给定字符串中,位置在index的字符,效率和indexOf()一样高。
5、StringBuffer和StringBuilder
它们都实现了AbstractStringBuilder抽象类,拥有几乎相同的对外接口。
StringBuilder的效率更高,StringBuffer的方法几乎都加上了Synchronize,在多线程环境下使用。
容量参数:
无论是StringBuilder还是StringBuffer,在初始化时都可以设置一个容量参数,对应的构造函数如下:
在不指定容量参数时,默认是16个字节,如果要追加字符串,那么它的扩容函数为:
/**
* This implements the expansion semantics of ensureCapacity with no
* size check or synchronization.
*/
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
从上面这段代码中可以看出,扩容策略是将原有的容量大小翻倍,以新的容量申请内存空间,建立新的char数组,然后将原数组中的内容复制到这个新的数组中。因此,对于大对象的扩容会涉及大量的内存复制操作。所以,如果能够预先评估StringBuilder的大小,将能够有效地节省这些操作,从而提高系统的性能。
总结:
String字符串是Java编程中非常非常常用的一个对象,对它的系统学习是让我收获颇多,在我们使用某个函数能够达到某种目的的时候,还需要考虑它的性能。