基于String不可变字符与StringBuilder可变字符的效率问题

String与StringBuilder的效率

‍1.如果需知要拼接的内容比较道少

不可变,拼接的多会产生多个新的对象,十分的耗费内存空间和程序执行效率

String result = "abc" + String.valueOf(1);
String result = "abc" + 1;

2.如果需内要拼接的内容比较容多

可以使用可变对象StringBuilder或者StringBuffer

String result = new StringBuffer().append("abc").append(1).append("def").append(2).toString();
package 可变与不可变的陷阱以及测试效率;
public class TimeTest {
	public static void main(String[] args) {
		StringTime();
		StringBuilderTime();
	}
	public static void StringTime() {
		long num1 = Runtime.getRuntime().freeMemory(); // 获取系统内存剩余空间
		long time1 = System.currentTimeMillis();// 获取系统当前时间
		String str = "";
		for (int i = 0; i < 1000; i++) {
			str = str + i;
		}
		// System.out.println(str);//
		long num2 = Runtime.getRuntime().freeMemory(); // 获取系统内存剩余空间
		long time2 = System.currentTimeMillis();// 获取系统当前时间
		System.out.println("String所用内存空间" + (num1 - num2));// 所用内存空间
		System.out.println("String所用时间" + (time2 - time1));// 所用时间
	}
	public static void StringBuilderTime() {
		long num1 = Runtime.getRuntime().freeMemory(); // 获取系统内存剩余空间
		long time1 = System.currentTimeMillis();// 获取系统当前时间
		StringBuilder str = new StringBuilder("");
		for (int i = 0; i < 1000; i++) {
			str.append(i);
		}
		// System.out.println(str);
		long num2 = Runtime.getRuntime().freeMemory(); // 获取系统内存剩余空间
		long time2 = System.currentTimeMillis();// 获取系统当前时间
		System.out.println("StringBuilder所用内存空间" + (num1 - num2));// 所用内存空间
		System.out.println("StringBuilder所用时间" + (time2 - time1));// 所用时间
	}
}

总结:

用String拼接字符串会产生大量对象耗费内存以及执行效率,所以在开发中建议使用StringBuilder进行字符串拼接

测试StringBuffer与StringBuilder的效率

相同点:

都是长度可变的字符串,两者基本操作相同

两者主要区别在于:

1.StringBuffer是线程安全的,StringBuilder是线程不安全的

2.StringBuffer从jdk1.0就存在,StringBuilder是在jdk5.0后才出现

StringBuilder相较与StringBuffer有速度优势,所以多数情况下建议使用StringBuilder

然而应用程序要求线程安全的情况下,则必须使用StringBuffer类

代码演示

//StringBuilder线程不安全
public class StringBuilderDemo {
	public static void main(String[] args) {
		long beginTime = System.currentTimeMillis();//开始计时
		StringBuilder builder = new StringBuilder();
		for(int i=0;i<80000000;i++) {
			builder.append(i);
		}
		long endtime = System.currentTimeMillis();//结束计时
		System.out.println("StringBuilder所用时间:"+(endtime-beginTime));
	}
}

结果:

//StringBuffer线程安全
public class StringBufferDemo {
	public static void main(String[] args) {
		long beginTime1 = System.currentTimeMillis();//开始计时
		StringBuffer buffer = new StringBuffer();
		for(int i=0;i<80000000;i++) {
			buffer.append(i);
		}
		long endtime1 = System.currentTimeMillis();//结束计时
		System.out.println("StringBuffer所用时间:"+(endtime1-beginTime1));
	}
}

结果:

