当前位置: 首页 > 知识库问答 >
问题:

Oracle java教程-有关字符自动装箱java注释的可能错误[duplicate]

那宏大
2023-03-14

我是JAVA的新手,目前正在学习Oracle教程泛型部分。我认为那里有一个错误,我想确保我没有错。我将感谢您的反馈。

我在https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html看到了下面的解释

一对

请注意,Java编译器自动将8转换为整数。值(8)和“a”到字符('a'):

一对

我认为这是一个错误和'a'实际上是自动框到Character.value('a')。

我编写了以下程序来检查它。因为我认为泛型可能有特殊的装箱,所以我尝试了泛型方法、正则方法和泛型类:

class TestCharacter<T>{
public <T> void check( T first, T second){
    System.out.println("values: " + first + "  " + second);
    System.out.println(first.equals(second));
    System.out.println( "first == second is " + (first == second) );
    System.out.println( "first == second is " + (first == Character.valueOf('a')) );
}
}

public class TestAutoBoxingIssue{

public static <T> void check1( T first, T second){
    System.out.println("values: " + first + "  " + second);
    System.out.println(first.equals(second));
    System.out.println( "first == second is " + (first == second) );
    System.out.println( "first == second is " + (first == Character.valueOf('a')) );
}
public static void check2( Character first, Character second){
    System.out.println("values: " + first + "  " + second);
    System.out.println(first.equals(second));
    System.out.println( "first == second is " + (first == second) );
    System.out.println( "first == second is " + (first == Character.valueOf('a')) );
}
public static void main(String[] args){
    char first = 'a';
    char second = 'a';
    System.out.println("generic method usage: ");
    check1( first, second );
    System.out.println("=============");

    System.out.println("regular method usage: ");
    check2( first, second );
    System.out.println("=============");

    TestCharacter<Character> t = new TestCharacter<>();
    System.out.println("generic class usage: ");
    t.check(first, second );
    System.out.println("=============");
}

}

输出为:

泛型方法用法:value:a true first==second为true

常规方法用法:value:a true first==second为true

泛型类用法:value:a true first==second为true

所以,我认为这证明了“a”是自动装箱到Character.value的。

我错过什么了吗?这是检查的正确方法吗?

谢谢

埃利亚胡

共有1个答案

姜建德
2023-03-14

是的,自动装箱在任何地方都使用value来利用任何缓存。例如,使用Character

public static Character valueOf(char c) {
    if (c <= 127) { // must cache
        return CharacterCache.cache[(int)c];
    }
    return new Character(c);
}

这是留档疏忽。

 类似资料:
  • 问题内容: 我是JAVA的新手,目前正在学习Oracle教程泛型部分。我认为那里有一个错误,我想确保我没有记错。感谢您的反馈。 我在https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html看到了以下解释 Pair p =新的Pair <>(8,’a’); 请注意,Java编译器自动将8装箱为Integer.val

  • 我是Java新手,从OracleJava教程学习Java。我现在正在学习嵌套类、静态类和内部类。我发现下面的解释似乎很奇怪,我认为这是错误的。 来自:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html 嵌套类是其封闭类的成员。非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。静态嵌套类无权访问封闭类的其

  • 我是新来的Java,正在阅读Oracle教程。每一节后面都有问题和答案,一个答案里面有一句我听不懂(见下面粗线)。 来源是https://docs.oracle.com/javase/tutorial/java/javaOO/QandE/objects-answers.html 我指的是问题2,见粗体字。据我所知,如果没有对数组的引用,那么数组有资格进行垃圾收集。是否存在对此数组持有的对象的引用并

  • 问题内容: 为什么第二段代码更快? 问题答案: 自动装箱使用,内部将Integer对象缓存为小整数(默认情况下为-128至127,但是最大值可以使用“ java.lang.Integer.IntegerCache.high”属性进行配置-请参见Integer.valueOf的源代码) ,因此与直接调用不同。因为在调用之前可以快速检查整数值的大小,所以直接调用要快一些(尽管如果您有很多小整数,它会使

  • 问题内容: 我正在看工作区中的一些旧示例。由于没有 @Autowired, 我看不到自动 装配的方式 。Spring Boot + Facebook默认配置。 它工作完美,但是这些bean如何在没有@Autowired的情况下自动进行自动连线? 它们是作为字段或在构造函数中自动接线的吗? 问题答案: 借助Spring Boot 1.4+,构造函数将自动进行自动接线 https://docs.spr

  • 问题内容: 通常,编译器会生成代码以执行装箱和拆箱。但是,如果不需要带框的值,编译器怎么办?(Oracle标准)编译器是否足够智能以优化它? 看一下这个方法: 唯一相关的信息是,因此将例如数组的每个值装箱将是无用的。像下面的代码: 编译器会实际插入用于对数组的每个值进行装箱的代码吗? 问题答案: 您的代码中没有自动装箱。实际上,鉴于: 虽然可以将an自动装箱到,但Java 不会 将an自动装箱到。