String、StringBuffer、StringBuilder和StringTokenizer
- Java中有4个类可以对字符或字符串进行操作。
- Character:单字符操作。
- String:字符串操作,属于不可变类。
- 适合在需要被共享的场合中使用。
- 可用构造函数或者赋值的方式来初始化。
- String字符串修改实现的原理如下:当用String类型来对字符串进行修改时,其首先创建一个StringBuffer,其次是调用StringBuffer的append()方法,最后调用StringBuffer的toString()方法把结果返回。
- StringBuffer:字符串操作,属于可变类。
- 当一个字符串经常要被修改时,最好使用StringBuffer来实现。
- 如果用String保存一个经常被修改的字符串时,在字符串被修改时会比StringBuffer多很多附加的操作,同时生产很多无用对象。由于这些无用的对象会被垃圾回收器来回收,因此会影响程序的性能。
- 只能用构造函数的方式来初始化。
- StringBuilder与StringBuffer类似,都是字符串缓冲区,但是StringBuilder不是线程安全的。如果只在单线程中使用字符串缓冲区,那么StringBuilder的效率会更高一些。多线程用StringBuffer.
- 在执行效率上,StringBuilder最高,StringBuffer次之,String最低。一般而言,如果要操作的数据量比较小,应优先使用String类;如果是单线程,优先使用StringBuilder类;如果是多线程,优先考虑StringBuffer类。
- StringTokenizer:是用来分割字符串的工具类。将一个字符串分解为一个一个的单词或者标记。两个常用的方法
- hasMoreTokens():这个和hasMoreElements()方法的用法是一样的,只是StringTokenizer为了实现Enumeration接口而实现的方法,从StringTokenizer的声明可以看到:class StringTokenizer implements Enumeration<Object>。
- nextToken():这个方法和nextElement()方法的用法是一样的,返回此 StringTokenizer 的下一个标记。
- split()拆分字符串与StringTokenizer拆分字符串
- String.split()
- 单参数拆分方法
- public String[] split(String regex)
- 参数:regex定界正则表达式
- 返回: String[],字符串数组,它是根据给定正则表达式的匹配拆分此字符串确定的,如果表达式不匹配输入的任何部分,那么所得数组只具有一个元素,即此字符串。
- 抛出: PatternSyntaxException - 如果正则表达式的语法无效
- 特点: 该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法,即是split(String regex,0)。因此,所得数组中不包括结尾空字符串。
- 拆分后的字符数组不包含结尾空字符串
- 用单参数split()方法拆分字符串时会发现有时拆分出来的字符串数组长度好像与预期不一致,这是因为当最后拆分出的那个字符串为空字符时,这个空字符不会加到数组中去。
- 示例:拆分”Harry#James#Potter###”,以”#”号进行拆分,按感觉来说应该会拆分成六段
- 双参数拆分方法
- public String[] split(String regex, int limit)
- 参数比上面方法多了一个int类型,limit 参数控制模式应用的次数,即拆分的次数,因此影响所得数组的长度。下面n所指为limit参数
- 如果该限制 n 大于 0,则模式将被最多应用 n - 1 次,数组的长度将不会大于 n,而且数组的最后一项将包含所有超出最后匹配的定界符的输入。
- 如果 n 为非正,那么模式将被应用尽可能多的次数,而且数组可以是任何长度。
- 如果 n 为 0,那么模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。
- 与str.split(regex,limit)结果相同的方法
- 以下运用字符串匹配的方法与字符串拆分方法返回的结果一致。
- Pattern.compile(regex).split(str, n)
- 单参数拆分方法
- StringTokenizer 类拆分字符串
- 拆分原理:通过生成StringTokenizer对象,然后运用对象的属性来处理字符串拆分的。
- StringTokenizer类有三个构造函数,分别是一个参数,两个参数,三个参数的构造函数。
- public StringTokenizer(String str,String delim,boolean returnDelims)
- public StringTokenizer(String str,String delim)
- public StringTokenizer(String str)
- 如果 returnDelims 标志为 true,则分隔符字符也作为标记返回。每个分隔符都作为一个长度为 1 的字符串返回。如果标志为 false,则跳过分隔符,只是用作标记之间的分隔符。
- 注意,如果 delim 为 null,则此构造方法不抛出异常。但是,尝试对得到的 StringTokenizer 调用其他方法则可能抛出 NullPointerException。
- 参数:
- str - 要解析的字符串。
- delim - 分隔符。
- returnDelims - 指示是否将分隔符作为标记返回的标志。
- 抛出:
- NullPointerException - 如果 str 为 null。
- delim默认值 :当构造函数为一个参数时,tokenizer 使用默认的分隔符集 ” \t\n\r\f”,即:空白字符、制表符、换行符、回车符和换页符。分隔符字符本身不作为标记。
- 推荐使用split进行字符串拆分
- 从上面两种方法的案例其实可以看出String.split()方法比StringTokenizer类的拆分方法更好便捷,也更好用。
- 毕竟大多数时候拆分得到的子字符串是要进行操作的,而StringTokenizer类操作子字符串是靠遍历进行的,不仅麻烦,效率也低,相比之下运用数组进行下标操作就方便多了,事实上官方也不推荐用StringTokenizer类生成对象的方法来进行字符串的拆分操作了。
- String.split()