又在重提往事么?谁不是知道"=="和equals之间的区别呢?
之所以把这个加入的文章队列里是因为他也是一个在Java中及角旮旯的问题。
不信的话请看如下的例子
class A{
public static void main(String[] args){
Integer i1 = 12;
Integer i2 = 12;
Integer i3 = 1000;
Integer i4 = 1000;
System.out.println(i1==i2);
System.out.println(i3==i4);
}
}
结果是什么呢?
结果是 true false 这太神奇了!怎么可能呢?试着说出为什么呢
再看一个例子
class A{
public static void main(String[] args){
Byte b1 = '1';
Byte b2 = '1';
System.out.println(b1==b2);
Character c1 = 'a';
Character c2 = 'a';
System.out.println(c1==c2);
Character c3 = '\u0080';
Character c4 = '\u0080';
System.out.println(c3==c4);
}
}
这个结果是什么?
结果是 true true false; 一定又开始奇怪了,上一个例子的Integer 和 这里的Character为什么使用(==)会变成这样。
经过你仔细的观察会发现,例子中都是基本型的包装型,大家都知道其相互转换的过程称之为"装箱","拆箱",并且可以"自动装箱"、"自动拆箱"。如上的代码都使用了"自动装箱"来赋值给引用变量。这里一条关键的原则,可能叫原则,我也不知道是不是应该叫做原则,反正是个真理。
在使用下面包装器对象的两个实例使用自动装箱生成,当他们的基本值相同,他们总是==的关系。
Booelan
Byte
从\u0000到\u007f的字符 (0 - 127)
-128 - 127 Short 和 Integer
+1000>+127
'\u0080'>'\u007f'
这样就可以解释上面的问题了,这其实都是为了节省内存而偷的懒,如果使用内存小于1字节(8位)的话这解封装类就会自动拆箱来做==运算。
如果是强制装箱的话就不会有这样的问题了如:
class A{
public static void main(String[] args){
Integer a = 1000;
Integer b = 1000;
Integer c = new Integer(12);
Integer d = new Integer(12);
System.out.println(a==b);
System.out.println(c==d);
}
}
这样结果就是 false false 了
分享到:
相关推荐
Java中的包装类是Java语言为每个基本数据类型提供的一个引用类型对应,它们使得基本数据类型具备了面向对象的特性,从而在需要使用面向对象编程思想处理基本数据类型时提供了便利。包装类包括Integer、Character、...
java 包装类练习 Java 包装类是 Java 语言中的基本类型的对象表示形式,用于提供包装基本类型的对象。Java 包装类包括 Boolean、Byte、Character、Short、Integer、Long、Float 和 Double 八种。 1. Long 包装类型...
### 动力节点老杜Java基础入门学习教程分享——常用类 #### String 类 - **不可变性**:`String` 类是不可变的,这意味着一旦一个 `String` 对象被创建,它的值就不能被更改。例如,如果你有一个 `String s = ...
Java编程语言提供了八种原始数据类型,包括byte、...了解并熟练掌握这些知识点,能帮助开发者更好地使用Java的包装类,提高代码的可读性和可维护性。在实际开发中,合理利用包装类的特性,可以提升代码质量和效率。
《KJava深入浅出——Java在PDA上的程序设计》是一部专为开发者设计的指南,旨在帮助读者理解和掌握如何在个人数字助理(PDA)上使用Java进行程序开发,特别是KJava技术。KJava是Java的一种轻量级实现,特别针对资源...
Java包装类是Java编程语言中的一个关键特性,主要用于将基本数据类型(如int、char、boolean等)与对象之间进行转换。这是因为Java的API库中许多类和方法都设计为接收或返回对象,而基本类型不是对象。为了解决这个...
- **封装**:封装是指将数据和操作这些数据的方法包装在一个单一的单元(即类)中,隐藏了对象的内部实现细节。这种机制保护了数据的安全性,并允许我们在不影响外部代码的情况下更改内部实现。 - **继承**:继承是...
但在Java中不能定义基本类型(primitive type),为了能将基本类型视为对象来处理,并能连接相关的方法,Java为每个基本类型都提供了包装类,这样,我们便可以把这些基本类型转化为对象来处理了。这些包装类有:Boolean...
2. **自动装箱与拆箱**:在JDK 5.0中,基本类型与对应的包装类之间可以自动转换,使得编程更加简洁。如Integer与int之间的转换无需手动进行。 3. **枚举类型(Enum)**:Java 5.0添加了枚举,用于定义一组固定的...
在Java编程语言中,包装类(Wrapper Classes)扮演着至关重要的角色,它们是Java为每种基本数据类型提供的一种对象表示形式。这些包装类使得基本数据类型能够参与到面向对象的编程中,如方法参数传递、集合操作等。...
Java 包装类、拆箱和装箱详解 Java 语言作为一门典型的面向对象编程语言,然而其八种基本数据类型并不支持面向对象编程。这些基本类型的数据不具备“对象”的特性——不携带属性、没有方法可调用。为了解决这个问题...
在Java编程语言中,为了使基本数据类型也能具备对象的特性,例如调用方法等,Java为每一种基本数据类型提供了对应的包装类。这些包装类不仅提供了丰富的操作接口,还能够帮助开发者更加方便地处理基本数据类型与对象...
- java.applet:Applet类是用于创建小程序的类,小程序是一种可以通过网络下载并在浏览器或小程序查看器中运行的Java程序。 - java.lang接口:这是Java语言的基础包,包含了Java程序最基本的类和接口,如String、...
Java 八大基本类型和包装类 Java 中有八大基本类型,分别是整型、浮点型、布尔型和字符型,每种类型都有其特点和应用场景。 整型包括 byte、short、int 和 long 四种,分别表示 8 位、16 位、32 位和 64 位的整数...
在Java编程语言中,接口(Interface)和包装类(Wrapper Class)是两个核心概念,它们在实际开发中扮演着至关重要的角色。接口提供了一种定义规范的方式,而包装类则是基本数据类型与对象世界之间的桥梁。现在让我们...