字符串"+"操作的原理

字符串"+"操作的原理

在阿里手册上意外的看到了一段关于java中对字符串的“+”运算的处理 突然间想到要详细了解下这个知识点,于是从网上找资料学习了一下。代码测试地址
阿里手册

一、"+"操作内部原理到底是如何实?

我们知道这里我们是无法像其他方法一样看到实现的逻辑的,原因很简单“+”拼接的字符串其实是Java提供的一个语法糖,其目的更方便程序员使用,让程序更加简洁,有更高的可读性。
要想看到内部原理就需要我们把他生成的字节码进行反编译

1、如下图代码:我们反编译一下,看看结果。

在这里插入图片描述
反编译后的内容如下:(反编译命令 :javap -c classpath 或者 idea配置字节码工具)
在这里插入图片描述过查看反编译以后的代码,我们可以发现,原来字符串常量在拼接过程中,是将String转成了StringBuilder后,使用其append方法进行处理的。
通过上面的代码说明,Java中的+对字符串的拼接,其实现原理是使用StringBuilder.append。

Java中的+对字符串的拼接都是StringBuilder吗?我个人理解其实不然

2、为什么呢?如下图:

在这里插入图片描述
反编译后的内容如下:
在这里插入图片描述
我们可以发现它并没有使用StringBuilder,这是为什么呢?
总结:原来当+两边连接的是字符串常量时,虚拟机会直接进行优化,看成一个字符串,当+的一边是引用的时候,虚拟机就会创建StringBuilder,利用append方法进行连接操作。

二、null + 字符串是如何处理的

如下图:
在这里插入图片描述
也许你会认为它只会输出“string”,其实不然 ,它的输出结果如下图:
在这里插入图片描述
有上面的结论我们知道它是使用StringBuilder.append方法进行处理的,那么我们只需查询append的源码,便可得到结果,如下图
StringBuilder append源码
原来这是Java String对 null 对象的容错处理,它会把null拼接成了一个字符串,

三、循环体内为什么不建议字符串"+"

在这里插入图片描述
反编译后的内容如下:(字节码学习
在这里插入图片描述
这就是为什么每次循环都会 new 出一个 StringBuilder 对象的原因,也是导致“+”操作效率低的主要原因

四、总结

1、+两边连接的是字符串常量时,虚拟机会直接进行优化,看成一个字符串,当+的一边是引用的时候,虚拟机就会创建StringBuilder,利用append方法进行连接操作
2、+左右可以为null,并不会包空指针
3、从字节码来看“+”操作使用StringBuiler来拼接时,一行+ + +的语句只会创建一个StringBuilder
4、循环体内,有字符串的“+”操作时,推荐使用 StringBuilder

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言能够实现Java字符串进行AES解密操作,需要考虑到AES算法的实现以及Java字符串的编码方式。对于AES算法的实现,可使用现成的C语言库或手动实现。使用现有库可以加快开发速度,但需要了解库的使用方法。手动实现则需要对AES算法有较为深入的了解。 在AES解密过程中,是需要进行字符串解码的。Java中默认使用UTF-16编码方式,因此需要将C语言中的AES解密结果进行UTF-16解码,才能得到正确的字符串。同时,需要注意Java字符串是有符号位的,因此在解密过程中需要进行符号扩展。 在实现时需注意安全问题,如密钥保护、加解密数据传输安全等。特别地,在对Java字符串进行解密时,还需考虑Java字符串的安全性,因为涉及到输入输出字符串的保密性问题。 总之,C语言对Java字符串进行AES解密是可操作的,但需要考虑到AES算法实现字符串编码方式,以及字符串的保密性和数据传输安全等问题。 ### 回答2: C语言AES解密Java字符串并保留符号位需要进行一些步骤。首先,需要使用Java将AES加密后的字符串转换为byte数组,并传递给C程序进行解密。在C程序中,需要使用AES解密算法库,例如Cryptlib或Openssl等,将byte数组进行解密,并获取解密后的byte数组。然后,需要将byte数组转换回Java字符串,并确保保留符号位。这可以通过将byte数组中的每个元素转换为有符号的int类型,并将其转换为相应的字符来实现。最后,将Javas字符串返回给程序并进行后续处理。 需要注意的是,在Java和C之间进行字符串操作时,需要进行字符编码和解码,以确保数据的准确性和一致性。同时,还需要考虑安全性和性能问题。在实际应用中,应遵循最佳实践和标准协议,以确保程序的可靠性和安全性。 ### 回答3: C语言是一种广泛应用于嵌入式系统、操作系统、驱动程序等领域的编程语言,而AES是一种常用的加密算法。 解密Java字符串中含有符号位的AES加密,需要使用到C语言中的AES解密算法。首先需要将Java中的字符串转换成字节数组,再调用C语言中的AES解密函数进行解密。 在解密过程中需要注意的事项是,AES加密解密的密钥长度为128位、192位或256位,因此在调用AES解密函数时需要指定密钥长度。 另外,在Java字符串的编码方式为Unicode,而在C语言中字符串的编码方式为ASCII码,因此在进行字符串转换时需要进行编码转换。可以通过调用Java中的getBytes()方法将Unicode字符串转换成字节数组,再将字节数组按照ASCII码进行解密。 总之,进行AES解密需要注意密钥长度、字符串编码方式等细节问题,同时需要理解AES加密算法的运行原理,才能进行有效的解密操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值