热门标签 | 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#。。。。不知道他们运行机制是咋样的。



推荐阅读
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
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社区 版权所有