清空StringBuilder对象里的1行10列与10行10列数据三种方案速度优劣对比

public class Example8 {

    public static void main(String[] args) throws Exception {
        String a1 = "";
        String a2 = "";
        String a3 = "";

        StringBuilder sb2 = new StringBuilder();
        StringBuilder sb3 = new StringBuilder();
        long start1Time = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            //需要就创建一个StringBuilder对象,上一次创建的StringBuilder由系统自动回收
            StringBuilder sb1 = new StringBuilder();
            sb1.append("someString1\t");
            sb1.append("someString2\t");
            sb1.append("someString3\t");
            sb1.append("someString4\t");
            sb1.append("someString5\t");
            sb1.append("someString6\t");
            sb1.append("someString7\t");
            sb1.append("someString8\t");
            sb1.append("someString9\t");
            sb1.append("someString10\n");
            sb1.append("someString11\t");
            sb1.append("someString12\t");
            sb1.append("someString13\t");
            sb1.append("someString14\t");
            sb1.append("someString15\t");
            sb1.append("someString16\t");
            sb1.append("someString17\t");
            sb1.append("someString18\t");
            sb1.append("someString19\t");
            sb1.append("someString20\n");
            sb1.append("someString21\t");
            sb1.append("someString22\t");
            sb1.append("someString23\t");
            sb1.append("someString24\t");
            sb1.append("someString25\t");
            sb1.append("someString26\t");
            sb1.append("someString27\t");
            sb1.append("someString28\t");
            sb1.append("someString29\t");
            sb1.append("someString30\n");
            sb1.append("someString31\t");
            sb1.append("someString32\t");
            sb1.append("someString33\t");
            sb1.append("someString34\t");
            sb1.append("someString35\t");
            sb1.append("someString36\t");
            sb1.append("someString37\t");
            sb1.append("someString38\t");
            sb1.append("someString39\t");
            sb1.append("someString40\n");
            sb1.append("someString41\t");
            sb1.append("someString42\t");
            sb1.append("someString43\t");
            sb1.append("someString44\t");
            sb1.append("someString45\t");
            sb1.append("someString46\t");
            sb1.append("someString47\t");
            sb1.append("someString48\t");
            sb1.append("someString49\t");
            sb1.append("someString50\n");
            sb1.append("someString51\t");
            sb1.append("someString52\t");
            sb1.append("someString53\t");
            sb1.append("someString54\t");
            sb1.append("someString55\t");
            sb1.append("someString56\t");
            sb1.append("someString57\t");
            sb1.append("someString58\t");
            sb1.append("someString59\t");
            sb1.append("someString60\n");
            sb1.append("someString61\t");
            sb1.append("someString62\t");
            sb1.append("someString63\t");
            sb1.append("someString64\t");
            sb1.append("someString65\t");
            sb1.append("someString66\t");
            sb1.append("someString67\t");
            sb1.append("someString68\t");
            sb1.append("someString69\t");
            sb1.append("someString70\n");
            sb1.append("someString71\t");
            sb1.append("someString72\t");
            sb1.append("someString73\t");
            sb1.append("someString74\t");
            sb1.append("someString75\t");
            sb1.append("someString76\t");
            sb1.append("someString77\t");
            sb1.append("someString78\t");
            sb1.append("someString79\t");
            sb1.append("someString80\n");
            sb1.append("someString81\t");
            sb1.append("someString82\t");
            sb1.append("someString83\t");
            sb1.append("someString84\t");
            sb1.append("someString85\t");
            sb1.append("someString86\t");
            sb1.append("someString87\t");
            sb1.append("someString88\t");
            sb1.append("someString89\t");
            sb1.append("someString90\n");
            sb1.append("someString91\t");
            sb1.append("someString92\t");
            sb1.append("someString93\t");
            sb1.append("someString94\t");
            sb1.append("someString95\t");
            sb1.append("someString96\t");
            sb1.append("someString97\t");
            sb1.append("someString98\t");
            sb1.append("someString99\t");
            sb1.append("someString100\n");
            a1 = sb1.toString();
        }
        long end1Time = System.currentTimeMillis();
        System.out.println("方案一耗时:" + (end1Time - start1Time));

