java字符串拼接方式性能比较,java字符串拼接效率

本文目录一览:

java关于字符串拼接的问题

这是描述Java编译器对字符串常量的优化方法。

众所周知,数据内容是要定义在数据段的,假设下面的代码:

String s1 = “abc” ;

String s2 = “abc” ;

假如不进行优化的话,结果就是内存中有两个重复的”abc”内容,也就是说有两个“对象”。

Java编译器会针对这种情况进行优化,对于常量字符串”abc”,java编译器会只产生一个”abc”对象。这样,s1和s2是指向同一个内存区域的。

但假如字符串的值无法在编译时确定,如:String g = a.concat(“3”);

那么Java编译器将会为g变量分配一个空间。注意也不是立即分配,因为Java编译器是在全局对动态分配内存。

补充: 编译器不会检查 “test” + “3” 的结果是否就是”test3″,因此创建新对象。

java字符串拼接

不是指向同一个对象的。

假设再有个语句,String e = “test3”;因为String是final的,不可修改,所以可以把e看成常量。

当再遇到String d=”test”+”3″时,编译器在这里做了优化,把这条语句优化为String d=”test3″,由于存在一个相同的对象e,所以d也指向了e.

所以d、e是同一个对象。

而编译器在处理String c=a+b时,认为是两个变量相加,不会做优化。所以c,d不是同一个对象。

如果将a,b定义为

final String a = “test”;

final String b=”3″;

这时String c=a+b就变成了常量相加,所以编译器会对其进行优化,即这时c,d就相等了

ps:推荐楼主一本书《深入java虚拟机》,对java的底层机制有很好的介绍。

Java字符串拼接问题

因为String类型是引用类型,s3和s4的引用值是不一样的,尽管他们存储的数据一样,直接使用==进行比较,比较的是引用值的大小,所以是false,字符串这种引用类型比较大小的话一定要使用equals来比较,即System.out.println(s3.equals(s4));这样,输出结果就是true了。

java中string类concat方法和+的区别

java中string类concat方法和+的区别如下:

concat:将指定字符串连接到此字符串的结尾。如果参数字符串的长度为 0,则返回此 String 对象。否则,创建一个新的 String 对象,用来表示由此 String,对象表示的字符序列和参数字符串表示的字符序列连接而成的字符序列。示例:

“cares”.concat(“s”) returns “caress”

“to”.concat(“get”).concat(“her”) returns “together”参数:

str – 连接到此 String 结尾的 String。

返回:

一个字符串,它表示在此对象字符后连接字符串参数字符而成的字符。

+可以把任何类型的数据连接起来

C#拼接字符串的几种方式和性能

C# 拼接字符串的几种方式和性能

开发过程中常用到的拼接字符串的方法有三种:

1 简单 “+=” 拼接法

1

2

3

4

5

string str=”a”;

str+=”c”+”d”;

string str_1=”a”+”b”;

首先需要明白的是string类型,string是引用类型,保留在堆上,而不是栈上,用的时候传的是内存中的地址,每次修改就会重新创建一个新的string对象来存储字符串,原有的会被自动回收。

第一种方式的实现原理,第一步先在内存中分配空间,存储str变量的对象,值为”a”, “+=”时,又会重新创建一个对象来存储新的字符串(“abc”),把str指向这个新的地址。所以只有简单几步的拼写时,一般不会有太大问题,如果有时候需要循环拼接时,就会不断创建新的对象,很浪费性能和内存。

2 String.Format()

1

string str= String.Format(“{0}{1}{2}”,”a”,”b”,”c”);

这就需要先看看他的源代码了,

public static String Format(IFormatProvider provider, String format, params Object[] args) br data-filtered=”filtered”{

if (format == null || args == null)

throw new ArgumentNullException((format==null)?”format”:”args”);

StringBuilder sb = new StringBuilder(format.Length + args.Length * 8);

sb.AppendFormat(provider,format,args);

return sb.ToString();

}

可以看到是先创建一个StringBuilder类型的变量,长度为第一个参数的长度+参数长度的8倍。.Net自动分配一个比较大的容量来存储。StringBuilder的介绍请看第3种方法.

这种方式的代码看起来比较整洁,易于月度,效率也比+=高效很多。

3 StringBuilder.Append

StringBuilder str=new StringBuilder();

str.Append(“a”);

StringBuilder 是预先创建一个比较大的内存,以后每次操作时判断容量上限是否不够用,如果不够用就自动把容量扩大一倍,修改的还是第一次创建的对象的值。

如果是简单的拼写时,可以用 “+=”, string.format

循环内拼写很长的字符串时,就需要用到StringBuilder来节省性能和内存了。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/190101.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-29 13:53
下一篇 2024-11-29 13:53

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • Python字符串宽度不限制怎么打代码

    本文将为大家详细介绍Python字符串宽度不限制时如何打代码的几个方面。 一、保持代码风格的统一 在Python字符串宽度不限制的情况下,我们可以写出很长很长的一行代码。但是,为了…

    编程 2025-04-29
  • Python中将字符串转化为浮点数

    本文将介绍在Python中将字符串转化为浮点数的常用方法。在介绍方法之前,我们先来思考一下这个问题应该如何解决。 一、eval函数 在Python中,最简单、最常用的将字符串转化为…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • Python学习笔记:去除字符串最后一个字符的方法

    本文将从多个方面详细阐述如何通过Python去除字符串最后一个字符,包括使用切片、pop()、删除、替换等方法来实现。 一、字符串切片 在Python中,可以通过字符串切片的方式来…

    编程 2025-04-29
  • 如何优化 Git 性能和重构

    本文将提供一些有用的提示和技巧来优化 Git 性能并重构代码。Git 是一个非常流行的版本控制系统,但是在处理大型代码仓库时可能会有一些性能问题。如果你正在处理这样的问题,本文将会…

    编程 2025-04-29
  • Python缓存图片的处理方式

    本文将从多个方面详细阐述Python缓存图片的处理方式,包括缓存原理、缓存框架、缓存策略、缓存更新和缓存清除等方面。 一、缓存原理 缓存是一种提高应用程序性能的技术,在网络应用中流…

    编程 2025-04-29
  • Python如何将字符串1234变成数字1234

    Python作为一种广泛使用的编程语言,对于数字和字符串的处理提供了很多便捷的方式。如何将字符串“1234”转化成数字“1234”呢?下面将从多个方面详细阐述Python如何将字符…

    编程 2025-04-29
  • Python int转二进制字符串

    本文将从以下几个方面对Python中将int类型转换为二进制字符串进行详细阐述: 一、int类型和二进制字符串的定义 在Python中,int类型表示整数,二进制字符串则是由0和1…

    编程 2025-04-29
  • 用title和capitalize美观处理Python字符串

    在Python中,字符串是最常用的数据类型之一。对字符串的美观处理是我们在实际开发中经常需要的任务之一。Python内置了一些方法,如title和capitalize,可以帮助我们…

    编程 2025-04-28

发表回复

登录后才能评论