由此可见,StringBuilder确实是会比StringBuffer速度更快一些。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java 中 String,StringBuffer 和 StringBuilder 的区别及用法

    1 简介 在 Java 语言中,共有 8 个基本的数据类型,分别为:byte.short.int.long.float.double.boolean 和 char,其中 char 类型用于表示单个字符,例如 a.b.c .A.B.C.& 这些大小写字母或者特殊字符等等.在实际的编程中,单个的字符并没有我们想象中用的那么频繁,反而是多个字符组成的"字符串"更为常见,但是在基本的数据类型中,并没有字符串这种数据类型.为了解决这个问题,Java 语言为我们提供了一个被 final 关

  • 从内存方面解释Java中String与StringBuilder的性能差异

    以前经常在网上看到关于Java字符串拼接等方面的讨论.看到有些Java开发人员在给新手程序员的建议中类似如下写道: 不要使用+号拼接字符串,要使用StringBuffer或StringBuilder的append()方法来拼接字符串. 不过,用+号拼接字符串就真的那么令人讨厌,难道使用+号拼接字符串就没有一点可取之处吗? 通过查阅Java API文档中关于String类的部分内容,我们可以看到如下片段: "Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串

  • Java中String类(字符串操作)的10个常见问题和解决方法

    本文介绍Java中关于String最常见的10个问题: 1. 字符串比较,使用 "==" 还是 equals() ?简单来说, "==" 判断两个引用的是不是同一个内存地址(同一个物理对象).而 equals 判断两个字符串的值是否相等.除非你想判断两个string引用是否同一个对象,否则应该总是使用 equals()方法.如果你了解 字符串的驻留 ( String Interning ) 则会更好地理解这个问题 2. 对于敏感信息,为何使用char[]要比Stri

  • 浅析我对 String、StringBuilder、StringBuffer 的理解

    StringBuilder.StringBuffer 和 String 一样,都是用于存储字符串的. 1.那既然有了 String ,为什么还需要他们两个呢? 原因是 String 是不可变的,它每次的字符串拼接,实际上都会 new 一个新的 String 进行接收. 2.谈谈StringBuilder.StringBuffer他们两个的联系: 我们可以知道 StringBuffer 在 1.0 的时候就发布了,那为什么还需要 StringBuilder 呢?原因是它的大部分方法都上了锁,是线程

  • 详细分析Java中String、StringBuffer、StringBuilder类的性能

    我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看API会发现,String.StringBuffer.StringBuilder都实现了 CharSequence接口,虽然它们都与字符串相关,但是其处理机制不同. String:是不可改变的量,也就是创建后就不能在修改了. StringBuffer:是一个可变字符串序列,它与String一样,在内存中保存的都是一个有序的字符串

  • 基于String不可变字符与StringBuilder可变字符的效率问题

    String与StringBuilder的效率 ‍1.如果需知要拼接的内容比较道少 不可变,拼接的多会产生多个新的对象,十分的耗费内存空间和程序执行效率 String result = "abc" + String.valueOf(1); String result = "abc" + 1; 2.如果需内要拼接的内容比较容多 可以使用可变对象StringBuilder或者StringBuffer String result = new StringBuffer().

  • JavaScript基于扩展String实现替换字符串中index处字符的方法

    本文实例讲述了JavaScript基于扩展String实现替换字符串中index处字符的方法.分享给大家供大家参考,具体如下: 核心代码: String.prototype.replaceCharAt = function(n,c){ return this.substr(0, n)+ c + this.substr(n+1,this.length-1-n); } 用法示例: <!DOCTYPE html> <html lang="en"> <head&g

  • 基于String实现同步锁的方法步骤

    在某些时候,我们可能想基于字符串做一些事情,比如:针对同一用户的并发同步操作,使用锁字符串的方式实现比较合理.因为只有在相同字符串的情况下,并发操作才是不被允许的.而如果我们不分青红皂白直接全部加锁,那么整体性能就下降得厉害了. 因为string的多样性,看起来string锁是天然比分段锁之类的高级锁更有优势呢. 因为String 类型的变量赋值是这样的: String a = "hello world."; 所有往往会有个错误的映象,String对象就是不可变的. 额,关于这个问题的

  • JAVA基础类库之String类,StringBuffer类和StringBuilder类

    目录 引言 String类 String类构造方法 String常用方法: 简单介绍的方法 详细介绍的方法 StringBuffer/StringBuilder常用方法 StringBuffer类构造方法 StringBuffer常用方法: 总结 引言 字符串就是一连串的字符序列,Java提供了String.StringBuffer和StringBuilder三个类来封装对字符串,并提供了系列方法来操作字符串对象. String类是不可变类的: StringBuffer对象则代表一个字符序列可变

  • Java详细分析String类与StringBuffer和StringBuilder的使用方法

    目录 String类基本概念 String字符串的存储原理 String类的常用构造方法 String类中常用方法 StringBuffer类 StringBuilder类 String类基本概念 String类属于引用数据类型,不属于基本数据类型. 在Java中只要是" "(双引号)中的,都是String对象. java中规定,双引号中的字符串是不可变的,也就是说"abc"自出生到死亡都不可能变成"abcd",也不能变成"ab&quo

  • C#中的不可变数据类型介绍(不可变对象、不可变集合)

    不可变对象 不可变(immutable): 即对象一旦被创建初始化后,它们的值就不能被改变,之后的每次改变都会产生一个新对象. 复制代码 代码如下: var str="mushroomsir"; str.Substring(0, 6) c#中的string是不可变的,Substring(0, 6)返回的是一个新字符串值,而原字符串在共享域中是不变的.另外一个StringBuilder是可变的,这也是推荐使用StringBuilder的原因. 复制代码 代码如下: var age=18;

  • Python 可变类型和不可变类型及引用过程解析

    在Python中定义一个数据便在内存中开辟一片空间来存储这个变量的值,这块已经被分配的内存空间便会有一个内存地址.访问这块内存需要用到变量名,变量名实际存储的是变量的地址在内存中的地址,但是使用print()函数得到的确实这块内存中实际的地址.这个就当成规定就好,没必要纠结. 获得变量在内存中的地址,可以使用id()函数. 常规使用 变量之间的赋值其实是把一个变量的内存地址传递给另一个变量,这样两个变量便都指向内存中的同一块空间,因此这两个变量的之是相等的 a = 1 b = a print("

  • 详细分析Python可变对象和不可变对象

    在 Python 中一切都可以看作为对象.每个对象都有各自的 id, type 和 value. id: 当一个对象被创建后,它的 id 就不会在改变,这里的 id 其实就是对象在内存中的地址,可以使用 id() 去查看对象在内存中地址. type: 和 id 一样当对象呗创建之后,它的 type 也不能再被改变,type 决定了该对象所能够支持的操作 value: 对象的值 一个对象可变与否就在于 value 值是否支持改变. 不可变对象 常见的不可变对象(immutable objects)

  • Java实现字符串的分割(基于String.split()方法)

    目录 前言 一.JDK-1.8-API文档说明(推荐阅读) 二.简单的使用 1.单个字符分隔 2.正则表达式 三.Java源码分析 1.源代码的测试代码 2.源代码运行原理图示 3.解读完代码后的总结(推荐阅读) 四.limit参数使用区别 1.limit=0 2.limit<0 3.limit>0 五.易错点(推荐阅读) 1.分割到第一个字符 2.转义字符\ 3.正则表达式修饰符不可用 总结 前言 本章对Java如何实现字符串的分割,是基于jDK1.8版本中的String.split()方法

  • Java String方法获取字符出现次数及字符最大相同部分示例

    本文实例讲述了Java String方法获取字符出现次数及字符最大相同部分.分享给大家供大家参考,具体如下: package demo; public class Test { public static void main(String[] args) { String str = "dasdalldsdslldsdszxll"; System.out.println("count="+get(str,"ll"));//打印ll出现的次数 St

随机推荐