本文主要介绍了 Java 中替换空格的方法具有很好的参考价值, 下面跟着小编一起来看下吧
请实现一个函数, 将一个字符串中的空格替换成 例如, 当字符串为 We Are Happy. 则经过替换之后的字符串为 We Are Happy
- public class Solution {
- public String replaceSpace(StringBuffer str) {
- for(int k=0;k<str.length();k++)
- {
- char index=str.charAt(k);
- if(index==' ')
- {
- str.replace(k,k+1," ");
- }
- }
- return str.toString();
- }
- }
以下是 java.lang.StringBuilder.replace()方法的声明
public StringBuilder replace(int start, int end, String str)
参数
start -- 这是开始索引(包括)
end -- end 索引(不包括)
str -- 这是字符串, 它将取代以前的内容
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象, 然后将指针指向新的 String 对象, 所以经常改变内容的字符串最好不要用 String , 因为每次生成对象都会对系统性能产生影响, 特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作, 那速度是一定会相当慢的
而如果是使用 StringBuffer 类则结果就不一样了, 每次结果都会对 StringBuffer 对象本身进行操作, 而不是生成新的对象, 再改变对象引用所以在一般情况下我们推荐使用 StringBuffer , 特别是字符串对象经常改变的情况下而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接, 所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢, 而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:
- String S1 = This is only a + simple + test;
- StringBuffer Sb = new StringBuilder(This is only a).append( simple).append( test);
你会很惊讶的发现, 生成 String S1 对象的速度简直太快了, 而这个时候 StringBuffer 居然速度上根本一点都不占优势其实这是 JVM 的一个把戏, 在 JVM 眼里, 这个
String S1 = This is only a + simple + test; 其实就是:
String S1 = This is only a simple test; 所以当然不需要太多的时间了但大家这里要注意的是, 如果你的字符串是来自另外的 String 对象的话, 速度就没那么快了, 譬如:
- String S2 = This is only a;
- String S3 = simple;
- String S4 = test;
- String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做
在大部分情况下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer 线程安全的可变字符序列一个类似于 String 的字符串缓冲区, 但不能修改虽然在任意时间点上它都包含某种特定的字符序列, 但通过某些方法调用可以改变该序列的长度和内容
可将字符串缓冲区安全地用于多个线程可以在必要时对这些方法进行同步, 因此任意特定实例上的所有操作就好像是以串行顺序发生的, 该顺序与所涉及的每个线程进行的方法调用顺序一致
StringBuffer 上的主要操作是 append 和 insert 方法, 可重载这些方法, 以接受任意类型的数据每个方法都能有效地将给定的数据转换成字符串, 然后将该字符串的字符追加或插入到字符串缓冲区中 append 方法始终将这些字符添加到缓冲区的末端; 而 insert 方法则在指定的点添加字符
例如, 如果 z 引用一个当前内容是 start 的字符串缓冲区对象, 则此方法调用 z.append("le") 会使字符串缓冲区包含 startle, 而 z.insert(4, "le") 将更改字符串缓冲区, 使之包含 starlet
在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder 一个可变的字符序列是 5.0 新增的此类提供一个与 StringBuffer 兼容的 API, 但不保证同步该类被设计用作 StringBuffer 的一个简易替换, 用在字符串缓冲区被单个线程使用的时候 (这种情况很普遍) 如果可能, 建议优先采用该类, 因为在大多数实现中, 它比 StringBuffer 要快两者的方法基本相同
来源: http://www.phperz.com/article/18/0228/358679.html