        long start2Time = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            sb2.delete(0, sb2.length());
            sb2.append("someString1\t");
            sb2.append("someString2\t");
            sb2.append("someString3\t");
            sb2.append("someString4\t");
            sb2.append("someString5\t");
            sb2.append("someString6\t");
            sb2.append("someString7\t");
            sb2.append("someString8\t");
            sb2.append("someString9\t");
            sb2.append("someString10\n");
            sb2.append("someString11\t");
            sb2.append("someString12\t");
            sb2.append("someString13\t");
            sb2.append("someString14\t");
            sb2.append("someString15\t");
            sb2.append("someString16\t");
            sb2.append("someString17\t");
            sb2.append("someString18\t");
            sb2.append("someString19\t");
            sb2.append("someString20\n");
            sb2.append("someString21\t");
            sb2.append("someString22\t");
            sb2.append("someString23\t");
            sb2.append("someString24\t");
            sb2.append("someString25\t");
            sb2.append("someString26\t");
            sb2.append("someString27\t");
            sb2.append("someString28\t");
            sb2.append("someString29\t");
            sb2.append("someString30\n");
            sb2.append("someString31\t");
            sb2.append("someString32\t");
            sb2.append("someString33\t");
            sb2.append("someString34\t");
            sb2.append("someString35\t");
            sb2.append("someString36\t");
            sb2.append("someString37\t");
            sb2.append("someString38\t");
            sb2.append("someString39\t");
            sb2.append("someString40\n");
            sb2.append("someString41\t");
            sb2.append("someString42\t");
            sb2.append("someString43\t");
            sb2.append("someString44\t");
            sb2.append("someString45\t");
            sb2.append("someString46\t");
            sb2.append("someString47\t");
            sb2.append("someString48\t");
            sb2.append("someString49\t");
            sb2.append("someString50\t");
            sb2.append("someString51\t");
            sb2.append("someString52\t");
            sb2.append("someString53\t");
            sb2.append("someString54\t");
            sb2.append("someString55\t");
            sb2.append("someString56\t");
            sb2.append("someString57\t");
            sb2.append("someString58\t");
            sb2.append("someString59\t");
            sb2.append("someString60\n");
            sb2.append("someString61\t");
            sb2.append("someString62\t");
            sb2.append("someString63\t");
            sb2.append("someString64\t");
            sb2.append("someString65\t");
            sb2.append("someString66\t");
            sb2.append("someString67\t");
            sb2.append("someString68\t");
            sb2.append("someString69\t");
            sb2.append("someString70\n");
            sb2.append("someString71\t");
            sb2.append("someString72\t");
            sb2.append("someString73\t");
            sb2.append("someString74\t");
            sb2.append("someString75\t");
            sb2.append("someString76\t");
            sb2.append("someString77\t");
            sb2.append("someString78\t");
            sb2.append("someString79\t");
            sb2.append("someString80\n");
            sb2.append("someString81\t");
            sb2.append("someString82\t");
            sb2.append("someString83\t");
            sb2.append("someString84\t");
            sb2.append("someString85\t");
            sb2.append("someString86\t");
            sb2.append("someString87\t");
            sb2.append("someString88\t");
            sb2.append("someString89\t");
            sb2.append("someString90\n");
            sb2.append("someString91\t");
            sb2.append("someString92\t");
            sb2.append("someString93\t");
            sb2.append("someString94\t");
            sb2.append("someString95\t");
            sb2.append("someString96\t");
            sb2.append("someString97\t");
            sb2.append("someString98\t");
            sb2.append("someString99\t");
            sb2.append("someString100\n");
            a2 = sb2.toString();
        }
        long end2Time = System.currentTimeMillis();
        System.out.println("方案二耗时:" + (end2Time - start2Time));

        long start3Time = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            sb3.setLength(0);
            sb3.append("someString1\t");
            sb3.append("someString2\t");
            sb3.append("someString3\t");
            sb3.append("someString4\t");
            sb3.append("someString5\t");
            sb3.append("someString6\t");
            sb3.append("someString7\t");
            sb3.append("someString8\t");
            sb3.append("someString9\t");
            sb3.append("someString10\n");
            sb3.append("someString11\t");
            sb3.append("someString12\t");
            sb3.append("someString13\t");
            sb3.append("someString14\t");
            sb3.append("someString15\t");
            sb3.append("someString16\t");
            sb3.append("someString17\t");
            sb3.append("someString18\t");
            sb3.append("someString19\t");
            sb3.append("someString20\n");
            sb3.append("someString21\t");
            sb3.append("someString22\t");
            sb3.append("someString23\t");
            sb3.append("someString24\t");
            sb3.append("someString25\t");
            sb3.append("someString26\t");
            sb3.append("someString27\t");
            sb3.append("someString28\t");
            sb3.append("someString29\t");
            sb3.append("someString30\n");
            sb3.append("someString31\t");
            sb3.append("someString32\t");
            sb3.append("someString33\t");
            sb3.append("someString34\t");
            sb3.append("someString35\t");
            sb3.append("someString36\t");
            sb3.append("someString37\t");
            sb3.append("someString38\t");
            sb3.append("someString39\t");
            sb3.append("someString40\n");
            sb3.append("someString41\t");
            sb3.append("someString42\t");
            sb3.append("someString43\t");
            sb3.append("someString44\t");
            sb3.append("someString45\t");
            sb3.append("someString46\t");
            sb3.append("someString47\t");
            sb3.append("someString48\t");
            sb3.append("someString49\t");
            sb3.append("someString50\t");
            sb3.append("someString51\t");
            sb3.append("someString52\t");
            sb3.append("someString53\t");
            sb3.append("someString54\t");
            sb3.append("someString55\t");
            sb3.append("someString56\t");
            sb3.append("someString57\t");
            sb3.append("someString58\t");
            sb3.append("someString59\t");
            sb3.append("someString60\n");
            sb3.append("someString61\t");
            sb3.append("someString62\t");
            sb3.append("someString63\t");
            sb3.append("someString64\t");
            sb3.append("someString65\t");
            sb3.append("someString66\t");
            sb3.append("someString67\t");
            sb3.append("someString68\t");
            sb3.append("someString69\t");
            sb3.append("someString70\n");
            sb3.append("someString71\t");
            sb3.append("someString72\t");
            sb3.append("someString73\t");
            sb3.append("someString74\t");
            sb3.append("someString75\t");
            sb3.append("someString76\t");
            sb3.append("someString77\t");
            sb3.append("someString78\t");
            sb3.append("someString79\t");
            sb3.append("someString80\n");
            sb3.append("someString81\t");
            sb3.append("someString82\t");
            sb3.append("someString83\t");
            sb3.append("someString84\t");
            sb3.append("someString85\t");
            sb3.append("someString86\t");
            sb3.append("someString87\t");
            sb3.append("someString88\t");
            sb3.append("someString89\t");
            sb3.append("someString90\n");
            sb3.append("someString91\t");
            sb3.append("someString92\t");
            sb3.append("someString93\t");
            sb3.append("someString94\t");
            sb3.append("someString95\t");
            sb3.append("someString96\t");
            sb3.append("someString97\t");
            sb3.append("someString98\t");
            sb3.append("someString99\t");
            sb3.append("someString100\n");
            a3 = sb3.toString();
        }
        long end3Time = System.currentTimeMillis();
        System.out.println("方案三耗时:" + (end3Time - start3Time));

    }
}
run:
方案一耗时:15280
方案二耗时:8326
方案三耗时:8040
BUILD SUCCESSFUL (total time: 32 seconds)

