使用jdk1.5装箱及拆箱功能时注意的问题
我们知道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方法来进行判断对象间的相等情况。
分享到:
相关推荐
枚举类型使得代码更加清晰,更易于理解和维护,同时避免了因常量值的错误使用而导致的潜在问题。 其次,泛型(Generics)是JDK1.5的一大亮点。泛型允许在定义类、接口和方法时指定参数类型,增强了类型检查,减少了...
Java 5.0之前,开发者通常使用常量类来实现枚举功能,但这种方式存在很多问题。JDK1.5引入了枚举类型,使得枚举更安全、易用。枚举可以拥有方法和字段,还可以实现接口,提高了代码的结构化和可维护性。 三、变量...
此外,JDK1.5还引入了变长参数(Varargs)功能,允许在方法声明中使用三个点(...)表示可变长度的参数列表。这使得创建接受任意数量相同类型参数的方法变得更加简单。 在类型系统方面,JDK1.5引入了增强的for循环...
泛型是JDK1.5最重要的特性之一,它允许在类、接口和方法声明中使用类型参数,以实现数据类型的参数化。泛型提高了代码的类型安全性和可读性,减少了类型转换的需要,并允许编译器检查类型错误。 2. **自动装箱与...
这个压缩包包含了三个不同版本的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程序。 总之,JDK1.5是Java发展历程中的一个里程碑,它的多项创新特性为Java...
总的来说,JDK 1.5是一个里程碑式的版本,它的许多新特性如泛型、枚举、注解和自动装箱/拆箱等,极大地提高了Java开发的效率和代码质量,也为后续版本奠定了坚实的基础。如果你习惯了使用JDK 1.7,但对JDK 1.5有特殊...
3. **自动装箱与拆箱**:自动装箱和拆箱功能使得基本数据类型与对应的包装类之间可以无缝转换,简化了代码编写。 4. **可变参数**:可变参数允许方法接收任意数量的同类型参数,如`public void printNumbers(int......
3. **自动装箱/拆箱(Autoboxing and Unboxing)**:Java 1.5引入了自动装箱和拆箱机制,使得基本类型和对应的包装类之间可以无缝转换,简化了代码编写。 4. **变量赋值增强(Enhanced for Loop)**:也称为foreach...
3. **自动装箱与拆箱**:自动装箱和拆箱使得基本数据类型与对应的包装类之间可以无缝切换,简化了代码编写。 4. **增强的for循环(foreach)**:增强的for循环简化了遍历数组和集合的操作,使得代码更加简洁。 5. ...
此外,自动装箱/拆箱功能使得基本数据类型与对应的包装类之间可以无缝转换,简化了代码编写。 增强的for循环(foreach loop)也是Java 5的一个亮点,它提供了一种简洁的方式来遍历数组和集合,减少了出错的可能性。...
2. **自动装箱与拆箱(Autoboxing/Unboxing)**:自动装箱允许在基本类型和对应的包装类之间进行无缝转换,简化了代码编写。 3. **枚举类型(Enums)**:枚举是一种新的数据类型,用于定义有限集合的常量,提高了...
1.5版本后,Java引入了自动装箱和拆箱功能,使得基本数据类型与包装类之间的转换更加便捷,提升了代码的可读性。 ### 3. 枚举(Enums) JDK1.5引入了枚举类型,提供了一种更安全、更面向对象的方式来表示有限的、...
总之,Linux下的JDK1.5是Java开发和Web应用程序运行的基础,熟悉其安装、配置及主要特性的使用,对于任何Java开发者来说都是至关重要的。虽然现在已经有了更新的JDK版本,但理解JDK1.5的基本知识仍然是提升编程技能...
这个“JDK1.5中文帮助文档”是官方英文文档的中文译本,为中文用户提供了详细的解释和易于理解的指导,旨在帮助开发者更好地理解和利用JDK 1.5的新功能。** 1. **泛型(Generics)** 泛型是JDK 1.5引入的最显著的...
2. 自动装箱与拆箱:自动装箱允许基本类型和它们对应的包装类之间无缝转换。例如,int可以自动转换为Integer,反之亦然。这简化了代码,提高了可读性。 3. 枚举(Enums):JDK 1.5引入了枚举类型,用于表示一组固定...
3. **自动装箱与拆箱(Autoboxing/Unboxing)**:JDK1.5允许在基本类型和其对应的包装类之间自动转换,简化了代码,减少了程序员的工作负担。 4. **变量长度数组(Variable-Length Arrays)**:在JDK1.5之前,数组...
JDK1.5还增强了异常处理,引入了可变参数(varargs)功能,允许一个方法接受任意数量的相同类型的参数,这些参数会被封装为一个数组。 在反射API中,增加了对泛型类型信息的支持,使得在运行时可以获取到泛型的实际...
2. Autoboxing/Unboxing(自动装箱与拆箱):JDK 1.5开始,基本类型与它们对应的包装类之间可以自动进行转换,简化了编程。例如,int与Integer之间的转换无需手动进行。 3. Enhanced for Loop(增强型for循环):也...
**Java Development Kit (JDK) 1.5 for...请注意,由于JDK 1.5已经过时,可能不再受到官方支持,因此对于现代项目,推荐使用更新版本的JDK,以获取更好的性能和安全性。同时,对于64位操作系统,应安装相应的64位版本。