热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javac#string_Java(C#)String类型的比较

分析一下字节码就知道了。CompiledfromStringDemo.java(version1.5:49.0,superbit)publicclasscollections.St

分析一下字节码就知道了。

// Compiled from StringDemo.java (version 1.5 : 49.0, super bit)

public class collections.StringDemo {

// Method descriptor #6 ()V

// Stack: 1, Locals: 1

public StringDemo();

0  aload_0 [this]

1  invokespecial java.lang.Object() [8]

4  return

Line numbers:

[pc: 0, line: 6]

Local variable table:

[pc: 0, pc: 5] local: this index: 0 type: collections.StringDemo

// Method descriptor #15 ([Ljava/lang/String;)V

// Stack: 5, Locals: 4

public static void main(java.lang.String[] args);

0  ldc [16]

2  astore_1 [str]

3  ldc [18]

5  astore_2 [str2]

6  ldc [20]

8  astore_3 [str3]

9  getstatic java.lang.System.out : java.io.PrintStream [22]

12  aload_1 [str]

13  new java.lang.StringBuilder [28]

16  dup

17  aload_2 [str2]

18  invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [30]

21  invokespecial java.lang.StringBuilder(java.lang.String) [36]

24  aload_3 [str3]

25  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [39]

28  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [43]

31  if_acmpne 38

34  iconst_1

35  goto 39

38  iconst_0

39  invokevirtual java.io.PrintStream.println(boolean) : void [47]

42  getstatic java.lang.System.out : java.io.PrintStream [22]

45  aload_1 [str]

46  new java.lang.StringBuilder [28]

49  dup

50  ldc [18]

52  invokespecial java.lang.StringBuilder(java.lang.String) [36]

55  aload_3 [str3]

56  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [39]

59  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [43]

62  if_acmpne 69

65  iconst_1

66  goto 70

69  iconst_0

70  invokevirtual java.io.PrintStream.println(boolean) : void [47]

73  getstatic java.lang.System.out : java.io.PrintStream [22]

76  aload_1 [str]

77  ldc [16]

79  if_acmpne 86

82  iconst_1

83  goto 87

86  iconst_0

87  invokevirtual java.io.PrintStream.println(boolean) : void [47]

90  return

Line numbers:

[pc: 0, line: 8]

[pc: 3, line: 9]

[pc: 6, line: 10]

[pc: 9, line: 11]

[pc: 42, line: 12]

[pc: 73, line: 13]

[pc: 90, line: 15]

Local variable table:

[pc: 0, pc: 91] local: args index: 0 type: java.lang.String[]

[pc: 3, pc: 91] local: str index: 1 type: java.lang.String

[pc: 6, pc: 91] local: str2 index: 2 type: java.lang.String

[pc: 9, pc: 91] local: str3 index: 3 type: java.lang.String

}

现在一个个的分析:

ldc表示将int, float或String型常量值从常量池中推送至栈顶.

astore表示将栈顶引用型数值存入指定本地变量

那么

ldc [16]

2  astore_1 [str]

表示 abc 在运行时常量池中间取出,并且将引用赋给str变量。

同理,str1,str2都一样。

那么这就说明一个问题:

类似于String str1="dddd"说明"dddd"字符串存在运行时常量池中,而不是存在堆中间。

然后看s2+s3:

new java.lang.StringBuilder [28]

16  dup

17  aload_2 [str2]

18  invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [30]

21  invokespecial java.lang.StringBuilder(java.lang.String) [36]

24  aload_3 [str3]

25  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [39]

28  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [43]

java运算符重载了加法。也就是字符串的加号是通过StringBuilder的append和toString来完成的。查看toString的源码:

public String toString() {

// Create a copy, don't share the array

return new String(value, 0, count);

}

很显然是新生成了一个String,引用地址不一样,那么"=="判断当然为false。

然后看

"a" + str3

ldc [18]

52  invokespecial java.lang.StringBuilder(java.lang.String) [36]

55  aload_3 [str3]

56  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [39]

59  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [43]

62  if_acmpne 69

65  iconst_1

```

不用看。既然是StringBuilder那么也一定是false了、

最后"a"+"bc"

```java

iconst_0

70  invokevirtual java.io.PrintStream.println(boolean) : void [47]

73  getstatic java.lang.System.out : java.io.PrintStream [22]

76  aload_1 [str]

77  ldc [16]

79  if_acmpne 86

说明,对于这种情况,java编译器做了优化。直接存储在运行时常量池中间。那么当然为true。

那么C#。。。。不知道他们运行机制是咋样的。



推荐阅读
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 本文探讨了如何在 Java 中将多参数方法通过 Lambda 表达式传递给一个接受 List 的 Function。具体分析了 `OrderUtil` 类中的 `runInBatches` 方法及其使用场景。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 本文主要探讨了Java中处理ActionEvent事件的接口,以及一些常见的编程问题和解决方案,包括方法重载、成员变量访问、镜片质量检测等。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 在 Java 中,`join()` 方法用于使当前线程暂停,直到指定的线程执行完毕后再继续执行。此外,`join(long millis)` 方法允许当前线程在指定的毫秒数后继续执行。 ... [详细]
  • 2022年7月20日:关键数据与市场动态分析
    2022年7月20日,本文对当日的关键数据和市场动态进行了深入分析。主要内容包括:1. 关键数据的解读与趋势分析;2. 市场动态的变化及其对投资策略的影响;3. 相关经济指标的评估。通过这些分析,帮助读者更好地理解当前市场环境,为决策提供参考。 ... [详细]
author-avatar
任乔彦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有