Java的String类

String类

定义:在Java中,数组和String字符串都不是基本数据类型,它们被当作类来处理,是引用数据类型。引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用变量。在java里面除去基本数据类型的其它类型都是引用数据类型,自己定义的class类都是引用类型,可以像基本类型一样使用。

1.实例化方式

l.直接赋值
eg:

String str = "hello  world";//str是一个对象,所以"hello world"应该保存在堆内存中
System.out.println(str);

ll.构造法
eg:

String str = new String ("hello  world");
System.out.println(str);
2. 字符串相等比较

eg:int类型比较

        int a = 9;
        int b = 9;
        System.out.println(a == b);

输出如下:
在这里插入图片描述
eg:String类型比较

      String str = "hi";
      String str1 = new String("hi");
      System.out.println(str == str1);

输出如下:
在这里插入图片描述
内存图分析如下:
在这里插入图片描述
在这里插入图片描述
== 本身是进行数值比较的,如果现在用于对象比较,那么所比较的就应该是两个对象所保存的内存地址数值比
较,而并没有比较对象的内容。

那么要想比较内容比较,则必须采用String类提供的equals方法。

eg:使用equals方法比较字符串内容

        String str = "hi";
        String str1 = new String("hi");
        System.out.println(str.equals(str1));

输出如下:
在这里插入图片描述
#### String类中 == 和 equals的区别
1. ”==”:进行的数值比较,比较的是两个字符串对象的内存地址数值。
2. “equals()”:可以进行字符串内容的比较

3.实例化的区别
3.1采用直接赋值
        String str1 = "hello";
        String str2 = "hello";
        String str3 = "hello";
        System.out.println(str1 == str2);
        System.out.println(str1 == str3);
        System.out.println(str2 == str3);

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

3.2采用构造方法
String str = new String("hello");

在这里插入图片描述
如果使用String构造方法就会开辟两块堆内存空间,并且其中一块堆内存将成为垃圾空间。除了这一缺点之外,也会对字符串共享产生问题。

String类中两种对象实例化的区别
  1. 直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
  2. 构造方法:会开辟两块堆内存空间,其中一块成为垃圾空间,不会自动保存在对象池中,可以使用
    intern()方法手工入池。
4.字符串不可变更

字符串一旦定义不可改变。所有的语言对于字符串的底层实现,都是字符数组,数组的最大缺陷就是长度固定。在定义字符串常量时,它的内 容不可改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值