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

Java中的布尔功能

公孙智
2023-03-14
问题内容
String s1="hi";
String s2="hi";

boolean b1 = true;
boolean b2 = false;

(1) System.out.println(s1==s2);                            //true
(2) System.out.println(s1==s2 + s1==s2);                   //false
(3) System.out.println(s1==s2+ " " + s1==s2);              //false

(4) System.out.println(b1+b2);                             //error : bad operand types
(5) System.out.println(b1 + " " + b2);                     //true false
(6) System.out.println(true +" "+ s1==s2);                 //false
  • (2)和(4)有什么区别?
  • (3)和(5)有什么区别?
  • 为什么在(3)和(6)中给出错误的结果?

问题答案:

除4外,所有这些都依赖于运算符的优先级。

在Java中,+优先于==

这意味着2实际上是“读取”的:

s1 == ((s2 + s1) == s2)

因此,第==一个的右侧操作数是一个布尔表达式,它将两个对象引用彼此进行比较(事实上,它们在String这里都是s都是无关紧要的),在这里它们是不相同的。因此,右侧操作数为boolean
false

但是由于左侧操作数是String,并且由于==不适用于Stringboolean,因此产生了编译错误。JLS,第15.21节:

相等运算符可用于比较两个可转换(第5.1.8节)为数字类型的操作数,或两个布尔或布尔类型的操作数,或两个分别为引用类型或null类型的操作数。所有其他情况都会导致编译时错误。

如果这确实为您编译,则说明您使用的是错误的Java编译器,该编译器将右侧操作数自动装箱到Boolean,而不应该装箱。让我猜测:Eclipse的ECJ?

4是错误,因为+运算符不接受booleans作为操作数。

3的读数与2几乎相同,不同的是这次s2 + " " + s1是与进行比较的s2。由于相同的原因,它无法编译。

在5中,由于字符串连接,布尔值会自动装箱。

6再次依赖于2中提到的操作员优先级;这次是一个字符串true + " " + s1,它是(引用)与s2(给出假)的比较。请参阅5 true



 类似资料:
  • 我被一件简单的事情困住了。我有一个名为“tags”的布尔值数组能够通过布尔值访问数组的每个元素对我来说很重要: 我传入trackTags数组并将布尔值赋给它(比如说[true,true,true,false])。因此,当我调用trackTags[0]时,我得到了“true”但是,当我打印“Energy”(能量)时,它应该与trackTags(0)相同,该值始终为false。我知道booleans

  • 我注意到java有一个问题。它不能解析空值的布尔类。我知道它有静态方法,但它的签名声明它只接受,而不接受。 换句话说,它有以下签名: 但不是: 检查布尔值而不陷入NullPointerException的最佳方法是什么?

  • 问题内容: 我声明一个布尔变量。例如, 现在,如果我执行以下代码段: 我懂了。好吧,我知道它很明显,但是我需要知道其背后的原因。 问题答案: 当您评估对象的布尔值时,Java会将其取消装箱(自装箱功能,自1.5开始)。因此,实际的代码是:。然后它抛出。对于任何装箱的值,将空对象拆箱将引发此异常。 在1.5之前,您必须手动将值拆箱:所以它更明显(也更加冗长:)

  • 我有一个数组,如果两个相邻的数被10除,它将返回true。现在它的回报总是假的。

  • 我正在寻找一种相对简单的(与编写解析器相比)方法来计算Java中的布尔表达式,我不想使用JEP库。 我有一个字符串表达式,如:

  • 问题内容: 我正在寻找一种相对简单的方法(与编写解析器相比)来评估Java中的布尔表达式,并且我不想使用JEP库。 我有一个String表达式,例如:我的目标是用值替换变量。 有没有一种方法可以评估此​​表达式? 请记住,这可以是任何深度,因此编写解析器将非常复杂。 问题答案: 您可以使用Java6中的脚本引擎,并选择任何流行的脚本语言,例如Scala,Ruby,Python,Groovy和Jav