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

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

申屠秦斩
2023-03-14
问题内容

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

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

Pair p =新的Pair <>(8,’a’);

请注意,Java编译器自动将8装箱为Integer.valueOf(8),将 ‘a’ 装箱 为Character(’a’)

Pair p =新Pair <>(Integer.valueOf(8), new
Character(’a’)
);

我认为这是一个错误,实际上将’a’自动装箱到 Character.valueOf(’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("=============");
}

}

输出为:

通用方法的用法:值:aa true first == second is true

常规方法的用法:值:aa true first == second is true

第一==第二是正确的

通用类用法:值:aa true第一==第二为true

第一==第二是正确的

因此,我认为这表明’a’被自动装箱到Character.valueOf。

我想念什么吗?这是检查的正确方法吗?

谢谢。


问题答案:

是的,valueOf在任何地方都可以进行自动装箱,以利用所有缓存。例如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看到了下面的解释 一对 请注意,Java编译器自动将8转换为整数。值(8)和“a”到字符('a'): 一对 我认为这是一个错误和'a'实

  • 我是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

  • 我想创建bean,但它告诉我不要有类型字符串或其他类型的字段,它们的类定义不包括@Component. ex。 它显示编译器错误:无法自动连线。未找到“String”类型的bean。当我在声明名称字符串之前添加@Autowired时,会给出相同的编译器错误。