1.加号+拼接

这个用法是最初学习当中最常用的方法。原来也一直在用。

后来有了代码规范,在log打印日志的地方,让使用模板形式的字符串拼接。

才因此引发的思考。

这种+连接的优缺点在哪。

优点:只是方便

缺点:String是一个不可变的类,这导致

有的人说:a+b+c 本质上是 new String + new String + new String 。。。。这使得过量创建对象。极限状态下,gc的速度赶不上new的速度,就oom了。

也有的人说:String直接相加已经都被编译器优化成StringBuilder了,只是循环里优化的不太合理。所以,String相加快还是StringBuilder快,其实只是StringBuilder调用方式对比。。。

这两个说法看起来应该似乎跟编译版本有关系,具体的还不了解。

支路:所以String不可变的意义是?

1.方便做hash中的key

因为 String 的 hash 值经常被使用,例如 String 用做 HashMap 的 key。不可变的特性可以使得 hash 值也不可变,因此只需要进行一次计算。

2.String pool的需要

如果String被创建了,从String pool中直接获取引用,只要String 不改变,才能从String pool获取

3.安全性

String 经常作为参数,String 不可变性可以保证参数不可变。例如在作为网络连接参数的情况下如果 String 是可变的,那么在网络连接过程中,String 被改变,改变 String 对象的那一方以为现在连接的是其它主机,而实际情况却不一定是。

4.线程安全

String 不可变性天生具备线程安全,可以在多个线程中安全地使用。

2.String.format

可读性非常好

效率:低于stringbuilder

String.format具有更大的重量,String.format首先使用正则表达式解析输入,然后填充参数。因为它创建了一个新的Formatter,解析了您的输入格式字符串,创建了一个StringBuilder,将所有内容附加到它并调用toString()。所以性能最差。

3.String.concat

性能棒

public String concat(String str) {int otherLen = str.length();if (otherLen == 0) {return this;}int len = value.length;char buf[] = Arrays.copyOf(value, len + otherLen);str.getChars(buf, len);return new String(buf, true);}

参数不可以是null,他没给使用者提供自动检测null的功能,会报npe

简单粗暴,直接Arrays.copyOf,直接内存复制,这根StringBuilder原理类似,但是它不用初始化StringBuilder对象,只是每次concat都会创建一个新的String对象,所以在有些情况下它比StringBuilder要快一点。

支路:Arrays.copyOf是什么?

是创建一个新的数组(也就是分配了一个新的内存空间),然后调用System.arraycopy()复制内容,赋值给新数组,然后返回新数组。

浅拷贝:增加一个指针,指向了原来已经存在的对象地址,gc之后容易给它误回收了。

深拷贝:将原对象完完整整copy出一份新对象,并指向他。之后跟原对象毫无关系。

4.StringBuilder

这是咱们推荐的String处理工具,效率综合最好。

但他的可读性。。。

支路:StringBuilder的原理?

String源码:private final char value[];

StringBuilder源码:

1.StringBuilder extends AbstractStringBuilder

他继承AbstractStringBuilder

2. char[] value;

他定义了一个char[],默认长度16,非final,非static。

3.ensureCapacityInternal()

private void ensureCapacityInternal(int minimumCapacity) {// overflow-conscious codeif (minimumCapacity - value.length > 0) {value = Arrays.copyOf(value,newCapacity(minimumCapacity));}
}

每次修改,先调用扩容函数

长度要不够用,就申请一个更大的空间,然后将原来的内容,浅拷贝给那片新的空间

4.getchars()

public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
{if (srcBegin < 0)throw new StringIndexOutOfBoundsException(srcBegin);if ((srcEnd < 0) || (srcEnd > count))throw new StringIndexOutOfBoundsException(srcEnd);if (srcBegin > srcEnd)throw new StringIndexOutOfBoundsException("srcBegin > srcEnd");System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
}

修改String的最终方法,先判断是否空指针,再调用系统的System.arraycopy,上面的浅拷贝,本质也是调用的系统native方法。

public static native void arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length);

5.StringBuffer

它和StringBuilder是同门兄弟,都继承与AbstractStringBuilder

咱们代码规范表示,除非的多线程,单线程禁用。

他如何实现的线程安全?

他使用了Synchronized锁住待编辑的String,与stringbuilder相比有额外负担的。

奇淫技巧:Idea->Settings->Editor->intentions->StringBuilder,当使用+连接时提示改用stringbuilder

注:以上内容都是我编的

参考文献:

1.String使用final修饰的好处:在java中为什么String是被final的_牛顿爱吃水果的博客-CSDN博客_java string为什么是final

2.java String、String.concat和StringBuilder性能对比:java String、String.concat和StringBuilder性能对比 - 走看看

