当前位置: 首页 > 面试题库 >

为什么+在Java中使用Strings?

郭和硕
2023-03-14
问题内容

Java不能执行运算符重载,但+可以用于StringInteger和其他一些类。这怎么可能?

更新:
为什么这样做?

Integer i = 4;
Integer p = 5;

System.out.println(i*p); // prints 20

问题答案:

+不是操作员重载的示例。+在语言中被内置为合并运算符 算术加法运算符。

这意味着用Java编写程序的人不能重载运算符,但是就Java语言的语法而言,它+被定义为连接和加法运算符。

编辑

它适用于其他类,如IntegerDouble由于自动装箱。

如果您看一下执行字符串连接的Java程序的字节码,您会发现它创建StringBuilder并使用了该append()方法。Java编译器会看到+运算符,并意识到操作数是字符串而不是原始类型(如int)。

如果查看执行整数加法的程序的字节码,您会发现它使用iadd指令执行整数加法。这是因为编译器意识到该操作的+操作数是整数。

至于做这样的事情Integer i = 4,字节码会表明你确实在做Integer i = Integer.valueOf(4)。这称为自动装箱。稍后,当您执行i + pip都为type的操作时Integer,生成的字节码将显示您正在执行i.intValue() + p.intValue(),这两个方法的返回类型均为int(实际的字节码指令为iadd)。

这就是为什么+工作Integer,即使他们不是实际的基本类型。



 类似资料:
  • 问题内容: 我知道有很多文章可以解释如何在Java EE中使用CDI,但是我很难弄清楚这实际上带来了什么好处。例如,假设我有一个当前使用Foo实例的类。我可能会做 要么 我一直在阅读CDI,我可以做到: 但是为什么这比以前的基于工厂的方法更好呢?我认为还有一些我不知道的用例,但我无法识别。 如果我理解下面的响应,则概念是DI框架充当集中配置的主对象工厂。这是合理的解释吗? 更新资料 从那时起,我就

  • 问题内容: Process p = Runtime.getRuntime().exec(command); is = p.getInputStream(); byte[] userbytes = new byte[1024]; is.read(userbytes); 我想从java在linux os中执行shell命令。但是Pmd报告说不要使用Java Runtime.exec()。为什么?是什么

  • 问题内容: 在JBox2d中,存在以下代码: 我想知道这里的float <-> int位转换函数的作用是什么。这是否提供解决Java的float比较不准确性问题的方法(如果可能的话)?还是完全不同?我想知道它是否可以替代epsilon方法: PS。为了完整和有趣,这里是: 仅供参考,我可以完美地理解为什么在hashCode()中使用转换函数-哈希ID必须是整数。 问题答案: 解释中可以找到约书亚B

  • 问题内容: 我试图了解使用以下命令创建列表的新实例之间的区别: 和 据我了解,稍后将返回一个不可变的列表。这意味着无法添加,删除或修改它。我想知道为什么会创建一个不可变的emptyList?有什么用?谢谢 问题答案: 假设您必须返回一个集合,并且您不想每次都创建几个对象。 返回空集合通常比返回更可取

  • 问题内容: Java中是否有真正的并行数组用例?维护相互关联的N个数组似乎太麻烦了。 例: 我可以创建一个Person类并将对象存储在一个数组中。会贵一点,但是好用得多吗? 问题答案: 并行数组是对诸如Basic(原始语言)之类语言的保留,这些语言除数组外没有其他数据结构。您应该按照您的建议定义对象。

  • 我知道使用lambda expression(LE)我们可以节省一些代码行,比如为函数接口创建对象。而且LE将更易读。但我确信这并不是提供该功能的主要原因。我在google上搜索,并在本文中找到了这段有趣的引用 在Java8之前,处理任何集合的元素都可以通过从集合中获取迭代器,然后迭代元素,然后处理每个元素来完成。如果需要并行处理这些元素,那么将由客户端代码完成。随着Java 8中Stream A