JAVA中三个特殊的类String,Object,包装类

1.String类
String有两种赋值方式

1)直接赋值
String str = “Hello” ; // str是一个对象,那么”Hello 就应该保存在堆内存中
这种赋值方式为常用。但是String本身毕竟是一个类,既然是类,那么类中一定存在构造方法。String类也不例外
2)传统赋值
String str = new String(“Hello”);

字符串的相等比较

现在两个字符串内容相同,而使用“==“得到的结果不同。”==”本身是进行数值比较的,如果现在用于对象比较,那么所比较的就应该是两个对象所保存的内存地址数值比 较,而并没有比较对象的内容。
那么要想比较内容比较,则必须采用String类提供的equals方法。 范例:使用equals方法比较字符串内容

面试题:请解释String类”==”与”equals”的区别
1. ”==”:进行的数值比较,比较的是两个字符串对象的内存地址数值。
2. “equals()”:可以进行字符串内容的比较

String str1 = “Hello” ;
String str = new String(“Hello”) ;
System.out.println(str1==str); // false
使用new就会产生新的实例化对象,所以str1和str的地址不同。不能用==比较

 String str1 = "hello" ; 
 String str2 = "hello" ;   
 System.out.println(str1 == str2); // true 
 System.out.println(str1 == str3); // true  
 System.out.println(str2 == str3); // true

在JVM底层实际上会自动维护一个对象池(字符串对象池),如果现在采用了直接赋值的模式进行String类的对象 实例化操作,那么该实例化对象(字符串内容)将自动保存到这个对象池之中。如果下次继续使用直接赋值的模式 声明String类对象,此时对象池之中如若有指定内容,将直接进行引用;如若没有,则开辟新的字符串对象而后将 其保存在对象池之中以供下次使用

2.Object类
Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的。默认会继承Object父类。
即,所有类的对象都可以使用Object进行接收。
1)获取对象信息
2)接收引用数据类型
在之前已经分析了Object可以接收任意的对象,因为Object是所有类的父类,但是Obejct并不局限于此,它可以 接收所有数据类型,包括:类、数组、接口
Object真正达到了参数的统一,如果一个类希望接收所有的数据类型,就是用Object完成。
3.包装类
1)基本原理
包装类就是将基本数据封装到类中

class IntDemo { 
 private int num ;   
public IntDemo(int num){
this.num=num;
}
 public int intValue() {  
 return this.num ;     } 
 }

这个时候的IntDemo实际上就是int数据类型的包装类,利用IntValue就可以实现基本数据类型变为对象的需求
2)装箱与拆箱
装箱:将基本数据类型变为包装类对象,利用每一个包装类提供的构造方法实现装箱处理。
拆箱:将包装类中包装的基本数据类型取出。利用Number类中提供的六种方法。

class IntDemo { private int num ; public IntDemo(int num) { this.num = num ; } public int intValue() { return this.num ; } }
public static void main(String[] args) { // 子类对象向上转型 Object obj = new IntDemo(55) ; IntDemo temp = (IntDemo) obj ; // 向下转型 System.out.println(temp.intValue()); // 取出里面的基本数据类型操作 }

   Integer num = new Integer(55) ; // 装箱 
   int data = num.intValue() ; // 拆箱 
    Integer num1 = new Integer(10);
    Integer num2 = new Integer(10) ; 
    System.out.println(num1 == num2);     
    System.out.println(num1 == new Integer(10));   
    System.out.println(num1.equals(new Integer(10)));

说明:对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象是在IntegerCache.cache 产生,会复用 已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产 生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。

猜你喜欢

转载自blog.csdn.net/weixin_40909099/article/details/79950739