基本类型和包装类对象使用 == 和 equals进行比较的结果? 1、值不同,使用 == 和 equals() 比较都返回 false
2、值相同
使用 == 比较:
基本类型 - 基本类型、基本类型 - 包装对象返回 true
包装对象 - 包装对象返回 false
缓存中取的包装对象比较返回 true(原因是 JVM 缓存部分基本类型常用的包装类对象,如 Integer -128 ~ 127 是被缓存的,内存地址相同。注意:使用valueof()方法创建的对象才会缓存)
使用 equals() 比较
包装对象-基本类型返回 true
包装对象-包装对象返回 true
3、不同类型的对象对比,返回 false
// 缓存的包装对象
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);
//打印true
System.out.println(i3==i4);
//打印false
byte b1 = 127;
Byte b2 = new Byte("127");
Byte b3 = new Byte("127");
System.out.println("Byte 基本类型和包装对象使用 == 比较 : " + (b1 == b2));
System.out.println("Byte 基本类型和包装对象使用 equals 比较 : " + b2.equals(b1));
System.out.println("Byte 包装对象和包装对象使用 == 比较 : " + (b2 == b3));
System.out.println("Byte 包装对象和包装对象使用 equals 比较 : " + b2.equals(b3));
System.out.println();
short s1 = 12;
Short s2 = new Short("12");
Short s3 = new Short("12");
System.out.println("Short 基本类型和包装对象使用 == 比较 : " + (s1 == s2));
System.out.println("Short 基本类型和包装对象使用 equals 比较 : " + s2.equals(s1));
System.out.println("Short 包装对象和包装对象使用 == 比较 : " + (s2 == s3));
System.out.println("Short 包装对象和包装对象使用 equals 比较 : " + s2.equals(s3));
System.out.println();
char c1 = 'A';
Character c2 = new Character('A');
Character c3 = new Character('A');
System.out.println("Character 基本类型和包装对象使用 == 比较 : " + (c1 == c2));
System.out.println("Character 基本类型和包装对象使用 equals 比较 : " + c2.equals(c1));
System.out.println("Character 包装对象和包装对象使用 == 比较 : " + (c2 == c3));
System.out.println("Character 包装对象和包装对象使用 equals 比较 : " + c2.equals(c3));
System.out.println();
int i1 = 100;
Integer i2 = new Integer(100);
Integer i3 = new Integer(100);
System.out.println("Integer 基本类型和包装对象使用 == 比较 : " + (i1 == i2));
//true
System.out.println("Integer 基本类型和包装对象使用 equals 比较 : " + i2.equals(i1));
//true
System.out.println("Integer 包装对象和包装对象使用 == 比较 : " + (i2 == i3));
//false
System.out.println("Integer 包装对象和包装对象使用 equals 比较 : " + i2.equals(i3));
//true
System.out.println();
long l1 = 1000000000000000L;
Long l2 = new Long("1000000000000000");
Long l3 = new Long("1000000000000000");
System.out.println("Long 基本类型和包装对象使用 == 比较 : " + (l1 == l2));
System.out.println("Long 基本类型和包装对象使用 equals 比较 : " + l2.equals(l1));
System.out.println("Long 包装对象和包装对象使用 == 比较 : " + (l2 == l3));
System.out.println("Long 包装对象和包装对象使用 equals 比较 : " + l2.equals(l3));
System.out.println();
float f1 = 10000.111F;
Float f2 = new Float("10000.111");
Float f3 = new Float("10000.111");
System.out.println("Float 基本类型和包装对象使用 == 比较 : " + (f1 == f2));
System.out.println("Float 基本类型和包装对象使用 equals 比较 : " + f2.equals(f1));
System.out.println("Float 包装对象和包装对象使用 == 比较 : " + (f2 == f3));
System.out.println("Float 包装对象和包装对象使用 equals 比较 : " + f2.equals(f3));
System.out.println();
double d1 = 10000.111;
Double d2 = new Double("10000.111");
Double d3 = new Double("10000.111");
System.out.println("Double 基本类型和包装对象使用 == 比较 : " + (d1 == d2));
System.out.println("Double 基本类型和包装对象使用 equals 比较 : " + d2.equals(d1));
System.out.println("Double 包装对象和包装对象使用 == 比较 : " + (d2 == d3));
System.out.println("Double 包装对象和包装对象使用 equals 比较 : " + d2.equals(d3));
System.out.println();
boolean bl1 = true;
Boolean bl2 = new Boolean("true");
Boolean bl3 = new Boolean("true");
System.out.println("Boolean 基本类型和包装对象使用 == 比较 : " + (bl1 == bl2));
System.out.println("Boolean 基本类型和包装对象使用 equals 比较 : " + bl2.equals(bl1));
System.out.println("Boolean 包装对象和包装对象使用 == 比较 : " + (bl2 == bl3));
System.out.println("Boolean 包装对象和包装对象使用 equals 比较 : " + bl2.equals(bl3));
Boolean b22 = Boolean.valueOf("true");
Boolean b23 = Boolean.valueOf("true");
System.out.println("Boolean.valueof 创建包装对象和包装对象使用 == 比较 : " + (b22 == b23));
// true
什么是装箱?什么是拆箱? 装箱:基本类型转变为包装器类型的过程。
拆箱:包装器类型转变为基本类型的过程。
//JDK1.5之前是不支持自动装箱和自动拆箱的,定义Integer对象,必须
Integer i = new Integer(8);
//JDK1.5开始,提供了自动装箱的功能,定义Integer对象可以这样
Integer i = 8;
int n = i;
//自动拆箱
装箱和拆箱的执行过程? 【基本类型和包装类】装箱是通过调用包装器类的 valueOf 方法实现的
拆箱是通过调用包装器类的 xxxValue 方法实现的,xxx代表对应的基本数据类型。
如int装箱的时候自动调用Integer的valueOf(int)方法;Integer拆箱的时候自动调用Integer的intValue方法。
Integer i = 8;
//Integer i = Integer.value0f(8);
int n = i
//int n = i.intVlalue()
常见问题
- 包装类 valueOf 方法返回对象时,在常用的取值范围内,会返回缓存对象。
文章图片
- 浮点型的包装类 valueOf 方法返回新的对象。
- 包含算术运算会触发自动拆箱。
- 存在大量自动装箱的过程,如果装箱返回的包装对象不是从缓存中获取,会创建很多新的对象,比较消耗内存。
文章图片
此外,包装类的静态方法可以将一个数字字符串转换成数值
文章图片
API 注释说明了 Integer 类中包含的一些重要方法。其他数值类也实现了相应的方法。
文章图片
文章图片
推荐阅读
- Java学习|Java>获取Class对象的三种方式,及其Method、Field、Constructor对象的使用方法
- #yyds干货盘点#Java学习18
- java学习|JUC并发编程汇总彻底搞懂JUC
- 安卓逆向之Java学习-03
- Java学习——Applet写字符串(调字体)
- Java学习|[Java] 弄懂数组,这一篇就够了