Java基础学习之String类

String 是一个字符串类型的类,使用“ " ”定义的内容都是字符串,但是String本身毕竟是一个类,虽然这个类在使用上会有一些特殊,但是我们必须从类的角度与内存关系上来分析这个类的作用。

String的两种实例化方式

在之前使用过String,最早使用的时候是直接采用了“String 变量名 = "字符串";”语法完成的。这种形式称为直接赋值。

字符串的比较:

如果说现在有两个int型整数想要判断其是否相等,可以使用“==”符号完成

“==” 现在的确是进行了比较,但是比较的内容并不是字符串对象包含的内容,而是他们所在的内存地址的数值,所以“==”是属于数值比较 ,比较的是内存地址

而如果说现在要想去比较字符串内容的话,那么可以使用String里面定义的方法    :

        比较内容(与原始定义有一些差别) : public boolean equals(String str);

在以后的开发之中,只要是进行字符串的相等判断,千万不要使用“==”完成

    在字符串相等的判断中“==”与“equals()”的区别

        -->“==”是Java提供的关系运算符,主要的功能是进行数值相等判断的,如果用在String对象上表示的内存地址数值的比较

        -->“equals()”是由string提供的一个方法,此方法专门负责进行字符串内容的比较


字符串常量就是String的匿名对象

实际上任何语言都没有提供字符串这一概念,很多的语言里面都是使用了字符数组来描述的字符串的概念。在Java里面也没有字符串的概念,但是所有的开发里面都不可能离开字符串的应用,那么最终的结果是,Java自己创造了字符串。但是这个字符串依然不属于基本数据类型,它是将字符串作为了String类的匿名对象的形式存在的

匿名对象保存在堆内存里

那么所谓的直接赋值实际上相当于将一个匿名对象设置了一个名字而已,但是惟一的区别是,String类的匿名对象是由系统自动生成的,不用由用户自己直接创建

小小技巧:为了避免空指向异常的出现,可以将字符串写在前面调用方法


共享设计模式:

在JVM的底层实际上会存在有一个对象池(不一定只保存String对象),当代码之中使用了直接赋值的方式定义了一个String类对象时,会将此字符串对象所使用的匿名对象入池保存,而后如果后续还有String类对象也采用了直接赋值的方式,并设置了同样内容的时候,那么将不会开辟新的堆内存空间,而是使用已有的对象进行引用分配,从而继续使用。


2、采用构造方法实例化

构造方法如果要使用一定要用关键字new,一旦使用了关键字new就表示要开辟新的堆内存空间。

如果使用的是构造方法进行String类对象实例化的时候,那么最终的操作形式就变为了开辟两块堆内存空间,其中有一块堆内存空间将成为垃圾空间。

除了内存的浪费之外,如果使用了构造方法定义的String类对象,其内容不会保存在对象池之中因为是使用了关键词new开辟的新内存。如果现在希望开辟的新内存数据也可以进行对象池保存,那么可以使用String类定义的一个手工入池的方法:public String intern();


String类对象两种实例化的区别:

直接赋值(String str = "字符串"):只会开辟一块堆内存空间,并且会自动保存在对象池之中以供我们下次重复使用;

构造方法(String str = new String("字符串")):会开辟两块堆内存空间,其中有一块空间将成为垃圾,并且不会自动入池,但是用户可以使用intern()方法使其入池。

字符串常量一旦被定义则不可改变


总结:

String类的特点:

String类对象的相等判断使用equals()方法完成“==”实现的是地址数值的比较

字符串内容一旦声明则不可改变,String类对象内容的改变是依靠引用关系的变更实现的

String类有两种实例化方式,使用直接赋值可以不产生垃圾空间,并且可以自动入池,不要使用构造方法完成。

你可能感兴趣的:(Java基础学习之String类)