精华内容
下载资源
问答
  • java字符连接字符串数组 最近有人问我这个问题–在Java中使用+运算符连接字符串是否对性能不利? 这让我开始思考Java中连接字符串的不同方法,以及它们如何相互对抗。 这些是我要研究的方法: 使用+运算符 ...

    java字符连接字符串数组

    最近有人问我这个问题–在Java中使用+运算符连接字符串是否对性能不利?

    这让我开始思考Java中连接字符串的不同方法,以及它们如何相互对抗。 这些是我要研究的方法:

    1. 使用+运算符
    2. 使用StringBuilder
    3. 使用StringBuffer
    4. 使用String.concat()
    5. 使用String.joinString.join新增功能)

    我还尝试了String.format()但是它是如此缓慢,以至于我暂时不在本文中介绍。

    在继续之前,我们应该分离两个用例:

    1. 将两个字符串串联在一起作为一个调用,例如在日志消息中。 由于这只是一个电话,您可能会认为性能几乎不是问题,但结果仍然很有趣,并且可以阐明该主题。
    2. 在一个循环中连接两个字符串。 在这里,性能更是一个问题,尤其是当循环很大时。

    我最初的想法和问题如下:

    1. +运算符是用StringBuilder实现的,因此至少在连接两个String的情况下,它应产生与StringBuilder类似的结果。 幕后到底发生了什么?
    2. 在所有类的设计目的都是为了连接Strings并取代StringBuffer之后,StringBuilder应该是最有效的方法。 但是,与String.concat()相比,创建StringBuilder的开销是多少?
    3. StringBuffer是连接字符串的原始类–不幸的是,其方法是同步的。 确实不需要同步,随后它被不同步的StringBuilder代替。 问题是,JIT是否优化了同步?
    4. String.concat()应该适用于2个字符串,但是在循环中是否可以正常工作?
    5. String.join()比StringBuilder具有更多的功能,如果我们指示它使用空的定界符来连接String,它将如何影响性能?

    我要解决的第一个问题是+运算符的工作方式。 我一直都知道它在幕后使用了StringBuilder,但是要证明这一点,我们需要检查字节码。

    如今 ,查看字节码最简单的方法是使用JITWatch ,这是一个非常出色的工具,旨在了解JIT如何编译您的代码。 它有一个很棒的视图,您可以在其中与字节码(如果要转到该级别,还可以是机器码)并排查看源代码。

    屏幕截图2015-02-17 at 17.27.46

    这是一个非常简单的方法plus2()的字节码,我们可以看到确实在第6行上创建了一个StringBuilder,并附加了变量a(第14行)和b(第18行)。

    我认为将其与StringBuffer的手工使用进行比较会很有趣,因此我创建了另一个方法build2(),结果如下。

    屏幕截图2015年2月17日在17.31.37

    此处生成的字节码不如plus()方法那么紧凑。 StringBuilder存储在变量高速缓存中(第13行),而不是仅留在堆栈上。 我不知道为什么会这样,但是JIT也许可以做到这一点,我们将不得不看看时机如何。

    无论如何,如果用plus运算符和StringBuilder将2个字符串连接在一起的结果显着不同,那将是非常令人惊讶的。

    我写了一个小型的JMH测试来确定不同方法的执行方式。 首先让我们看一下两个Strings测试。 参见下面的代码:

    package org.sample;
    
    import org.openjdk.jmh.annotations.*;
    import org.openjdk.jmh.infra.Blackhole;
    
    import java.util.UUID;
    import java.util.concurrent.TimeUnit;
    
    @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
    @Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
    @Fork(1)
    @State(Scope.Thread)
    public class LoopStringsBenchmark {
    
        private String[] strings;
    
        @Setup
        public void setupTest(){
            strings = new String[100];
            for(int i = 0; i<100; i++) {
                strings[i] = UUID.randomUUID().toString().substring(0, 10);
            }
        }
    
        @Benchmark
        public void testPlus(Blackhole bh) {
            String combined = "";
            for(String s : strings) {
                combined = combined + s;
            }
            bh.consume(combined);
        }
    
        @Benchmark
        public void testStringBuilder(Blackhole bh) {
            StringBuilder sb = new StringBuilder();
            for(String s : strings) {
                sb.append(s);
            }
            bh.consume(sb.toString());
        }
    
        @Benchmark
        public void testStringBuffer(Blackhole bh) {
            StringBuffer sb = new StringBuffer();
            for(String s : strings) {
                sb.append(s);
            }
            bh.consume(sb.toString());
        }
    
        @Benchmark
        public void testStringJoiner(Blackhole bh) {
            bh.consume(String.join("", strings));
        }
    
        @Benchmark
        public void testStringConcat(Blackhole bh) {
            String combined = "";
            for(String s : strings) {
                combined.concat(s);
            }
            bh.consume(combined);
        }
    }

    结果如下:

    屏幕+截图+ 2015-02-17 + at + 17.41.26

    显而易见的赢家是String.concat()。 毫不奇怪,因为它不必为每次调用创建StringBuilder / StringBuffer而付出性能损失。 虽然确实需要每次都创建一个新的String(这将在以后变得很重要),但是对于连接两个Sting的非常简单的情况,它更快。

    另一点是,尽管产生了额外的字节码,但正如我们预期的那样,plus和StringBuilder是等效的。 StringBuffer仅比StringBuilder慢一点,这很有趣,这表明JIT必须做一些魔术来优化同步。

    下一个测试将创建一个100个字符串的数组,每个字符串包含10个字符。 基准测试比较了将100个字符串连接在一起的不同方法所花费的时间。 参见下面的代码:

    这次的结果看起来完全不同:

    屏幕截图2015-02-17 at 17.54.37

    在这里,加号方法确实遭受了损失。 每当您遍历循环时,创建StringBuilder的开销就会减少。 您可以在字节码中清楚地看到这一点:

    屏幕截图2015-02-17 at 17.59.46

    您可以看到每次执行循环时都会创建一个新的StringBuilder(第30行)。 JIT应该发现这一点并能够对其进行优化是有争议的,但是事实并非如此,使用+变得非常慢。

    同样,StringBuilder和StringBuffer的性能完全相同,但是这次它们都比String.concat()快。 String.concat()在循环的每次迭代中创建新的String所付出的代价最终会增加,并且StringBuilder变得更加高效。

    给定可以添加到此方法的所有其他功能,String.join()的效果非常好,但是,正如预期的那样,对于纯串联而言,它不是最佳选择。

    摘要

    如果要在单行代码中连接字符串,则我将使用+运算符,因为它最易读,并且对于单个调用而言,性能实际上并不重要。 还要提防String.concat(),因为您几乎肯定会需要执行空值检查 ,而其他方法则不需要这样做。

    在循环中连接字符串时,应使用StringBuilder。 您可以使用StringBuffer,但我不一定在所有情况下都信任JIT来像基准测试中那样高效地优化同步。

    我的所有结果都是使用JMH取得的,并且都带有通常的健康警告

    翻译自: https://www.javacodegeeks.com/2015/02/optimum-method-concatenate-strings-java.html

    java字符连接字符串数组

    展开全文
  • Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。 join()方法语法: str.join(sequence) #!/usr/bin/python # -*- coding: UTF-8 -*- #例子1 str = &amp;amp;quot;-&amp;amp...

    Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串
    join()方法语法:
    str.join(sequence)

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    #例子1 
    str = "-";
    seq = ("a", "b", "c"); # 字符串序列
    print str.join( seq );
    # 输出 a-b-c
    
    #例子2
    str1 = '+'
    print str1.join('a','b','c')  #报错,必须是序列
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    TypeError: join() takes exactly one argument (3 given)
    
    print str1.join(('a','b','c')) # 正确,使成为序列(元祖、列表都可以)
    # 输出 a+b+c
    
    #例子3
    user = 'xiaoming'
    sex = 'male'
    key = ','.join([user, sex])
    print(key)
    # 输出 xiaoming,male
    展开全文
  • 题目:从键盘输入两个字符串 a 和 b,要求不用库函数 strcat 把串 b 的前五个字符连接到串 a 中;如果 b 的长度小于 5,则把 b 的所 有元素都连接到 a 中。 分析:首先将字符串a指向最后一个位置,循环b数组给a赋值...

    题目:从键盘输入两个字符串 a b,要求不用库函数 strcat 把串 b 的前五个字符连接到串 a 中;如果 b 的长度小于 5,则把 b 的所 有元素都连接到 a 中。

    分析:首先将字符串a指向最后一个位置,循环b数组给a赋值。

    代码如下:

    int main(){
    	char a[50],b[50];
    	int i=0;
    	gets(a);gets(b);
    	while(a[i]) i++;
    	for(int j = 0; j<5; j++)
    		a[i++] = b[j];
    	a[i]='\0';
    	printf("%s",a);
    
    }
    

    运行结果:

    展开全文
  • Excel字符连接(concat)

    千次阅读 2016-12-09 16:40:17
    Excel连接字符串有两个比较常用的方法。 1.concat函数 2.”&”连接

      Excel连接字符串有两个比较常用的方法。
    1.concat函数
    Excel>字符串>连接


    2.”&”连接符
    Excel>字符串>连接


    展开全文
  • sql:concat 字符连接

    万次阅读 多人点赞 2018-12-24 15:30:53
    1、功能:和concat()一样,将多个字符连接成一个字符串,但是可以一次性指定分隔符~(concat_ws就是concat with separator) 2、语法:concat_ws(separator, str1, str2, ...) 说明:第一个参数指定分隔符...
  • oracle 字符连接函数 concat 与 || ?

    千次阅读 2019-06-04 10:53:30
    oracle中使用concat,concat只能连接两个字符,而“||”可以连接多个字符。 -concat只能连接两个字符串,连接多个需要嵌套调用不方便 如下 用concat时: ①.sql>select concat(‘aa’,‘bb’) from test; 结果; ...
  • /*CONCAT只能连接两个字符串The syntax for the concat function is:concat( string1, string2 )string1 is the first string to concatenate.string2 is the second string to concatenate.*/...
  • string str = string.Join(".", array);//array为数组
  • import org.apache.commons.lang3.StringUtils; StringUtils.join(useridList.toArray(), ",")
  • 题目:宏定义高级应用----字符连接##   看到一哥们在TI DSP程序中写了如下宏定义:  #define ADDR(x) ((volatile unsigned int *)(0x900##x##0004))   很不解“ ## ”是干吗用的,于是问之,真是三人行...
  • string[] array = { "aa", "bb", "cc", "11", "22" };//数组初始化 string str = string.Join(".", array);//array为数组
  • EXCEL将多个单元格由固定字符连接

    千次阅读 2014-05-30 15:10:08
    想要做成的效果图:
  • 字符连接

    千次阅读 2018-02-08 14:23:27
    不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来 输入描述: 每一行包括两个字符串,长度不超过100。 输出描述: 可能有多组测试数据,对于每组数据, 不借用任何字符串库函数...
  • Java连接 MySQL8.0数据库连接字符

    千次阅读 2020-12-16 18:24:27
    Java连接 MySQL8.0数据库连接字符
  • 给出两个字符串, 你需要修改第一个字符串,将所有与第二个字符串中相同的字符删除, 并且第二个字符串中不同的字符与第一个字符串的不同字符连接 样例 - 样例 1: 输入 : s1 = "aacdb", s2 = "gafd" 输出 : "cbgf" -...
  • C# 字符连接

    千次阅读 2019-06-13 13:50:53
    C#字符连接常用的四种方式:StringBuilder、+、string.Format、List。 1.+的方式 string sql = “update tableName set int1=” + int1.ToString() + “,int2=” + int2.ToString() + “,int3=” + int3.ToString...
  • php字符连接 字符串相加

    千次阅读 2019-07-20 23:21:01
    很多时候我们需要将几个字符连接起来显示,在PHP中,字符串之间使用“点”来连接,也就是英文中的句号”.”,具体使用方式如下: [url=]复制代码[/url] 代码如下: <?php //定义字符串 $str1 = "Hello Worl...
  • 编写函数void fun(char *s1, char *s2, int n)将s2所指字符串的前n个字符连接到s1所指向的字符串后面。主函数输入两个字符串及n,调用函数完成连接过程,输出连接结果。
  • java字符连接

    万次阅读 2018-09-08 09:37:43
    由于String是不可变对象(final),所以,对字符串进行连接、替换操作时,String对象总是会生成新的对象。所以连接和替换时性能很差。 String常量字符串的累加 比如我们使用如下代码进行字符连接: String ...
  • MongoDB连接字符

    千次阅读 2014-03-29 13:00:19
    MongoDB连接字符串常用格式 mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[database][?options]] 备注:字符连接不区分大小写,并非所有MongoDB驱动都支持完整的连接字符...
  • VBA巧妙处理字符连接

    千次阅读 2020-04-05 11:28:35
    字符连接是经常需要用到的功能,在VBA代码中可以使用`+ `也可以使用`&`运算符,似乎是简单的不能再简单的功能,但是实际使用过程中也是有一些技巧的。
  • Python字符连接的5种方法

    千次阅读 2018-06-04 15:20:22
    总结了一下Python字符连接的5种方法: 加号 第一种,有编程经验的人,估计都知道很多语言里面是用加号连接两个字符串,Python里面也是如此直接用 “+” 来连接两个字符串; print 'Python' + ‘Tab’ 结果...
  • 编写一个函数fun实现字符连接功能(不使用strcat函数)。 主函数输入两个字符串,调用函数,输出连接后的字符串 输入说明:共两行,每一行输入一个字符串 输出说明:共一行,输出连接后的字符串 输入示例:abcd ...
  • Lua源码笔记--字符连接

    千次阅读 2019-05-08 14:47:03
    Lua源码笔记–字符连接 文章目录Lua源码笔记--字符连接1 Lua语法糖 ..2 table.concat3 string.format4 string.rep5. 总结 Lua字符连接大概有四种方式: Lua语法糖 ‘…’ table.concat string.format string....
  • MySQL连接字符串,可以自定义连接字符集编码 jdbc:mysql://localhost:3306/${database}?useUnicode=true&characterEncoding=UTF-8
  • c语言实现字符连接

    千次阅读 2020-12-20 20:47:27
    一、假设有两个字符串"abc"和"1234",将它们连接起来并输出 #include<stdio.h> #include<string.h> int main() { char a[10]="abc"; char b[4]="1234"; int i,la; la=strlen(a); for(i=0;i<4;...
  • //输出的结果中有错误 //如输入china,chinese,输出chinachiΓFnese; #include using namespace std; void link(char str1[],char str2[]) ... cout把str1与str2连接后的字符串是"; return 0; }
  • 字符串正反连接

    千次阅读 2018-01-05 00:09:23
    所给字符串正序和反序连接,形成新串并输出 输入: 任意字符串(长度) 123abc 输出: 字符串正序和反序连接所成的新字符串 123abccba321 继续巧妙的使用str类的倒序函数reverse#include #include ...
  • mysql连接字符集设置

    千次阅读 2018-12-14 09:12:41
    使用set names 字符集名,每次连接数据库都要执行一次。 如:set names 'gbk'; 永久生效 在my.ini中设置linux是my.cnf [mysql] default-character-set=gbk 显示当前客户端的字符集 show variables like 'character_...
  • Java字符连接的性能问题

    千次阅读 2016-09-07 09:57:53
    Java中使用+作为字符连接符,它是把多个字符串合并成一个字符串的方便途径。对于单独一行的输出、或者较小的大小固定对象,使用连接符方便且合适。但是对于大规模的场景,字符连接符变得有些不合时宜。 以连接N...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,585,987
精华内容 634,394
关键字:

字符连接