标签: ocpjp

为什么Double.NaN == Double.NaN返回false?

我只是在研究OCPJP问题,我发现了这个奇怪的代码:

public static void main(String a[]) {
    System.out.println(Double.NaN==Double.NaN);
    System.out.println(Double.NaN!=Double.NaN);
}
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,我得到了:

false
true
Run Code Online (Sandbox Code Playgroud)

false当我们比较两个看起来彼此相同的东西时,输出结果如何?什么NaN意思?

java floating-point scjp nan ocpjp

154
推荐指数
5
解决办法
6万
查看次数

a =(a ++)*(a ++)在Java中给出奇怪的结果

我正在攻读OCPJP考试,因此我必须了解Java的每一个奇怪的细节.这包括增量前和增量后运算符应用于变量的顺序.以下代码给出了奇怪的结果:

int a = 3;

a = (a++) * (a++);

System.out.println(a); // 12
Run Code Online (Sandbox Code Playgroud)

答案不应该是11吗?或者13?但不是12!

跟进:

以下代码的结果是什么?

int a = 3;

a += (a++) * (a++);

System.out.println(a);
Run Code Online (Sandbox Code Playgroud)

java operator-precedence post-increment ocpjp

45
推荐指数
8
解决办法
7145
查看次数

使用printf和格式进行格式化

在以下程序中

class ZiggyTest2 {

    public static void main(String[] args){     

        double x = 123.456;
        char c = 65;
        int i = 65;

        System.out.printf("%s",x);
        System.out.printf("%b",x);
        System.out.printf("%c",c);
        System.out.printf("%5.0f",x);
        System.out.printf("%d",i);
    }       
}
Run Code Online (Sandbox Code Playgroud)

输出是

123.456trueA  12365
Run Code Online (Sandbox Code Playgroud)

有人可以解释一个双值(即123.456)如何转换为布尔值(即.true)

我问的原因是因为我知道java不允许数字用于布尔值.例如,Java中不允许以下内容

if (5) {
 //do something
}
Run Code Online (Sandbox Code Playgroud)

谢谢

java formatting scjp ocpjp

33
推荐指数
2
解决办法
7万
查看次数

为什么我不能添加两个字节并得到一个int,我可以添加两个最后的字节得到一个字节?

