java 类 覆盖_Java String类如何覆盖+运算符?

小编典典

让我们看一下下面的Java简单表达式

int x=15;

String temp="x = "+x;

编译器"x = "+x;在StringBuilder内部进行转换,并用于.append(int)将整数“添加”到字符串中。

5.1.11。字符串转换

可以通过字符串转换将任何类型转换为String类型。

首先将原始类型T的值x转换为参考值,就像通过将其作为适当的类实例创建表达式的参数(第15.9节):

如果T为布尔值,则使用新的Boolean(x)。

如果T为char,则使用新的Character(x)。

如果T为byte,short或int,则使用新的Integer(x)。

如果T长,则使用新的Long(x)。

如果T为float,则使用新的Float(x)。

如果T为double,则使用新的Double(x)。

然后,通过字符串转换将该参考值转换为String类型。

现在只需要考虑参考值:

如果引用为null,则将其转换为字符串“ null”(四个ASCII字符n,u,l,l)。

否则,转换的执行就好像是通过调用不带参数的引用对象的toString方法进行的;但是,如果调用toString方法的结果为null,则使用字符串“ null”。

toString方法由原始类Object(第4.3.2节)定义。许多类都覆盖它,特别是布尔,字符,整数,长整型,浮点型,双精度和字符串。

有关字符串转换上下文的详细信息,请参见§5.4。

15.18.1。

字符串连接的优化: 实现可以选择一步执行转换和连接,以避免创建然后丢弃中间String对象。为了提高重复字符串连接的性能,Java编译器可以使用StringBuffer类或类似的技术来减少通过对表达式求值创建的中间String对象的数量。

对于基本类型,实现还可以通过直接从基本类型转换为字符串来优化包装对象的创建。

优化版本实际上不会首先进行完全包装的String转换。

这是编译器使用的优化版本的一个很好的例子,尽管无需转换原语,你可以在其中看到编译器在后台将事物更改为StringBuilder:

这个java代码:

public static void main(String[] args) {

String cip = "cip";

String ciop = "ciop";

String plus = cip + ciop;

String build = new StringBuilder(cip).append(ciop).toString();

}

生成此代码-查看两种串联样式如何导致相同的字节码:

L0

LINENUMBER 23 L0

LDC "cip"

ASTORE 1

L1

LINENUMBER 24 L1

LDC "ciop"

ASTORE 2

// cip + ciop

L2

LINENUMBER 25 L2

NEW java/lang/StringBuilder

DUP

ALOAD 1

INVOKESTATIC java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String;

INVOKESPECIAL java/lang/StringBuilder.(Ljava/lang/String;)V

ALOAD 2

INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;

INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;

ASTORE 3

// new StringBuilder(cip).append(ciop).toString()

L3

LINENUMBER 26 L3

NEW java/lang/StringBuilder

DUP

ALOAD 1

INVOKESPECIAL java/lang/StringBuilder.(Ljava/lang/String;)V

ALOAD 2

INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;

INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;

ASTORE 4

L4

LINENUMBER 27 L4

RETURN

查看上面的示例以及如何基于给定示例中的源代码生成字节代码,你将能够注意到编译器已在内部转换了以下语句

cip+ciop;

进入

new StringBuilder(cip).append(ciop).toString();

换句话说,+字符串连接中的运算符实际上是更冗长的StringBuilder习惯用法的简写形式。

2020-03-03

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值