在JAVA中,有三个比较特殊的类,分别是String类,Object类,包装类。它们是三个的特殊之处各不相同的类,
容我在后文一一介绍。
1.String类:
String类有两种实例化方式,分别为直接赋值和构造方法赋值。
例如:
String str1="Hello World";
String str2=new String ("Hello World");
当用 ==比较时,输出的是false。但用equals方法比较时,输出的却是true。
当用==比较时,比较的是两个字符串的地址。用equals方法比较的是两个字符串的内容。
导致这种结果的原因是两种实例化方试有本质的区别,
直接赋值没有开辟新的堆内存,原因是String类的设计使用了共享设计模式,在JVM底层会自动维护一个对象池,
如果采用直接赋值的模式进行String类的对象实例化操作,该实例化对象会自动保存到这个对象池之中。并且下次使用
的时候直接引用即可。
所以两者主要区别为:
1. 直接赋值:只会开辟一块堆内存空间,并且该字符对象可以自动保存在对象池中以供下次使用。
2.构造方法:会开辟两块堆内存,其中一块成为垃圾空间,不会自动保存在对象池中,可以使用intern()
方法手工入池。
字符串常量是不可变更的,修改字符串的内容,实际是重新开辟了空间,将修改后的内容放进去,此操作会产生垃圾空间。
为了方便修改字符串,提供了StringBuffer类,而且不会产生大量的垃圾空间。
需要注意的是在String中使用+来进行字符串连接,而在StringBuffer类中,需要用append()方法。
2. Object类:
Object是所有类的默认父类,即所有类的对象都可以使用Object进行接收。
因为Object是所有类的父类,可还可以接收所有的引用数据类型,包括:类、数组、接口。
3.包装类:
在Java中数据类型分为基本数据类型和引用数据类型,Object类可以接收所有引用数据类型,包装类就是
将基本数据类型封装到类中,让object来接收。
包装类与基本数据类型处理之中存在两个概念:
装箱:将基本数据类型变为包装类的对象,利用每一个包装类提供的构造方法实现装箱处理。
拆箱:将包装类中包装的基本数据类型取出。
Integer num=new Integer(55);//装箱
int data=new.intvaule();//拆箱
//自动装箱
Integer x=55;
当装箱的数据进行比较是,最好用 equals方法比较,因为 Integer var= ? 在-128到127之间赋值,Integer对象在IntegerCache.cache产生,会复用对象,这个区间内的Integer值可以直接用==判断。这个区间以外的所有数据,会在堆上产生,并不会复用对象。 由于==比较的是地址,因此即使数值一样,地址不同,也会是false。