public class Java{
    public static void main(String[] args){
        final byte x = 1;
        final byte y = 2;
        byte z = x + y;//ok
        System.out.println(z);

        byte a = 1;
        byte b = 2;
        byte c = a + b; //Compiler error
        System.out.println(c);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果涉及任何int-sized或者更小的表达式的结果总是为int,即使两个字节的总和适合一个字节.

当我们添加两个适合字节的最终字节时,为什么会这样? 没有编译器错误.

java int scjp variable-assignment ocpjp

27
推荐指数
2
解决办法
2万
查看次数

我们怎么能比较两个枚举值和'<'?

如果枚举实现了Comparable,为什么无法与<或>进行比较?

public class Dream    
{
    public static void main(String... args)
    {
        System.out.println(PinSize.BIG == PinSize.BIGGER); //false
        System.out.println(PinSize.BIG == PinSize.BIG); //true
        System.out.println(PinSize.BIG.equals(PinSize.BIGGER));//false
        System.out.println(PinSize.BIG > PinSize.BIGGERER);// compilation error
        //can't be compared
        System.out.println(PinSize.BIG.toString().equals(PinSize.BIGGER));// #4
        PinSize b = PinSize.BIG ;
        System.out.println( b instanceof Comparable);// true
    }  
}
enum PinSize { BIG, BIGGER, BIGGERER };
Run Code Online (Sandbox Code Playgroud)

java enums scjp ocpjp

25
推荐指数
2
解决办法
2万
查看次数

Java数组 - 为什么输出'1'?

为什么此示例中的输出为1

public static void main(String[] args){
 int[] a = { 1, 2, 3, 4 };   
 int[] b = { 2, 3, 1, 0 };   
 System.out.println( a [ (a = b)[3] ] );   
}
Run Code Online (Sandbox Code Playgroud)

我以为会是2.即,表达式评估为:

a[(a=b)[3]]
a[b[3]]    //because a is now pointing to b
a[0]   
Run Code Online (Sandbox Code Playgroud)

不应该[0]为2,因为a指向b

提前致谢.

java arrays scjp ocpjp

24
推荐指数
3
解决办法
1177
查看次数

Java SneakyThrow异常,键入擦除

有人可以解释这段代码吗?

public class SneakyThrow {


  public static void sneakyThrow(Throwable ex) {
    SneakyThrow.<RuntimeException>sneakyThrowInner(ex);
  }

  private static <T extends Throwable> T sneakyThrowInner(Throwable ex) throws T {
    throw (T) ex;
  }



  public static void main(String[] args) {
    SneakyThrow.sneakyThrow(new Exception());
  }


}
Run Code Online (Sandbox Code Playgroud)

它可能看起来很奇怪,但这不会产生强制转换异常,并且允许抛出已检查的异常而不必在签名中声明它,或者将其包装在未经检查的异常中.

请注意,两者都没有sneakyThrow(...)或主要声明任何已检查的异常,但输出为:

Exception in thread "main" java.lang.Exception
    at com.xxx.SneakyThrow.main(SneakyThrow.java:20)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Run Code Online (Sandbox Code Playgroud)

本hack在龙目岛的使用,注释@SneakyThrow,允许抛出checked异常没有声明.


我知道它与类型擦除有关,但我不确定理解黑客的每个部分.


编辑: 我知道我们可以插入一个Integera List<String>和那个checked/unchecked异常区别是编译时功能.

从非泛型类型List转换为类似于List<XXX>编译器的泛型类型时会产生警告.但是直接转换为泛型类型并不像(T) ex上面的代码那样常见.

如果你愿意,对我来说似乎很奇怪的部分是我理解JVM中的内容List<Dog>并且List<Cat> …

java scjp lombok ocpjp

22
推荐指数
3
解决办法
3818
查看次数

如何以编程方式测试断言是否已启用?

OCP Java SE 6程序员实践考试的正确答案之一是:

您可以通过编程方式测试已启用的断言,而不会抛出AssertionError.

我怎样才能做到这一点?

java scjp assertion ocpjp

18
推荐指数
3
解决办法
4251
查看次数

与removeIf一起使用时,java.util.Arrays.asList抛出UnsupportedOperationException

我准备在接下来的2个月进行OCPJP 8考试,目前我这个考试得到了我的注意,因为我不明白为什么

public class BiPredicateTest {
    public static void main(String[] args) {
        BiPredicate<List<Integer>, Integer> containsInt = List::contains;
        List<Integer> ints = java.util.Arrays.asList(1,20,20);
        ints.add(1);
        ints.add(20);
        ints.add(20);
        System.out.println(containsInt.test(ints, 20));

        BiConsumer<List<Integer>, Integer> listInt = BiPredicateTest::consumeMe;
        listInt.accept(ints, 15);

    }

    public static void consumeMe(List<Integer> ints, int num) {
        ints.removeIf(i -> i>num);
        ints.forEach(System.out::println);
    }
}
Run Code Online (Sandbox Code Playgroud)

这显然是编译好的!但是当你运行它时,你会看到这样的异常

C:\Users\user\Documents>javac BiPredicateTest.java

C:\Users\user\Documents>java BiPredicateTest
true
Exception in thread "main" java.lang.UnsupportedOperationException
        at java.util.AbstractList.remove(AbstractList.java:161)
        at java.util.AbstractList$Itr.remove(AbstractList.java:374)
        at java.util.Collection.removeIf(Collection.java:415)
        at BiPredicateTest.consumeMe(BiPredicateTest.java:22)
        at BiPredicateTest.main(BiPredicateTest.java:17)
Run Code Online (Sandbox Code Playgroud)

我需要一些帮助来理解为什么asList方法不能与removeIf一起使用?我假设它将返回一个实现removeIf方法!的ArrayList实例.

任何答案将不胜感激.

干杯!

java arraylist stream ocpjp

14
推荐指数
1
解决办法
5182
查看次数

string.split("\\ S")如何工作

我在Ganesh和Sharma的书中提出了一个问题:oracle_certified_professional_java_se_7_programmer_exams_1z0-804_and_1z0-805.

一个问题是:

  1. 考虑以下程序并预测输出:

      class Test {
    
        public static void main(String args[]) {
          String test = "I am preparing for OCPJP";
          String[] tokens = test.split("\\S");
          System.out.println(tokens.length);
        }
      }
    
    Run Code Online (Sandbox Code Playgroud)

    a)0

    b)5

    c)12

    d)16

现在我明白\ S是正则表达式意味着将非空格字符视为分隔符.但我很困惑的是正则表达式如何进行匹配以及split产生的实际标记是什么.

我添加了代码来打印令牌,如下所示

for (String str: tokens){
  System.out.println("<" + str + ">");
}
Run Code Online (Sandbox Code Playgroud)

我得到了以下输出

16

<>

< >

<>

< >

<>

<>

<>

<>

<>

<>

<>

<>

< >

<>

<>

< >
Run Code Online (Sandbox Code Playgroud)

所以很多空字符串令牌.我只是不明白这一点.

我会想到,如果分隔符是非空格字符,那么在上面的文本中,所有字母字符都可以作为分隔符,所以如果我们匹配导致空字符串的标记,也许应该有21个标记.我只是不明白Java的正则表达式引擎如何解决这个问题.是否有任何正则表达的大师可以为我阐明这些代码?

java regex ocpjp

13
推荐指数
3
解决办法
4万
查看次数