方案三在数据量比较多的时候,清空StringBuilder对象里的数据是最快的

方案三在数据量比较少的时候,清空StringBuilder对象里的数据依然是最快的

public class Example8 {

    public static void main(String[] args) throws Exception {
        String a1 = "";
        String a2 = "";
        String a3 = "";

        StringBuilder sb2 = new StringBuilder();
        StringBuilder sb3 = new StringBuilder();
        long start1Time = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            //需要就创建一个StringBuilder对象,上一次创建的StringBuilder由系统自动回收
            StringBuilder sb1 = new StringBuilder();
            sb1.append("someString1\t");
            sb1.append("someString2\t");
            sb1.append("someString3\t");
            sb1.append("someString4\t");
            sb1.append("someString5\t");
            sb1.append("someString6\t");
            sb1.append("someString7\t");
            sb1.append("someString8\t");
            sb1.append("someString9\t");
            sb1.append("someString10\n");
            a1 = sb1.toString();
        }
        long end1Time = System.currentTimeMillis();
        System.out.println("方案一耗时:" + (end1Time - start1Time));

        long start2Time = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            sb2.delete(0, sb2.length());
            sb2.append("someString1\t");
            sb2.append("someString2\t");
            sb2.append("someString3\t");
            sb2.append("someString4\t");
            sb2.append("someString5\t");
            sb2.append("someString6\t");
            sb2.append("someString7\t");
            sb2.append("someString8\t");
            sb2.append("someString9\t");
            sb2.append("someString10\n");
            a2 = sb2.toString();
        }
        long end2Time = System.currentTimeMillis();
        System.out.println("方案二耗时:" + (end2Time - start2Time));

        long start3Time = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            sb3.setLength(0);
            sb3.append("someString1\t");
            sb3.append("someString2\t");
            sb3.append("someString3\t");
            sb3.append("someString4\t");
            sb3.append("someString5\t");
            sb3.append("someString6\t");
            sb3.append("someString7\t");
            sb3.append("someString8\t");
            sb3.append("someString9\t");
            sb3.append("someString10\n");
            a3 = sb3.toString();
        }
        long end3Time = System.currentTimeMillis();
        System.out.println("方案三耗时:" + (end3Time - start3Time));

    }
}
方案一耗时:1628
方案二耗时:990
方案三耗时:856
BUILD SUCCESSFUL (total time: 4 seconds)

 

