`
yechw
  • 浏览: 59371 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[转贴]使用jdk1.5封箱及拆箱功能时注意的问题

阅读更多

在面试时碰到的一个问题没答上,回来google了一下,贴上来留做复习用。

 

我们知道java中所有到的类型要么就是引用类型和要么就是原始数据类型,其中原始数据类型有其相应的包裹类(Wrapper Class),包括:Byte(byte), Short(short), Integer(int), Long(long), Float(float), Double(double), Boolean(bool), Char(char)。
我们将原始数据类型及其包裹类间的互相转换称为封箱及拆箱操作。
Generics为我们提供了自动封拆箱的功能,记住在设定泛型的类型参数(type parameter时,只能使用引用类型,绝对不能使用原始数据类型。我们以以下的示例来说明:

Example1.2.1
public int sum(List<Integer> ints) {
    int s = 0;
    for(int n : ints) {s += n;}
    return s;
}

在该例子,我们看到在遍历时,当ints把值绑定到n时,进行了拆箱操作。

Example1.2.2
public Integer sumInteger(List<Integer> ints) {
    Integer s = 0;
    for(Integer n : ints) { s += n;}
    return s;
}

在这里我们看到在进行s += n这一步时,反复做了拆箱及封箱操作,我们看到虽然做的是同一件事,但在jvm中执行的效率相差幅度在60%左右。

在讨论封,拆箱时我们要留意一下以下两个问题:
(1)==号在原始及引用类型间的定义是不同的,我们在处理比较相等问题时要特别留意封,拆箱带来的问题:

Example1.2.3
List<Integer> bigger = new ArrayList<Integer>(200, 300, 400);
Assert sumInteger(bigger) == sum(bigger);
Assert sumInteger(bigger) != sumInteger(bigger) //not recommended

我们看到在第一段比较时,对Integer进行了拆箱的操作,然后再和int比较,则结果一定是900.第二个比较,因为两者都为Integer,但它们并不是同一对象的引用,所以自然就不相等。
我们推荐使用==号比较int类型,用equals方法去比较Integer类型间的相等性。

(2)当对byte, boolean,int(-127 - +128), short(-127 - +128), char(\u0000 - \u007f) 在封箱时是必须进行缓存的,而对其它值,也是被允许进行缓存。

Example1.2.4
List<Integer> smalls = new List<Integer>(1,2,3);
Assert sumInteger(smaller) == sum(smaller);
Assert sumInteger(smaller) == sumInteger(smaller) //not recommended

因为总和的值为6,所以封箱后的值被缓存起来,下次封箱的值也为6时,就会调用缓存中的值,所以我们看到第二个判断为相等。通常情况下,并没有指定封箱两次相同的值会返回相同或不同对象。我们反对用==号进行引用对象的比较,而是使用equals方法来进行判断对象间的相等情况。

分享到:
评论

相关推荐

    jdk1.5x64位 windows版.zip

    枚举类型使得代码更加清晰,更易于理解和维护,同时避免了因常量值的错误使用而导致的潜在问题。 其次,泛型(Generics)是JDK1.5的一大亮点。泛型允许在定义类、接口和方法时指定参数类型,增强了类型检查,减少了...

    jdk1.5 windows版本 64位

    标题:“jdk1.5 windows版本 64位” 描述:“jdk1.5 windows版本 64位,Java开发依赖环境” 标签:“windows” 在这个主题中,我们聚焦的是Oracle JDK 1.5(也被称为Java Development Kit,简称JDK)在Windows...

    linux系统jdk1.5下载

    然而,由于JDK1.5已不再受官方支持,可能存在安全风险和性能问题。因此,在生产环境中使用时,强烈建议升级到更现代的JDK版本,以获得更好的性能、安全性和功能支持。同时,对于学习和研究目的,理解老版本的JDK可以...

    Java-jdk1.5安装包

    Java 5.0之前,开发者通常使用常量类来实现枚举功能,但这种方式存在很多问题。JDK1.5引入了枚举类型,使得枚举更安全、易用。枚举可以拥有方法和字段,还可以实现接口,提高了代码的结构化和可维护性。 三、变量...

    JDK1.5的32位和64位安装包

    此外,JDK1.5还引入了变长参数(Varargs)功能,允许在方法声明中使用三个点(...)表示可变长度的参数列表。这使得创建接受任意数量相同类型参数的方法变得更加简单。 在类型系统方面,JDK1.5引入了增强的for循环...

    JDK1.5,JDK1.5

    泛型是JDK1.5最重要的特性之一,它允许在类、接口和方法声明中使用类型参数,以实现数据类型的参数化。泛型提高了代码的类型安全性和可读性,减少了类型转换的需要,并允许编译器检查类型错误。 2. **自动装箱与...

    jdk1.5.exe jdk1.5

    jdk1.5.exe jdk1.5 jdk1.5下载

    包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)

    这个压缩包包含了三个不同版本的JDK:JDK 1.5、JDK 1.6和JDK 1.8,其中1.5和1.6是早期版本,而1.8是最流行且广泛使用的版本之一。 **JDK 1.5(也称为Java 5.0)** JDK 1.5在2004年发布,引入了许多重要的新特性,如...

    jdk1.5免安装版

    绝版jdk1.5,非常不错的资源。用起来很好。是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,...

    window JDK1.5 32位 绿色免安装版,可以安装多个JDK使用

    标题中的"window JDK1.5 32位 绿色免安装版"指的是适用于Windows操作系统的32位版本的JDK 1.5,它是一个便携式版本,无需正式安装即可使用。这种绿色免安装版通常是为了方便开发者在不同机器间快速切换工作环境,或...

    简单易用通用(xls,xlsx)导入导出操作 jdk1.5+

    前几天上传过这个资源,因为是在jdk1.6上开发的, 测试了一下在jdk1.5上不能用, 今天重新用jdk1.5编译了一下, 这个是可以支持jdk1.5+的 将 pu-xlscommon-1.0.0.jar 添加到工程的 /lib 目录下 用法在附件中 XlsTest....

    IBMJDK1.5linux.zip

    在压缩包"IBMJDK1.5linux.zip"中,主要包含的是IBM JDK 1.5的安装文件和相关文档。安装完成后,开发者可以通过设置环境变量(如JAVA_HOME、PATH)来使用这个JDK。通常,这个JDK会包含Java编译器(javac)、Java解释...

    linux下JDK1.5

    总之,Linux下的JDK1.5是Java开发和Web应用程序运行的基础,熟悉其安装、配置及主要特性的使用,对于任何Java开发者来说都是至关重要的。虽然现在已经有了更新的JDK版本,但理解JDK1.5的基本知识仍然是提升编程技能...

    JDK1.5、JDK5下载

    在下载JDK1.5或JDK5时,你需要确保选择与你的操作系统兼容的版本,即32位或64位。同时,如果你遇到无法下载或者积分不足的问题,可以尝试联系描述中提到的博主寻求帮助。安装JDK后,设置好环境变量,你就可以开始...

    jdk1.5_forLinux.zip

    3. **自动装箱与拆箱**:自动装箱和拆箱功能使得基本数据类型与对应的包装类之间可以无缝转换,简化了代码编写。 4. **可变参数**:可变参数允许方法接收任意数量的同类型参数,如`public void printNumbers(int......

    JDK1.5中文版

    这个文档对于学习和使用JDK1.5的开发者来说是一份非常重要的参考资料,可以帮助他们理解和利用JDK1.5的各种功能,编写出高效、可靠的Java程序。 总之,JDK1.5是Java发展历程中的一个里程碑,它的多项创新特性为Java...

    jdk1.5.rar

    Java Development Kit(JDK)是Java编程语言的软件开发工具包,它包含了编译、调试、文档生成等...如果你习惯了使用JDK 1.7,但对JDK 1.5有特殊的依赖或偏好,那么了解和掌握这个版本的特点和使用技巧是非常有价值的。

    JDK1.5中文帮助文档

    这个“JDK1.5中文帮助文档”是官方英文文档的中文译本,为中文用户提供了详细的解释和易于理解的指导,旨在帮助开发者更好地理解和利用JDK 1.5的新功能。** 1. **泛型(Generics)** 泛型是JDK 1.5引入的最显著的...

    JDK1.5版本免费下载

    在使用JDK 1.5进行开发时,开发者可以享受到这些新特性的便利,提高代码质量和开发效率。然而,由于该版本已经比较老,可能不支持现代的Java特性,对于新项目,推荐使用更新的JDK版本。对于旧项目,迁移至更高版本的...

    jdk1.5、1.6压缩包

    JDK 1.6(2006年发布)在1.5的基础上继续优化和添加新功能,其中一些重要的改进包括: 1. **NIO.2(非阻塞I/O)**:增强了Java的I/O性能,引入了新的路径、文件系统和文件观察者API,使得处理大量并发I/O操作更加...

Global site tag (gtag.js) - Google Analytics