首页 > 其他分享 >字符串拼接【面试题】

字符串拼接【面试题】

时间:2023-04-12 22:09:11浏览次数:33  
标签:lang Ljava 面试题 java String StringBuilder 拼接 字符串 Method


先来看一段代码

public class Test {
public String method1() {
        String ret = "";
        for(int i=0;i<100000;i++){
            ret=ret+"ok";
        }
return ret;
    }
public String method2() {
        StringBuilder ret = new StringBuilder("");
        for(int i=0;i<100000;i++){
            ret.append("ok");
        }
return ret.toString();
    }
}

都知道method1的性能会比method2的性能差。

那么理由是什么理由呢?

下面咱们来证明一下:

先编译代码,然后找到Test.class文件,然后执行命令

javap -verbose Test.class >tt.txt

然后打开tt.txt

public java.lang.String method1();
  descriptor: ()Ljava/lang/String;
  flags: ACC_PUBLIC
  Code:
    stack=2, locals=3, args_size=1
       0: ldc           #2                  // String
       2: astore_1
       3: iconst_0
       4: istore_2
       5: iload_2
       6: sipush        1000
       9: if_icmpge     38 //for循环
      12: new           #3 创建一个StringBuilder对象// class java/lang/StringBuilder
      15: dup
      16: invokespecial #4  // Method java/lang/StringBuilder."<init>":()V
      19: aload_1
      20: invokevirtual #5  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      23: ldc           #6   // String ok
      25: invokevirtual #5   // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      28: invokevirtual #7   // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      31: astore_1
      32: iinc          2, 1
      35: goto          5
      38: aload_1
      39: areturn

可以看出每次循环一次就new一个对象。

再来看看method2

public java.lang.String method2();
  descriptor: ()Ljava/lang/String;
  flags: ACC_PUBLIC
  Code:
    stack=3, locals=3, args_size=1
       0: new  #3 创建一个StringBuilder对象// class java/lang/StringBuilder
       3: dup
       4: ldc           #2                  // String
       6: invokespecial #8                  // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
       9: astore_1
      10: iconst_0
      11: istore_2
      12: iload_2
      13: sipush        1000
      16: if_icmpge     32 //循环
      19: aload_1
      20: ldc           #6                  // String ok
      22: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      25: pop
      26: iinc          2, 1
      29: goto          12
      32: aload_1
      33: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      36: areturn
    LineNumberTable:

有上面看出method2值创建了一个StringBuilder对象。

method1要创建n多个对象,而method2只需要创建一个对象,明显method2方式效率更高,推荐使用method2(StringBuilder)方式

但是如果在多线程环境下使用的话,推荐StringBuffer,因为StringBuffer是线程安全的。

字符串拼接【面试题】_java

StringBuffer为什么线程安全,还不就是在方法上加了一个synchronized修饰罢了。

字符串拼接【面试题】_Test_02

标签:lang,Ljava,面试题,java,String,StringBuilder,拼接,字符串,Method
From: https://blog.51cto.com/u_11702014/6186296

相关文章

  • 2-面试题:python
    1、python对象的比较和拷贝?答:'=='操作符比较对象之间的值是否相等;'is'操作符比较的是对象的身份标识是否相等,即它们是否是同一个对象,是否指向同一个内存地址;比较操作符'is'的速度效率,通常优于'==';浅拷贝和深拷贝:浅拷贝,将原对象或原数组的引用直接赋值给新对象、新数组,新对象/......
  • 面试题:python
    列表和元组的区别列表是动态的,长度可变,可以对元素进行增、删、改操作;列表存储空间略大于元组,性能略逊于元组;元组是静态的,长度大小固定,不可以对元素进行增、删、改操作;元组相对于列表更加轻量级,性能稍优;字典和集合字典是有序的数据结构,而集合是无序的,其内部的哈希表存储结构,......
  • 7659: 计算字符串距离 动态规划
    描述 对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为:   修改一个字符(如把“a”替换为“b”);删除一个字符(如把“traveling”变为“travelng”)。比如对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的......
  • 使用 InterpolatedString 减少字符串拼接的 GC
    原视频链接考虑到Unity准备在2024年前后,推出基于dotnetRuntime的版本,本篇文章也标记为Unity分类,等后面Unity准备好之后,再对新版的客户端进行改造在日常开发过程中,字符串的拼接通常会占用大量的GC,通常拼接字符串我们会使用如下几种方法1.1+"/"+2+"/"+32......
  • 哈希表:剑指 Offer 48. 最长不含重复字符的子字符串
    题目描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。   提示:s.length<=40000 思路:双指针(滑动窗口)+哈希表:   复杂度分析:时间复杂度O(N):其中N为字符串长度,动态规划需遍历计算dp列表。空间复杂度O(1......
  • 前端面试题
    一、什么是JavaScript? 二、JavaScript中的hoisting是什么?  三、什么是闭包四、说一说this指向(普通函数、箭头函数)   五、说几个未知宽高元素水平垂直居中方法    6、说一说cookiesessionStoragelocalStorage是什么,有什么区别?7、说一说Vue2.0双向......
  • java 逗号拼接字符串
    逗号拼接字符串可以使用String类的静态方法join()来实现这个功能,示例代码如下:```javapublicclassPhoneNumbers{publicstaticvoidmain(String[]args){StringphoneNumber1="18801083588";StringphoneNumber2="15709106355";Stri......
  • java判断字符串是否包含汉字工具类
       /***判断字符串中是否包含中文**@paramstr待校验字符串*@return是否为中文*@warn不能校验是否为中文标点符号*/publicstaticbooleanisContainsChinese(Stringstr){if(str==null){returnfalse;}P......
  • UVa 489 Hangman Judge (模拟&字符串匹配)
    489-HangmanJudgeTimelimit:3.000secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=94&page=show_problem&problem=430In``HangmanJudge,''youaretowriteaprogramthatjudgesaseriesofH......
  • 22.text--调整字符串
    调整字符串给定两个字符串,A和BA的旋转操作就是将A最左边的字符移动到最右边例如:若A="abcde",在移动一次之后结果就是"bcdea"如果在若干次调整操作之后,A能变成B,那么返回True如果不能匹配成功,则返回falsepublicstaticvoidmain(String[]args){StringA="abcde";......