面试题
以下类中,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
}
分享到:
相关推荐
- **输出集合函数**:此函数的时间复杂度为O(1),因为输出集合的操作是固定的。 - **输出补集函数**:时间复杂度为O(m*n),m为全集的大小,n为输入集合的大小。 - **输出交集函数**:时间复杂度为O(n^2),其中n为两...
此外,了解算法的时间复杂度和空间复杂度分析,有助于优化程序性能。 三、操作系统原理 操作系统是计算机系统的心脏,考生需要理解操作系统的五大功能:进程管理、内存管理、文件管理、设备管理和作业调度。深入...
3. **基本算法设计**:反转字符串的算法可以采用双指针法,这种方法的时间复杂度为O(n),其中n是字符串的长度。此外,还可以使用栈数据结构,将字符串逐个字符压入栈中,然后依次弹出,也能达到反转的效果。 4. **...
作者展示了如何在保持线性时间复杂度的同时,使用任意受限的存储空间维护这样的模型。 4. **后缀排序算法**:介绍了后缀排序的相关问题,这是构建后缀数组和块排序压缩的关键步骤。提出了一种改进算法,可以消除...
系统应支持生成详细的出入库单据,并能按照时间、操作类型等多种条件查询记录。 四、人员维护 人员维护功能主要用于管理操作系统的用户,包括员工信息的添加、修改和删除。每个用户都有特定的权限,比如只允许查看...
- 在旋转排序数组中找到最小元素,要求算法的时间复杂度为O(log n)。这是对二分查找算法应用的考察。 20. FindMinimuminRotatedSortedArrayII - 在含有重复元素的旋转排序数组中找到最小元素。这是一个需要处理...
2. **时空复杂度分析**:理解时间复杂度(Time Complexity)和空间复杂度(Space Complexity)对于优化算法效率至关重要。通过函数的增长速度和运行时间分析,可以预估算法在大数据量下的表现。 3. **团队建设**:...
9. **性能优化**:理解并应用时间复杂度和空间复杂度分析,减少算法的时间消耗和内存占用,提高代码效率。 10. **测试用例设计**:编写程序后,需要设计各种测试用例来验证代码的正确性,包括边界条件、异常情况和...
3. 时间复杂度分析:理论上分析了所提出的算法的时间复杂度,并证明它比现有的OT算法和CRDT算法具有更低的时间复杂度。 4. 实验评估:通过实验评估显示,该算法在性能上优于现有的OT算法和CRDT算法。 在智能大规模...
迭代法是最直观的方法,通过不断地自乘来达到目标指数,但其时间复杂度为O(b)。相比之下,快速幂算法更为高效,其时间复杂度降为O(log b),显著提高了计算速度。 快速幂算法的基本思想是利用幂的乘法规则`a^(2n) = ...
PTA-B 1001-1015 参考答案是一份针对PTA(Programming ...此外,还能提高解决实际问题的能力,如数据结构的选择、时间空间复杂度优化等。这份参考答案资源是编程学习者宝贵的实践材料,可以帮助他们在实践中不断进步。
在"ACM题目分析"中,每个题目都会提供详细的解题思路、算法实现和时间复杂度分析,帮助参赛者理解如何将抽象问题转化为具体代码,并优化解决方案。此外,还会讲解如何避免常见错误和陷阱,提高解题速度和正确率。 ...
因此,对next数组求值方法的改进具有相当的实用价值,可以在保持算法时间复杂度不变的情况下,降低算法的空间复杂度,或是进一步减少计算时间。 在具体实现上,李桂玲教授使用VC++语言,这是一个功能强大的编程语言...
在乙级题目的代码中,动态规划的应用尤为常见,它能帮助优化时间复杂度,避免重复计算。 4. **图论**:部分题目会涉及到图的构建和操作,如最小生成树、拓扑排序、最短路径等。在这些代码中,可以学习如何使用邻接...
为了提高性能,我们可以使用Set数据结构,它的`contains()`方法的时间复杂度为O(1),能显著减少查找时间。例如: ```java import java.util.ArrayList; import java.util.HashSet; import java.util.Set; public ...
- **度量**:通常采用大O符号表示,如O(1)表示常数时间复杂度,O(n)表示线性时间复杂度。 - **空间与时间的背反**:有时为了获得更好的时间性能,可能需要消耗更多的空间资源;反之亦然。 - **以空间换时间**:...
- 归并排序:稳定且时间复杂度始终为O(nlogn),但空间复杂度较高。 **2. 二分查找** - 在有序数组中查找特定元素的位置,时间复杂度为O(logn)。 **3. 高精度计算** - 包括加法、减法、乘法和除法。这些方法通常...
解释:归并排序的时间复杂度是nlogn。 13. 下面不是计算思维的特征的是: 知识点:计算思维 解释:计算思维的特征是概念化、数学与工程思维的融合。 14. 执行下面操作后,list2的值是: 知识点:python基本数据...