首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

017:为什么不建议在循环中使用“+”拼接字符串

典型答案 由于字符串对象是不可变的,所以每次循环都会对操作符左右两边的字符串进行拷贝,并生成一个新的字符串对象。...如果要使用循环构建一个大的字符串,推荐使用StringBuilder代替String,使用StringBuilder的append()方法进行字符串连接,并在循环结束后将StringBuilder对象转为...StringBuilder的原理是预先分配了一个足够大小的缓冲区,然后循环的过程就是往缓冲区里填充数据,比使用“+”做字符串连接的效率要高很多。...知识点梳理 上面的答案是理论知识,这里看下实际案例,假设有如下代码,循环10000次将随机长度80的字符串连接为一个大的字符串,使用“+”和使用StringBuilder的方法之间的差距是两个数量级(我的环境...这就从字节码层面解释了为什么不建议在循环体内使用“+”执行字符串的拼接。 参考资料 《Effective Java(第二版)》 《Java编程思想》

1.3K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    为什么数据库连接池不采用IO多路复用?

    但是一般我们在使用 DB 时,还是经常性采用c3p0,tomcat connection pool等技术来与 DB 连接,哪怕整个程序已经变成以Netty为核心。这到底是为什么?...常见的误解 IO多路复用听上去好像是多个数据可以共享一个IO(socket连接),实际上并非如此。「IO多路复用不是指多个服务共享一个连接,而仅仅是指多个连接的管理可以在同一进程」。...对于使用DB的程序来讲,不管使用多路复用,还是连接池,都要维护一组网络连接,支持并发的查询。 为什么DB连接不能放到IO多路复用里一并执行吗?...那么为什么基于 IO 多路复用的实现不能成为默认的? 对于数据库开发者来说。这种用法在整体的用户里占有量非常小,所以也许不值当的花大力气。只需要把协议写清楚就可以做实现。...那么为什么基于 IO 多路复用的实现不能成为默认的? 批处理数据分析代码都是这样的场景。这样的程序写成NIO就会得不偿失——代码不容易懂,也没有任何效率上的优势。

    68420

    为什么数据库连接池不采用IO多路复用?

    导读:今天我们聊一个不常见的 Java 面试题:为什么数据库连接池不采用 IO 多路复用?总结本篇文章希望对从事相关工作的同学能够有所帮助或者启发 。 前言 这是一个非常好的问题。...但是一般我们在使用 DB 时,还是经常性采用c3p0,tomcat connection pool等技术来与 DB 连接,哪怕整个程序已经变成以Netty为核心。这到底是为什么?...对于使用DB的程序来讲,不管使用多路复用,还是连接池,都要维护一组网络连接,支持并发的查询。 为什么DB连接不能放到IO多路复用里一并执行吗?...那么为什么基于 IO 多路复用的实现不能成为默认的? 对于数据库开发者来说。这种用法在整体的用户里占有量非常小,所以也许不值当的花大力气。只需要把协议写清楚就可以做实现。...那么为什么基于 IO 多路复用的实现不能成为默认的? 批处理数据分析代码都是这样的场景。这样的程序写成NIO就会得不偿失——代码不容易懂,也没有任何效率上的优势。

    1K10

    redis为什么不直接使用C字符串,而要自定义简单动态字符串?

    没有直接使用 C 语言传统的字符串表示redis中的字符串,而是使用了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串...那么,为什么要用这种数据结构替代传统的字符串呢?我们先回顾一下C字符串。 C语言传统字符串 C语言传统字符串是以空字符结尾的字符数组。...惰性释放空间 而正因如此,出现字符串缩短的时候,也没有必要直接释放内存,只需要更新字符串,记录当前使用的长度即可,你说,下次字符串又增长的时候,不就又用上了吗?...所以要想存储一些特殊的字符串,即中间可能出现\0的字符串,传统的C字符串还不好办呢。 sds就不一样了,管你存什么,反正我长度是记录在len字段中了,输入写入多少,我记录多少。...buf 所以,类似下面这样的操作,也是安全的: strlen(pSds);/pSds为sds类型 strcasecmp(pSds, "hello world");//pSds为sds类型 所以你现在明白为什么要指向

    1.5K10

    为什么DB连接管理一般不采用IO多路复用?

    但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以Netty为核心。这到底是为什么? 首先纠正一个常见的误解。...对于使用DB的程序来讲,不管使用多路复用,还是连接池,都要维护一组网络连接,支持并发的查询。 为什么并发查询一定要使用多个连接才能完成呢?因为DB一般是使用连接作为Session管理的基本单元。...这样,限制对DB的连接数,就是在限制对DB资源的消耗。 因此,对DB来说,关键是要限制连接的数目。这个要求无论是DB连接池还是NIO的连接管理都能做到。...这样问题就绕回来了,为什么DB连接不能放到IO多路复用里一并执行吗?为啥大家都用连接池? 答案是,可以用IO多路复用——但是使用JDBC不行。...那么为什么基于IO多路复用的实现不能成为默认的,官方的,而要成为偏门呢? 对于数据库开发者来说。这种用法在整体的用户里占有量非常小,所以也许不值当的花大力气。

    1.8K100

    为什么 Python 的 f-string 可以连接字符串与数字?

    本文出自“Python为什么”系列,归档在 Github 上:https://github.com/chinesehuazhou/python-whydo 毫无疑问,Python 是一门强类型语言。...1, in TypeError: can only concatenate str (not "int") to str 它报类型错误了(TypeError),说字符串只能连接(concatenate...)字符串,不能连接 int 类型。...在默认情况下,format_spec 是一个空字符串,而format(value, "") 的效果等同于str(value) ,因此,在不指定其它 format_spec 的情况下,可以简单地认为 f-string...写在最后:本文属于“Python为什么”系列(Python猫出品),该系列主要关注 Python 的语法、设计和发展等话题,以一个个“为什么”式的问题为切入点,试着展现 Python 的迷人魅力。

    83720

    为什么 Python 的 f-string 可以连接字符串与数字?

    本文出自“Python为什么”系列,归档在 Github 上:https://github.com/chinesehuazhou/python-whydo 毫无疑问,Python 是一门强类型语言。...1, in TypeError: can only concatenate str (not "int") to str 它报类型错误了(TypeError),说字符串只能连接(concatenate...)字符串,不能连接 int 类型。...在默认情况下,format_spec 是一个空字符串,而format(value, "") 的效果等同于str(value) ,因此,在不指定其它 format_spec 的情况下,可以简单地认为 f-string...写在最后:本文属于“Python为什么”系列(Python猫出品),该系列主要关注 Python 的语法、设计和发展等话题,以一个个“为什么”式的问题为切入点,试着展现 Python 的迷人魅力。

    74600

    面试题:为什么数据库连接池不采用 IO 多路复用?

    为什么数据库连接池不采用 IO 多路复用? 这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。...但是一般我们在使用 DB 时,还是经常性采用c3p0,tomcat connection pool等技术来与 DB 连接,哪怕整个程序已经变成以Netty为核心。这到底是为什么?...对于使用DB的程序来讲,不管使用多路复用,还是连接池,都要维护一组网络连接,支持并发的查询。 为什么并发查询一定要使用多个连接才能完成呢?因为DB一般是使用连接作为Session管理的基本单元。...这样问题就绕回来了,为什么DB连接不能放到IO多路复用里一并执行吗?为啥大家都用连接池? 答案是,可以用IO多路复用——但是「使用JDBC不行」。...那么为什么基于 IO 多路复用的实现不能成为默认的,官方的,而要成为偏门呢? 对于数据库开发者来说。这种用法在整体的用户里占有量非常小,所以也许不值当的花大力气。

    61610

    虾皮二面:为什么数据库连接池不采用 IO 多路复用?

    Java面试指南网站:javaguide.cn 今天我们聊一个不常见的 Java 面试题:为什么数据库连接池不采用 IO 多路复用? 这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。...但是一般我们在使用 DB 时,还是经常性采用c3p0,tomcat connection pool等技术来与 DB 连接,哪怕整个程序已经变成以Netty为核心。这到底是为什么?...对于使用 DB 的程序来讲,不管使用多路复用,还是连接池,都要维护一组网络连接,支持并发的查询。 为什么并发查询一定要使用多个连接才能完成呢?...这样问题就绕回来了,为什么 DB 连接不能放到 IO 多路复用里一并执行吗?为啥大家都用连接池? 答案是,可以用 IO 多路复用——但是使用 JDBC 不行。...那么为什么基于 IO 多路复用的实现不能成为默认的,官方的,而要成为偏门呢? 对于数据库开发者来说。这种用法在整体的用户里占有量非常小,所以也许不值当的花大力气。

    51130

    Java代码评审歪诗!让你写出更加优秀的代码!

    贾言 代码评审歪诗 窗外风雪再大 也有我陪伴着你 全文字数:2000字 阅读时间:5分钟 贾言 代码评审歪诗 验幻空越重 命循频异长 依轮线日简 接偶正分壮 架构师说, 用20个字描述代码评审的内容...幻数可定义为枚举或常量以增强其可读性; 空-空 要时刻警惕空指针异常: 常见的 a.equals(b) 要把常量放到左侧; aInteger == 10 如果 aInteger 为空时会抛出空指针异常; 不确认返回集合是否可为空时要做非空判断...循-勋 不要在循环中调用服务,不要在循环中做数据库等跨网络操作; 频-品 写每一个方法时都要知道这个方法的调用频率,一天多少,一分多少,一秒多少,峰值可能达到多少,调用频率高的一定要考虑性能指标,考虑是否会打垮数据库...日-日 打印日志和设定合理的日志级别,如有必要要添加if条件限定是否打印日志,在日志中使用JSON序列化,生成长字符串的toString()都要做if限定打印,否则配置的日志级别没达到,也会做大量字符串拼接...正-正 模块之间依赖关系要正向依赖,不能让底层模块依赖于上层模块;不能让数据层依赖于服务层也不能让服务层依赖于UI层;也不能在模块之间形成循环依赖关系。

    5.4K20

    常见负载均衡策略「建议收藏」

    基于这个前提,轮循调度是一个简单而有效的分配请求的方式。然而对于服务器不同的情况,选择这种方式就意味着能力比较弱的服务器也会在下一轮循环中接受轮循,即使这个服务器已经不能再处理当前这个请求了。...加权轮循 Weighted Round Robin: 这种算法解决了简单轮循调度算法的缺点:传入的请求按顺序被分配到集群中服务器,但是会考虑提前为每台服务器分配的权重。...和加权轮循调度方法一样,不正确的分配可以被记录下来使得可以有效地为不同服务器分配不同的权重。...加权响应 Weighted Response: 流量的调度是通过加权轮循方式。加权轮循中 所使用的权重 是根据服务器有效性检测的响应时间来计算。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    6.9K30

    负载均衡调度算法大全

    基于这个前提,轮循调度是一个简单而有效的分配请求的方式。然而对于服务器不同的情况,选择这种方式就意味着能力比较弱的服务器也会在下一轮循环中接受轮循,即使这个服务器已经不能再处理当前这个请求了。...image 加权轮循(Weighted Round Robin) 这种算法解决了简单轮循调度算法的缺点:传入的请求按顺序被分配到集群中服务器,但是会考虑提前为每台服务器分配的权重。...和加权轮循调度方法一样,不正确的分配可以被记录下来使得可以有效的为不同服务器分配不同的权重。...加权响应(Weighted Response) 流量的调度是通过加权轮循方式。加权轮循中所使用的权重是根据服务器有效性检测的响应时间来计算。每个有效性检测都会被计时,用来标记它响应成功花了多长时间。...但是需要注意的是,这种方式假定服务器心跳检测是基于机器的快慢,但是这种假设也许不总是能够成立。

    6.3K30

    String 详解以及内存分析

    ; 符号 “+” 把两个字符串按给定的顺序连接在一起,并且是完全按照给定的形式。...当 “+” 运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接 int age = 18; String s = "age is" + age...中某个索引区间进行一些操作的方法,索引取值范围一般都是包头不包尾,就拿上面的 String substring(int beginIndex,int endIndex) 来说,它是截取子串 从 beginIndex...那为什么可以字符串拼接啊?你是在逗我吗? String JDK 源码 ? final 修饰了 String 类,使得 String 类不可被继承。...其实对于循坏来说,尽量避免在循坏里创建对象,可以将创建对象这个操作放在循坏外面,这样我们就让这个对象达到复用了。

    80120

    Python数据容器:集合

    本篇文章参考:黑马程序员一、集合的定义我们目前已经学习了列表、元组、字符串三个数据容器了,基本能满足大多数的使用场景,但为何又需要学习新的集合类型呢?...通过特性来分析:列表可修改、支持重复元素且有序元组、字符串不可修改、支持重复元素且有序我们发现列表、元组、字符串这三个数据容器局限在于它们都支持重复元素。...如果场景需要对内容做去重处理,列表、元组、字符串就不方便了。而集合最主要的特点就是不支持元素的重复(自带去重功能)并且内容无序。...for循坏遍历:# 集合的遍历# 集合不支持下标索引,所以不能用while循坏,可用for循坏set1={1,2,3}for element in set1: print(f"集合的元素有{element...新闻', '传播', '新闻', '传播', 'Hi', 'Python', 'Hi', 'Python', 'best',请按如下要求操作:1.定义一个空集合2.通过for循环遍历列表3.在for循环中将列表的元素添加至集合

    9331

    京东资深架构师代码评审歪诗

    贾言验幻空越重, 命循频异长。 依轮线日简, 接偶正分壮。言欢空月虫, 明勋品宜昌。 依伦先日贱, 洁偶正粉妆。 贾言 架构师说, 用20个字描述代码评审的内容, 自省也省人。...,幻数可定义为枚举或常量以增强其可读性 空: 要时刻警惕空指针异常 常见的 a.equals(b) 要把常量放到左侧 aInteger == 10 如果 aInteger 为空时会抛出空指针异常 不确认返回集合是否可为空时要做非空判断...循: 不要在循环中调用服务,不要在循环中做数据库等跨网络操作 频: 写每一个方法时都要知道这个方法的调用频率,一天多少,一分多少,一秒多少,峰值可能达到多少,调用频率高的一定要考虑性能指标,...toString() 都要做 if 限定打印,否则配置的日志级别没达到,也会做大量字符串拼接,占用很多 gc 年轻代内存....正: 模块之间依赖关系要正向依赖,不能让底层模块依赖于上层模块;不能让数据层依赖于服务层也不能让服务层依赖于 UI 层; 也不能在模块之间形成循环依赖关系。

    4.7K30

    App性能优化浅谈

    DELETE这几种请求方式,不同的请求方式有不同应用场景,比如GET请求,应当用来请求返回结果,参数是作为url的一部分;POST请求,用于请求会更改服务端数据或状态;HEAD请求跟GET一样,只是服务器不能在响应里返回消息主体...永久代:存放VM和Java类的元数据,以及interned字符串和类的静态变量。 这里涉及到JVM的相关知识,这里不继续深入探讨。...Display List的时间 -红色代表OpenGL渲染Display List所需要的时间 -黄色代表CPU等待GPU处理的时间 -中间绿色横线代表VSYNC时间16ms,尽量将所有条形图控制在这条绿线下 为什么是...针对字符串的拼接,使用StringBuffer替代String。 不要在循环当中声明临时变量,不要在循环中捕获异常。 如果对于线程安全没有要求,尽量使用线程不安全的集合对象。...最后 写这篇文章的出发点也是对Android性能优化有个比较清楚的认识,任何事情都不可能一蹴而就,需要循循渐进,对一个初学者你谈优化很不现实,我们先把基本的做好,再去考虑相应的优化,笔者也在不断学习当中

    2.2K30

    JAVA语言程序设计(一)04747

    :凡是用双引号引起来的部分,叫字符串常量 整数常量:直接写上数字。...数据范围从小到大 强制类型转换(显示) 数据类型转换的主意事项 强制数据类型转换一般不推荐使用,可能会发生精度损失,数据溢出 byte、short、char这三种类型都可以发生数学运算...String(首字母大写,并不是关键字)来说 String 字符串属于引用类型 任何数据类型跟字符串相加都会变成字符串 优先级???...bx*5 /= %= 比较运算符 注意事项; 比较运算符的结果一定是个布尔值,成立就是true,否则为false 不可连续写,列如:1<x<4; 逻辑运算符 与 &&(并且)用来连接...,一般可以分成四部分 初始化语句:在循坏开始最初执行,而且只做唯一一次 条件判断:如果成立,则循坏继续,不成立循坏退出 循坏体:重复做的事情内容,若干行语句 步进语句:每次循坏之后要进行的扫尾工作,每次循坏结束都要这样

    5.1K20
    领券