11、包装类

 

import org.junit.Test;

public class JUnitTest {
	@Test
	public void testExam() {
		Object o1 = true ? new Integer(1) : new Double(2.0);
		System.out.println(o1);//1.0, 因为三元运算要求两个数据类型一致,所以在编译的时候,数据类型提升了
		
		Object o2;
		if(true) {
			o2 = new Integer(1);
		} else {
			o2 = new Integer(2);
		}
		System.out.println(o2);//1
		
		
		Integer i = new Integer(1);
		Integer j = new Integer(1);
		System.out.println(i == j);//false,因为是地址值
		Integer m = 1;
		Integer n = 1;
//true IntegerCache中定义了Integer[]数组,包含了-128到127之间的值,
//如果使用自动装箱的方式,给Integer赋值的范围在-128到127范围时,
//可以直接使用数组中的元素,不再去new了,范围之外的还是new了。目的是提高效率。
		System.out.println(m == n);
		Integer x = 128;
		Integer y = 128;
		System.out.println(x == y);//false IntegerCache中有-128到127之间的值
	}
}

 

<think> 首先,用户的问题是关于包装的概念以及包装之间比较的方法。我需要基于提供的引用来回答。 回顾引用内容: - 引用[1]:讨论了Java包装的概念、分、常用方法,如Integer、Double等。 - 引用[2]:强调包装对象比较时使用equals方法,因为==比较的是对象地址而非值。 - 引用[3]:列出了基本数据型对应的包装。 - 引用[4]:提到JavaScript中的包装,但用户的问题似乎是针对Java的,因为引用[1]、[2]、[3]、[5]都是Java相关的。 - 引用[5]:展示了包装的使用,如进制转换。 用户的问题:"我想了解包装以及包装之间比较的相关知识 请问包装的概念及包装之间比较的方法"。 所以,我需要聚焦在Java包装的概念和比较方法上。 结构化回答: 1. **包装的概念**:解释什么是包装。从引用[1]和[3],包装是将基本数据包装成对象的。例如,int对应Integer,double对应Double等。这样可以在需要对象的地方使用基本型数据。 2. **包装之间比较的方法**:从引用[2],主要强调使用equals方法进行比较,而不是==,因为==比较引用地址,而equals比较实际值。特别是对于数值超出缓存范围的情况。 关键点: - 概念:包装Java中为每个基本数据型提供的对象表示。如int -> Integer。 - 比较方法: - 使用==:比较的是对象的引用(地址)。对于缓存范围内的值(如Integer在-128到127),==可能返回true,因为Java缓存了这些对象。但超出范围,==会返回false。 - 使用equals:比较的是包装的值是否相等。无论是否在缓存范围内,都会比较实际值。 - 例子:如引用[2]中的例子,Integer i11 = 255; Integer i22 = 255; i11.equals(i22) 返回true,因为值相等。 其他相关信息: - 自动装箱和拆箱:从引用[1]和[3],自动装箱是基本型自动转换为包装,拆箱是反之。这简化了代码。 - 常用方法:如引用[5]中的进制转换,但用户主要问概念和比较,所以次要。 回答结构: - 先解释概念。 - 然后详细说明比较方法。 - 给出示例。 - 最后总结。 生成相关问题:系统指令要求生成相关问题。我需要根据回答内容提出相关的问题。例如: 1. 包装与基本型有什么区别? 2. 如何避免包装比较中的常见错误? 3. 包装的自动装箱是如何工作的? 使用中文回答。 确保LaTeX语法正确:如果有数学表达式,使用$...$或$$...$$。但在这个主题下,可能不需要数学表达式,所以保持自然语言。 引用标识:在回答中引用的段落末尾添加引用标识,如[^1]。基于提供的引用编号。 系统指令回顾: - 所有行内数学表达式用$...$。 - 独立公式用$$...$$。 - LaTeX语法正确。 - 使用中文。 - 生成相关问题。 - 引用的段落末尾添加引用标识。 - 回答结构清晰。 现在,构建回答: 1. 开头:介绍包装概念。 2. 中间:解释比较方法。 3. 结尾:总结。 4. 生成相关问题。 引用管理: - 对于概念,引用[1]和[3]。 - 对于比较,引用[2]。 最终回答结构: - 包装概念。 - 包装之间比较的方法。 - 相关问题。 </think> ### 包装的概念及比较方法详解 包装(Wrapper Class)是Java编程语言中为基本数据型提供的对象封装。它们位于`java.lang`包中,主要作用是将基本数据型(如int、double等)包装成对象,以便在面向对象的上下文中使用(例如,在集合中存储数据或调用对象方法)。以下是包装的核心概念: 1. **包装的定义与分**: - 每个基本数据型都有对应的包装: - `byte` → `Byte` - `short` → `Short` - `int` → `Integer` - `long` → `Long` - `float` → `Float` - `double` → `Double` - `char` → `Character` - `boolean` → `Boolean` - 包装允许基本型以对象形式操作,支持自动装箱(Auto-Boxing)和自动拆箱(Auto-Unboxing)。自动装箱指基本型自动转换为包装对象(如`int a = 10; Integer b = a;`),自动拆箱则相反(如`Integer c = 20; int d = c;`)。这简化了代码,但需注意性能开销[^3]。 2. **包装的作用**: - 提供对象功能:包装可以用于集合框架(如`List<Integer>`),或调用方法(如进制转换)。 - 支持实用方法:例如,`Integer`提供`toBinaryString()`、`toHexString()`等方法,方便数值转换[^5]。 #### 包装之间比较的方法 包装对象之间的比较需特别注意,因为直接使用`==`运算符可能产生误导性结果。以下是正确方法: 1. **使用`equals()`方法比较值**: - `equals()`方法比较包装对象的实际值(value),而非对象引用(内存地址)。 - 示例: ```java Integer i1 = 100; Integer i2 = 100; System.out.println(i1.equals(i2)); // 输出 true,因为值相等 ``` - **关键点**:Java对部分包装(如`Integer`)实现了缓存机制(缓存范围通常为-128到127)。在此范围内,`==`可能返回true(因为对象引用相同),但超出范围后,`==`比较引用地址会失败。因此,无论是否在缓存范围内,值比较都推荐使用`equals()`[^2]。 - 建议:所有包装比较统一使用`equals()`,避免意外错误。 2. **避免使用`==`比较引用**: - `==`运算符比较的是对象引用(内存地址),而非值。缓存范围外的对象即使值相等,`==`也可能返回false。 - 示例: ```java Integer i3 = 200; // 超出缓存范围 Integer i4 = 200; System.out.println(i3 == i4); // 输出 false,因为引用地址不同 System.out.println(i3.equals(i4)); // 输出 true,因为值相等 ``` - 注意:`Character`和`Boolean`也有缓存机制(如`Boolean`缓存`true`和`false`),但规则似[^2]。 3. **特殊情况处理**: - 对于`null`值:调用`equals()`前需检查对象是否为null,否则可能抛出`NullPointerException`。 - 混合型比较:不同包装(如`Integer`和`Double`)使用`equals()`时返回false,因为型不同。 #### 总结 包装通过对象封装增强了基本型的功能,但在比较时务必使用`equals()`方法以确保值相等性。自动装箱机制虽便利,但需警惕性能影响。在实际编程中,推荐优先使用基本型,仅在需要对象特性时转为包装[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值