`
337240552
  • 浏览: 3424 次
  • 性别: Icon_minigender_1
  • 来自: 云南
最近访客 更多访客>>
社区版块
存档分类
最新评论

论String操作时间复杂度

阅读更多
面试题
以下类中,method1和method2的时间复杂度一样吗?为什么。
public class Test {
	public static final int MB = 1024 * 1024;
	public static final long TIMES = 500000000L;

	public static void main(String[] args) throws InterruptedException {
		method1();
		method2();
	}
//从字节码来看,method1重复new StringBuilder
然后append,显然不高效。这里排除jit优化。
	public static void method1() {
		String s = "";
		for (int i = 0; i < 100; i++) {
			s += "a";
		}

		System.out.println(s);
	}

	public static void method2() {
		// //b
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < 100; i++) {
			sb.append("a");
		}
		System.out.println(sb.toString());
	}

}

我当时的回答是应该一样,因为我实在找不出说明他们不一样的地方。但是面试官这么问肯定有原因的,我只是从效率方面来分析,比如说method1会通过StringBuilder来做,没有后面method2好。后来面试官纠正了提问,说从时间复杂度来考虑。我直接跟他说了,我只能看出是一样的,可能method2会更好些。面试官好像不是很满意。

回来我从源码着手看,感觉不靠谱,后来看到有人分析用字节码来看。可以看到编译器怎么翻译的。经过证实,跟我的想法一样。字节码如下:
Compiled from "Test.java"
public class Test extends java.lang.Object{
public static final int MB;

public static final long TIMES;

public Test();
  Code:
   0:	aload_0
   1:	invokespecial	#16; //Method java/lang/Object."<init>":()V
   4:	return

public static void main(java.lang.String[])   throws java.lang.InterruptedException;
  Code:
   0:	invokestatic	#27; //Method method1:()V
   3:	invokestatic	#30; //Method method2:()V
   6:	return

public static void method1();
  Code:
   0:	ldc	#35; //String 
   2:	astore_0
   3:	iconst_0
   4:	istore_1
   5:	goto	31
   8:	new	#37; //class java/lang/StringBuilder
   11:	dup
   12:	aload_0
   13:	invokestatic	#39; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
   16:	invokespecial	#45; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
   19:	ldc	#48; //String a
   21:	invokevirtual	#50; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   24:	invokevirtual	#54; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   27:	astore_0
   28:	iinc	1, 1
   31:	iload_1
   32:	bipush	100
   34:	if_icmplt	8
   37:	getstatic	#58; //Field java/lang/System.out:Ljava/io/PrintStream;
   40:	aload_0
   41:	invokevirtual	#64; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   44:	return

public static void method2();
  Code:
   0:	new	#37; //class java/lang/StringBuilder
   3:	dup
   4:	invokespecial	#73; //Method java/lang/StringBuilder."<init>":()V
   7:	astore_0
   8:	iconst_0
   9:	istore_1
   10:	goto	23
   13:	aload_0
   14:	ldc	#48; //String a
   16:	invokevirtual	#50; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   19:	pop
   20:	iinc	1, 1
   23:	iload_1
   24:	bipush	100
   26:	if_icmplt	13
   29:	getstatic	#58; //Field java/lang/System.out:Ljava/io/PrintStream;
   32:	aload_0
   33:	invokevirtual	#54; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   36:	invokevirtual	#64; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   39:	return

}
分享到:
评论

相关推荐

    集合的运算:交、并、补(难度系数:1.2)

    - **输出集合函数**:此函数的时间复杂度为O(1),因为输出集合的操作是固定的。 - **输出补集函数**:时间复杂度为O(m*n),m为全集的大小,n为输入集合的大小。 - **输出交集函数**:时间复杂度为O(n^2),其中n为两...

    软件设计师考试 历年试题

    此外,了解算法的时间复杂度和空间复杂度分析,有助于优化程序性能。 三、操作系统原理 操作系统是计算机系统的心脏,考生需要理解操作系统的五大功能:进程管理、内存管理、文件管理、设备管理和作业调度。深入...

    JAVA课程设计(论文) 反转字符串

    3. **基本算法设计**:反转字符串的算法可以采用双指针法,这种方法的时间复杂度为O(n),其中n是字符串的长度。此外,还可以使用栈数据结构,将字符串逐个字符压入栈中,然后依次弹出,也能达到反转的效果。 4. **...

    Structures Of String Matching And Data Compression

    作者展示了如何在保持线性时间复杂度的同时,使用任意受限的存储空间维护这样的模型。 4. **后缀排序算法**:介绍了后缀排序的相关问题,这是构建后缀数组和块排序压缩的关键步骤。提出了一种改进算法,可以消除...

    仓库管理系统源码20130424

    系统应支持生成详细的出入库单据,并能按照时间、操作类型等多种条件查询记录。 四、人员维护 人员维护功能主要用于管理操作系统的用户,包括员工信息的添加、修改和删除。每个用户都有特定的权限,比如只允许查看...

    coding-interview-in-java.pdf

    - 在旋转排序数组中找到最小元素,要求算法的时间复杂度为O(log n)。这是对二分查找算法应用的考察。 20. FindMinimuminRotatedSortedArrayII - 在含有重复元素的旋转排序数组中找到最小元素。这是一个需要处理...

    浙江大学ACM培训资料

    2. **时空复杂度分析**:理解时间复杂度(Time Complexity)和空间复杂度(Space Complexity)对于优化算法效率至关重要。通过函数的增长速度和运行时间分析,可以预估算法在大数据量下的表现。 3. **团队建设**:...

    山师oj部分题解

    9. **性能优化**:理解并应用时间复杂度和空间复杂度分析,减少算法的时间消耗和内存占用,提高代码效率。 10. **测试用例设计**:编写程序后,需要设计各种测试用例来验证代码的正确性,包括边界条件、异常情况和...

    智能大规模协作编辑系统的字符串式CRDT算法

    3. 时间复杂度分析:理论上分析了所提出的算法的时间复杂度,并证明它比现有的OT算法和CRDT算法具有更低的时间复杂度。 4. 实验评估:通过实验评估显示,该算法在性能上优于现有的OT算法和CRDT算法。 在智能大规模...

    高精度幂次方计算 C++实现

    迭代法是最直观的方法,通过不断地自乘来达到目标指数,但其时间复杂度为O(b)。相比之下,快速幂算法更为高效,其时间复杂度降为O(log b),显著提高了计算速度。 快速幂算法的基本思想是利用幂的乘法规则`a^(2n) = ...

    PTA-B 1001-1015 参考答案

    PTA-B 1001-1015 参考答案是一份针对PTA(Programming ...此外,还能提高解决实际问题的能力,如数据结构的选择、时间空间复杂度优化等。这份参考答案资源是编程学习者宝贵的实践材料,可以帮助他们在实践中不断进步。

    ACM试题 实例分析 含很多题目

    在"ACM题目分析"中,每个题目都会提供详细的解题思路、算法实现和时间复杂度分析,帮助参赛者理解如何将抽象问题转化为具体代码,并优化解决方案。此外,还会讲解如何避免常见错误和陷阱,提高解题速度和正确率。 ...

    一种改进的KMP模式匹配算法 (2009年)

    因此,对next数组求值方法的改进具有相当的实用价值,可以在保持算法时间复杂度不变的情况下,降低算法的空间复杂度,或是进一步减少计算时间。 在具体实现上,李桂玲教授使用VC++语言,这是一个功能强大的编程语言...

    PAT乙级题目的41个代码

    在乙级题目的代码中,动态规划的应用尤为常见,它能帮助优化时间复杂度,避免重复计算。 4. **图论**:部分题目会涉及到图的构建和操作,如最小生成树、拓扑排序、最短路径等。在这些代码中,可以学习如何使用邻接...

    实现多个数组的数据过滤

    为了提高性能,我们可以使用Set数据结构,它的`contains()`方法的时间复杂度为O(1),能显著减少查找时间。例如: ```java import java.util.ArrayList; import java.util.HashSet; import java.util.Set; public ...

    J2EE开发全程实录PDF J2EE开发全程实录PDF

    - **度量**:通常采用大O符号表示,如O(1)表示常数时间复杂度,O(n)表示线性时间复杂度。 - **空间与时间的背反**:有时为了获得更好的时间性能,可能需要消耗更多的空间资源;反之亦然。 - **以空间换时间**:...

    算法竞赛入门基础篇(个人整理)

    - 归并排序:稳定且时间复杂度始终为O(nlogn),但空间复杂度较高。 **2. 二分查找** - 在有序数组中查找特定元素的位置,时间复杂度为O(logn)。 **3. 高精度计算** - 包括加法、减法、乘法和除法。这些方法通常...

    上海交大程序的设计python期末考试题.docx

    解释:归并排序的时间复杂度是nlogn。 13. 下面不是计算思维的特征的是: 知识点:计算思维 解释:计算思维的特征是概念化、数学与工程思维的融合。 14. 执行下面操作后,list2的值是: 知识点:python基本数据...

Global site tag (gtag.js) - Google Analytics