3.String+,StringBuilder,String.format运行效率比较:String+,StringBuilder,String.format运行效率比较_锦聪的博客-CSDN博客_string.format效率

关于java字符串拼接处理方法的总结相关推荐

  1. Java高级开发面试,java字符串拼接的方法

    一面:70分钟 突击电话面试 正思考着项目功能模块,阿里面试官打来了电话,开始了阿里一面. 阿里面试官自我介绍,介绍了5分钟左右,部门的情况,主要的业务 提问开始 会哪些操作系统 Linux会一点 说 ...

  2. java 字符串拼接_JAVA字符串拼接常见方法汇总

    字符串的拼接,常使用到的大概有4种方式: 1.直接使用"+"号 2.使用String的concat方法 3.使用StringBuilder的append方法 4.使用StringB ...

  3. java 拼html_java字符串拼接的方法

    java字符串拼接的几种方式 String类的方法: ①利用运算符"+" ②public String concat(String str)进行字符串的拼接操作 StringBuf ...

  4. java字符串拼接_为什么阿里巴巴不建议在for循环中使用quot;+quot;进行字符串拼接...

    点击上方"Java专栏",选择"置顶或者星标" 第一时间阅读精彩文章! ☞ 程序员进阶必备资源免费送「21种技术方向!」 点击查看☜ 字符串,是 Java 中最 ...

  5. C\C++\Java字符串拼接比较

    C\C++\Java字符串拼接比较: 昨天买好小米盒子,自己折腾了一会然后就教会老妈怎么玩,怎么看还珠格格之后,我闲来无事,突然想起了上次一个项目处理字符串遇到的性能问题,然后就仔细考虑了一下,越考虑 ...

  6. 最优雅的Java字符串拼接是哪种方式?

    title shortTitle category tag description head 最优雅的Java字符串拼接是哪种方式? Java字符串拼接 Java核心 数组&字符串 Java程 ...

  7. java字符串拼接常用方式

    方式一:+ "+",是java操作运算符比较常用的,也是简单直接的一种方式. String aa = "魅言倾馨";String bb = "子非我鱼 ...

  8. 关于 Java 字符串拼接的几种方式以及性能比较

    一.字符串拼接 字符串拼接是我们在Java代码中比较经常要做的事情,就是把多个字符串拼接到一起. 我们都知道,String 是 Java 中一个不可变的类,所以他一旦被实例化就无法被修改. 不可变类的 ...

  9. Java字符串拼接“+“

    Java字符串拼接"+" 当字符串之间使用 + 号拼接的时候,系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接,拼接后,再调用其toStr ...

最新文章

  1. python创建图片对应的csv格式_Python:如何从csv文件创建图形节点和边?
  2. 如何将程序添加到系统服务实现开机自启动
  3. pt-table-checksum与pt-table-sync使用实践
  4. DotnetSpider (二) Downloader的设置 Request自定义数据字典
  5. 一 在应用中升级u-boot、内核以及文件系统
  6. SpringIOC配置文件「bean」标签的属性id class name scope init-method destroy-method factory-bean factory-method
  7. 如何求matlab的in(2.0375),matlab2012年课后习题及答案详解
  8. 鸿蒙卡片-物联网DTU污水液位计卡片
  9. Android【报错】Description Resource Path Location Type AndroidManifest.xml file missing!
  10. cdr如何制作图表?
  11. android os 2.2刷机包,N1内置CoreELEC9.2.2、安卓7.1.2双系统刷机包,全功能刷机包V2.2...
  12. java.net.ConnectException: no available server
  13. docker 入门优质文章
  14. STM32F107中断优先级分组配置
  15. 在线付费问诊互联网医院智慧医疗系统包含哪些功能
  16. Business Transaction Events BTE 增强
  17. 三星回击苹果:将推指纹识别智能手机
  18. Wind万得PythonAPI量化接口常用小工具——时序数据处理及工作日前推查询
  19. 解决 raise ReadTimeoutError(self._pool, None, ‘Read timed out.‘)
  20. html表格table的表头排序,js代码fastunit使用案例

热门文章

  1. 制作一个化妆品网站(五)(前端界面搭建)
  2. '决策树','Logistic回归','支持向量机'
  3. 目前运动耳机哪个牌子好、当前最好的运动耳机品牌排行推荐
  4. redis队列优先级java实现_Redis 实现队列原理的实例详解
  5. java gil_为什么 Java 没有 GIL?
  6. 企业微信服务端API的理解(开发指南部分)
  7. 按钮上显示小手、箭头等
  8. 英语学习参考十五大网站
  9. SuperMap iDesktop不同椭球体投影坐标系的转换
  10. Android调用相机拍照,照片被旋转的问题