<think> 我们讨论的是StringBuilder清空方法。根据之前的对话历史,用户已经询问了关于switch case和枚举的问题,但当前问题转向了StringBuilder清空。因此,我们需要专注于这个问题。 清空StringBuilder的主要方法有两种: 1. 使用`setLength(0)`方法:这个方法将StringBuilder的长度设置为0,从而清空内容,但保留底层字符数组,这样在后续添加字符串时可以重用数组,提高性能。 2. 使用`delete(int start, int end)`方法:删除从start到end-1的字符。如果要清空,则删除整个长度范围内的字符。 另外,也可以创建一个新的StringBuilder来替换旧的,但这样会丢弃原有对象,如果后续还要使用同一个对象,则前两种方法更合适。 下面分别用代码示例说明: **方法1:使用`setLength(0)`** ```java StringBuilder sb = new StringBuilder("Hello"); sb.setLength(0); // 清空StringBuilder System.out.println(sb.toString()); // 输出空字符串 ``` **方法2:使用`delete(int start, int end)`** ```java StringBuilder sb = new StringBuilder("Hello"); sb.delete(0, sb.length()); // 删除从0到末尾的所有字符 System.out.println(sb.toString()); // 输出空字符串 ``` **方法3:重新赋值(新建对象)** ```java StringBuilder sb = new StringBuilder("Hello"); sb = new StringBuilder(); // 创建新的StringBuilder,原来的对象如果没有引用会被垃圾回收 ``` **性能比较**: - 对于需要重复使用同一个StringBuilder对象的场景(例如在循环中),使用`setLength(0)`是最优的,因为它不会重新分配底层数组,可以重用已分配的缓冲区。 - 使用`delete`方法也可以,但内部实现上,它实际上是将指定范围之后的字符向左移动,并设置新的长度。对于清空整个字符串,它和`setLength(0)`在性能上类似,但`setLength(0)`更简洁直接。 注意:使用`setLength(0)`时,如果之前StringBuilder中的字符串很长,清空后,底层数组仍然保留,可能会占用内存。如果之后不再需要添加大量内容,可以考虑使用`trimToSize()`来释放多余的数组空间,但这通常不是必需的。 因此,推荐使用`setLength(0)`方法。 生成相关问题: 1. 清空StringBuilder和使用新的StringBuilder对象哪个更好? 2. 如何减少StringBuilder的内存占用? 3. StringBuilder的`setLength(0)`方法和`delete`方法有什么区别? 4. 在多线程环境下,StringBuilder清空操作是否安全? 注意:StringBuilder是非线程安全的,如果在多线程中使用,需要外部同步。 最后,我们将回答组织成中文,并按照要求生成相关问题。 </think> ### 如何清空StringBuilder数据? 在Java中清空`StringBuilder`有以下三种常用方法,按效率从高到低排序: #### 1. **最优方法:`setLength(0)`** ```java StringBuilder sb = new StringBuilder("Hello"); sb.setLength(0); // 清空内容但保留底层缓冲区 System.out.println(sb.toString()); // 输出空字符串 ``` - ✅ **优点**: - 时间复杂度 $O(1)$,仅重置内部计数器 - 保留已分配的字符数组,后续操作可复用内存 - 避免内存重新分配的开销[^1][^2] - ❌ **注意**:底层数组不会被缩小(可用`trimToSize()`释放多余空间) #### 2. **高效方法:`delete()`** ```java sb.delete(0, sb.length()); // 删除从0开始到末尾的内容 ``` - ✅ **优点**: - 显式清空,代码意图明确 - 时间复杂度 $O(1)$(仅修改计数器和数组指针)[^2] - ❌ 缺点:需计算长度参数 #### 3. **替代方案:新建对象** ```java sb = new StringBuilder(); // 创建新对象 ``` - ✅ **适用场景**: - 需要完全释放旧对象内存时 - 配合GC策略优化内存使用 - ❌ **缺点**: - 内存分配开销 $O(n)$ - 旧对象需等待垃圾回收[^1] --- ### 性能对比 | 方法 | 时间复杂度 | 内存复用 | 适用场景 | |--------------------|------------|----------|------------------------| | `setLength(0)` | $O(1)$ | ✅ | 循环内重复使用 | | `delete(0, len)` | $O(1)$ | ✅ | 需精确控制删除范围 | | `new StringBuilder()` | $O(n)$ | ❌ | 彻底释放内存 | --- ### 最佳实践 1. **循环操作中使用`setLength(0)`** 避免反复创建新对象: ```java StringBuilder buffer = new StringBuilder(); for (String data : dataset) { buffer.setLength(0); // 复用缓冲区 buffer.append(process(data)); System.out.println(buffer); } ``` 2. **线程安全场景** 需配合同步控制: ```java synchronized(sb) { sb.setLength(0); sb.append(newData); } ``` 3. **内存敏感场景** 清空后释放空间: ```java sb.setLength(0); sb.trimToSize(); // 释放多余内存[^1] ``` --- ### 相关问题 1. `StringBuilder`和`StringBuffer`的清空方法有何区别? 2. 为什么`setLength(0)`比新建对象效率更高? 3. 在多线程环境下如何安全操作`StringBuilder`? 4. `StringBuilder`的`trimToSize()`方法何时应该使用? 5. 清空操作会影响`StringBuilder`的初始容量吗? > **关键建议**:在大多数场景下优先使用`setLength(0)`,兼顾性能和内存效率[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值