字符串优化处理

目录

1、String类型并不是Java基本数据类型之一,Java的8中基本数据类型如下:

2、String对象内部结构:

3、String对象的3个基本特点:

(1)不变性:

(2)针对常量池的优化:

(3)类的final定义:

4、字符串的分割和查找:

(1)split()方法:

(2)StringTokenizer类

(3)更优化的字符串分割方式:

(4)具体情况下需要根据实际情况进行使用

5、StringBuffer和StringBuilder

总结:


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编程中非常非常常用的一个对象,对它的系统学习是让我收获颇多,在我们使用某个函数能够达到某种目的的时候,还需要考虑它的性能。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值