尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Java字符串拼接优化:性能与可读性双赢方案

Java字符串拼接优化:性能与可读性双赢方案 我们目前正在对一段关于Java代码中字符串拼接进行优化的问题做分析工作, 原始代码的内容为: 变量msg被赋值为家人们谁懂啊加上角色对象的某个调用方法的结果, 紧接着是文本今天又来炫富了\n, 再加上文本人家充值仙玉根本不用充字, 那叫批量进货\n, 然后加上文本别人是玩游戏, 再次加上该角色的同一个调用方法结果, 最后是文本是来给系统送温暖的这段代码的功能就是生成一个字符串消息, 这个消息里面包含了游戏角色名称, 是用role.() 这种函数获取来的, 还有了一些固定的文本内容, 拿这些内容用来描述该角色在游戏里面“炫富”这种行为。第一点是关于可读性与性能的, 在Java里面, 如果用字符串连接符加号来拼接多个字符串, 特别是当在一行代码里连着用好多加号的时候, 要是这情况出现在循环或者被频繁调用的地方, 那说不定就会产生性能方面的问题, 这是因为每一个加号的操作可能都会去创建一个新的字符串对象, 不过呢, 假如这一段代码只会在偶尔执行的地方出现, 比如说只是在打印日志信息的时候输出一次, 那么像这样去写也是完全可以接受的。不过, 要是看重代码的干净利落和容易理解这一点的话, 可以考虑采用或者符号, 又或者或者是.号这种形式, 再一个选择就是用多行字符串的办法, 但这种情况得是使用的Java版本在15或者比15更高的版本才行。另外呢, 如果实际上的情况是使用Java 15以及比15这个版本号更高的版本时, 那我们就可以去把文本块这个东西给请出来, 同时搭配着多行字符串的特性一块来使用, 这么一来, 代码就会变得更加的清晰明了。3. 另外, 这里存在一个重复的role.()调用情况, 也就是对同一个方法进行了重复调用, 如果这个方法在执行时候的开销比较大, 那么可以选择把这个方法执行得到的结果保存到一个局部的变量里面去。4. 需要注意字符串里面的特殊字符, 比如有双引号的情况, 要确认这些特殊字符已经得到了正确的转义处理, 虽然当前这部分内容里使用的是中文引号, 但是英文环境下的双引号是必须进行转义操作的, 在代码的实现过程中使用了特定的符号, 由于这些实际上是属于中文字符, 所以并不需要进行额外的转义操作。但是你要去留意一点, 假如文本里面含有英文的双引号的话, 那么你就必须使用反斜杠来进行转义。关于优化的办法有好几种, 这里说的是第一种方案, 这种方案能够适应所有的java版本。你可以通过一个等号把角色调用出来的方法结果赋值给它, 这种做法能够防止你反复去调用这个方法导致出问题。后面又创建了一个新的对象并进行了某种初始化操作, 括号里是空的不需要填东西。接着调用了另外一个方法, 参数是家人们谁懂啊感叹号放在最末尾的位置。然后又进行了又一次调用, 输出的内容是今天又来炫富了的文字信息换行符号再后面。人家充值仙玉根本就不用充这个字眼, 那个行为叫做批量进货这样的说法。别人玩游戏就是为了娱乐, 而他来游戏里居然是为了给系统送去温暖, 你看看看他背包里面堆积如山的仙玉, 再瞧瞧我手里口袋当中只剩下的那一点点微不足道的东西, 只能感叹唉, 人和人之间的差距实在太大了, 物品与物品放在一起对比以后就会发现那些不够好的东西只值得被丢进垃圾桶。msg 等于 .(); 方案 2: 使用 .当内容格式化较多的时候, 但是这里占位符其实不多 role.(); msg .(家人们谁懂啊%s 今天又来炫耀财富了\n人家充值仙玉压根不需要用充值这个字, 人家那是叫做批量进货\n别人是在玩游戏,%s 却像是来给系统送温暖的看他背包里面堆得像小山一样高的仙玉, 再看看我口袋里面所剩无几的那三瓜两枣……唉, 人和人相比确实会让人绝望, 东西和东西相比也确实让人想要放弃。方案3是采用Java 15版本之后支持的多行文本块这一方式来处理问题, 这相当于角色进行了某个操作, 消息内容变成了大家谁能够理解其中的情况呢, 这个人今天又一次来展示他的财富了。人家往里头加仙玉的功夫, 根本就不能用一个“充”字来形容, 那个动作更准确的描述叫做批量进货。别人是在玩这个游戏, 而%s这个人分明是跑到系统那里去奉献爱心、送去温暖的。大家去看看他背包里面堆得像小山一样高的仙玉, 再瞅一瞅咱们自己口袋里面只有的那一点点可怜兮兮的三个瓜和两颗枣子……真是让人忍不住发出一声长叹, 人活着就是比来比去的, 最后肯定是把人给逼死啊, 货对好货看的话, 肯定要把货物全扔掉的。如果环境比较旧的话, 那么方案1在使用起来就是最有效的, 这一点尤其是在循环的场景中体现得更为明显。而方案2在读起来的时候, 其可读性是介于两者之间的那一种水平的, 但是使用者需要去记住其中的顺序。不过, 我们观察发现, 在原始的代码里面实际上使用的是固定的文本加上两次角色名的这样的形式, 所以在这种情况下使用文本块也就是Text的这种方式的, 可以更清晰地把字符串的原始格式给展示出来。另外呢, 我们还必须要在乎的一点是考虑到关于字符串拼接的性能和可读性这两者之间的权衡关系。由于这里的角色名字在字符串中只会出现在两个位置, 并且这个拼接的操作是当作一次完整的动作来处理的, 所以说实际运行时的性能差距其实是非常小的。正因为这样, 代码能不能让人一眼看懂, 以及以后好不好修改和维护, 就变成了更加值得看重的因素。最后总结一下, 如果您的项目开发环境里面用的是Java 15版本或者更新的版本, 那就非常推荐大家使用Text块写法。如果不是的话, 也可以采取直接写出来或者直接使用加号进行连接的方法去处理, 当然在这种不是经常调用的地方, 用加号连接的办法也是完全没问题的, 能够接受这种实现方式。另外, 请注意, 如果重复调用了一次 role.() 方法之后又重新调用, 我们之前已经把它们提取成为了局部变量了, 这样做可以避免再次去调用的情况发生, 特别是当那个方法执行起来花费的时间比较多的时候。最后一点, 根据用户那边提供的引用内容来看的话, 并没有找到可以对照着说的直接相关的东西在那里面, 所以嘛, 我们现在给出来的主要建议, 是完全按照代码优化方面通常大家遵守的那些一般原则来提出的。因此, 提供经优化后的代码实例展示, 在此情形之中假定开发所使用的编程语言为版本以及更高层级, 以下乃示例代码片段, 具体而言便是java语言编写的代码部分, 其中预设变量role已然被赋予了特定值, 接着执行相应操作, 即msg 家人们谁懂啊%s今天又来“炫富”了人家充值仙玉根本不用“充”字, 那叫“批量进货”别人是玩游戏, %s是来给系统送温暖的看见他背包里堆得像山一样高的仙玉, 再对比一下我口袋里那区区三瓜两枣, 不由得发出感叹, 真是人家比人家就要累得死去, 货物比较货物就得丢弃扔掉。如果使用的是较低版本的Java开发语言, 可以采用如下代码处理方式, 具体操作是将变量 role 赋予角色对象, 然后新建一个空的字符串构建器对象并赋值给变量 sb, 接着在 sb 中追加输入家人们谁懂啊这样的文字内容, 随后通过一系列链式调用继续拼接今天又用来炫耀财富的文本信息。对方进行仙玉充值这件事, 压根就不需要使用所谓充满辛苦意味的“充”这个字, 那纯粹叫作大规模的批量进货行为。其他玩家是在体验游戏过程, 而这个人则是专门过来给相关系统机构提供额外支持的。观察其背包内部所堆积如山一般数量庞大的仙玉资源, 再反观本人口袋中仅存的极为有限的那一点点微薄资财……只能叹息道, 人与人的比较往往会导致极度悲惨的下场, 物品与物品的比较则会直接导致被丢弃的命运。); msg sb.();这样优化后代码在性能避免了多次创建中间字符串和可读性使用或Text 上都有所提升。### Java 字符串构建优化分析#### 原始代码 家人们谁懂啊 role.() 今天又来“炫富”了人家充值仙玉完全不需要用“充”这个字, 那其实叫“批量进货”, 别人那是玩游戏, 他这是来给系统送温暖的, 你看他背包里堆满了像山一样的仙玉, 再看看我口袋里只有三瓜两枣, 唉, 人比人会导致死亡, 货比货则会被丢弃。在存在问题分析方面, 首先是指出了性能问题, 代码里使用加号来连续拼接字符串, 编译器在非常量表达式的场景下, 是会创建多个中间字符串对象的, 另外多次调用role后面的括号可能会造成额外的开销, 特别是在方法调用的成本较高的时候。其次是可读性问题表现为多行字符串被分割成了好几个片段, 而且像这样的换行符和中文引号之类的特殊字符, 被散乱地放在拼接的内容里面了。最后是可维护性问题, 如果要修改文案的排版格式, 就得到处去调整拼接的逻辑, 如果角色名需要重复出现的话, 就必须进行多次的替换操作。优化方案是使用java语言中的方式, 其中方案1是利用某种方式这是最佳选择的选项, 并且JDK的所有版本都支持这种做法, 具体语句是创建一个对象sb并初始化为新的形式, 接着往里面加上内容“家人们谁懂啊. (role.()).(“今天又开始大肆张扬地展示财富了”).(“别人往游戏里充仙玉, 那叫真正意义的充值”).(“他倒好”.( “那是批量进货”)(“别人玩游戏”).(role.()).(,).(“是专门去给系统送温暖的”。先把这个换行符弄明白, 然后把目光投向他背包里头那堆起来都像小山一样高的仙玉, 再回过头来瞧瞧我自己口袋里面所剩下的那些只值三瓜两枣的微薄资产, 这时候只能长长地发出一声叹息在心里感叹, 要是拿人和人之间去比较的话那简直是会让人活不下去的绝境, 如果是拿货物与货物之间进行相互对比的话那就等于是要被彻底抛弃处理掉的命运。% s 今天再次把那种展示财富的举动展现出来了。对于这个人来说, 向游戏里面投入仙玉这个行为, 完全不需要用到充值这两个字, 他的做法更像是在进行大批量地采购商品。别的人玩游戏是去享受乐趣, 而 % s 则是跑来给游戏官方系统提供资金支持, 送去温暖的。看到他背包里面的仙玉堆积得如同山岳一般沉重, 再回头看一下我自己的口袋, 里面只有那么一点点微不足道、不值当一提的零钱。这种巨大的反差让人感叹, 人与人之间的差距简直是天壤之别, 货物与货物的比较简直让原来的东西显得毫无价值, 仿佛要被遗弃一样。优化后的优势有, 第一是性能提升, 这包括减少中间字符串对象的创建, 还有消除重复方法调用, 在优化前后的执行效率方面, 从大O加括号n变成了大O加括号1。第二是性增强, 文本块能够保持原始格式的排版, 另外占位符那里用了百分号和小括号组合的写法, 来明确标识变量插入位置。第三是扩展性改进, 新增变量的时候只需要扩展小括号和点号的组合, 或者百分号加s的占位符就可以实现, 还支持把国际化资源文件集成进去。最佳实践建议有两条, 第一是当拼接次数大于等于五的时候优先选择用点号的方式来做, 遇到复杂字符串模板建议也使用这种方式。其次是频繁调用的场景下可以考虑复用对象池里的对象。
返回列表