Java中的string

String类的两种实例化方式

1.直接赋值: String str = "ww";

2.构造方法:

构造方法: public String(Stringstr),在构造里面依然要接收一个String类对象;

Stringstr =new String("www");

String类字符串的比较

“==”比较字符串:

stra和strb值是一样的,但是结果却是false,这是因为“==”比较String对象上表示的是内存地址的比较

我们再来看看在内存中是如何比较的

可以很明显的看出地址是不一样的。

这时候就有了equals()方法,这个方法由String类提供,使用时要区分大小写

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

1.直接赋值

直接赋值时的堆内存自动引用

这就有了一个问题,为什么这时候的“==”生效了了呢?来看看内存分析

所有相同字符串的内存都指向到了同一块空间里面,这就引出了一个共享设计模式的概念。

共享设计模式:在JVM底层实际上存在一个对象池(不一定只保存String类),当用直接复制的方法定义了一个String类对象时,会将这个字符串使用的匿名对象入池保存,之后再有新的变量以直接赋值的方式,且内容一样,那么就不会新开辟空间,而是使用已经存在的对象分配,继续使用。

2.构造方法实例化String类对象

调用String类中的构造方法进行String类对象的实例化操作,那么一定要使用关键字new,而每当使用了使用了关键字new就表示要开辟新的堆内存空间,而这块堆内存空间的内容就是传入到构造方法中的字符串数据。

我们可以看出使用构造方法进行String类对象实际开辟了两块堆内存空间(其中一块会成为垃圾空间),这样会造成内存浪费, 如果构造方法String类对象对象,其内存不会入池,因为是new出来的,只能使用手动的方式使它入池。

于是就有了一个方法手动将他推进坑里面

平时在使用String类时,经常会有这样的用法

他在内存里面是这样执行的,他通过不停地开辟新空间和指向来改变字符串的最终内容

今天的分享就到这里了,大家看完后学会了吗?

欢迎评论留言,提供建议和思路,如果觉得文章对您有用就加个关注啦~~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190221A1EVF000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券