Java剖析String类

2020-02-13  本文已影响0人  南在南方i

String类对象的两种实例化方法

String并不是一个基本数据类型,它本身属于一个类。但是这个类在设计的过程之中加入了属于Java的特殊支持,所以对于这个类的对象实例化方式有两种形式


String的相等比较

如果说现在有两个int型的变量,要进行相等的判断,则直接使用“==”即可;如果进行String的比较,我们可先用“=="尝试:

class StringDemo{
    public static void main(String[] args){
        String steA = "hello";
        String steB = new String("hello") ;
        String steC = steB;
        System.out.println(steA == steB);//false
        System.out.println(steB == steC);//true
        System.out.println(steA == steC);//false
    }
}

发现结果并不相等,此时我们发现问题,字符串的内容实际上都是一样的,而在使用“==”比较结果是\color{red}{flase},具体原因如下图所示:

String内存关系图
代码如下:
class StringDemo{
    public static void main(String[] args){
        String strA = "hello";
        String strB = new String("hello") ;
        String strC = strB;
        System.out.println(strA.equals(strB));//true
        System.out.println(strB.equals(strC));//true
        System.out.println(strA.equals(strC));//true
    }
}

\color{red}{由于内容是可控的因素而地址是不可控的因素,因此只要是字符串的比较都使用equals()完成}

面试题:请解释在String比较中”==“与"equals()"的区别

String匿名对象

任何的编程语言都不会提供有字符串这一数据类型,字符串的描述在很多语言之中都是用字符数组表示,而在Java的设计之初为了解决这样的问题,专门提供了一个String类来进行描述。但是随着发展,为了能够让程序变得更加的易于开发,所以在Java里面也提供双引号声明的数据,而这些数据,在Java中并不是普通的变量,而是String类的匿名对象

String 字符串对象 = "字符串";本质:就是为一个字符串的匿名对象起了一个名字


String类两种实例化对象的区别(核心)

此时对于String类的声明方式有两种,那么这两种方式到底应该使用哪一种,以及每种方式的区别

分析String类对象直接实例化的形式

开辟一块堆内存空间,并且开辟一块栈内存空间将直接指向该堆内存

观察以下代码:

class StringDemo{
    public static void main(String[] args){
        String strA = "hello";
        String strB = "hello";
        String strC = "nihao";
        System.out.println(strA == strB);//true
        System.out.println(strB == strC);//false
        System.out.println(strA == strC);//false
    }
}

\color{red}{此时我们可能有疑问,为何使用"=="运算关系符strA仍然与strB相等,在接下来我们会得到这个答案}
内存关系图如下:

内存关系图

关于对象池的概念(Object Pool):

回到上方的疑问:由于对象池的存在,当若干个字符内容相同时,地址是完全相同的,所以“==“的结果也是相同的,这样的设计就是共享设计模式

分析String类利用构造方法实例化对象的形式

代码如下:

class StringDemo{
    public static void main(String[] args){
        String str = new String("hello");
        System.out.println(str);
    }
}

内存关系图如下:

内存关系图

分析以上情况:

面试题:请解释String类两种对象实例化的区别

字符串一旦声明不可改变

观察以下代码:

class StringDemo{
    public static void main(String[] args){
        String str = "hello ";
        str += "world";
        str += "!!!";
        System.out.println(str);
    }
}

分析内存关系:

内存关系图

可以发现整个的操作流程之中,都是String类对象的引用发生着改变,而字符串本身的内容并没有改变,这样的操作会产生大量垃圾,因此杜绝使用


总结

上一篇 下一篇

猜你喜欢

热点阅读