(学习笔记)String 引用数据类型

String

以下内容皆为本人在查看了相关文章后自己对内容的理解和分析,如有错误,请不吝评价~

String 在java的开发中使用频率极高,但它和基础数据类型不同(四类(整型,布尔,浮点,文本)八种(byte,short,int,long,float,double,boolean,char)),它是引用数据类型,因此它创建(new)的时候,其实是在堆中创建对象,但在栈中储存该对象的地址值,当调用对应的String时,实际上是通过地址值去获得对象。引用数据类型的共同点
举个例子:String pure = new String(“pure”);

pure名储存在栈中,方便调用,而只要是new的所有东西都会在堆中开辟空间进行储存,最后的字面值(literal)“pure”则是放在常量池中,而常量池归属于方法区,并且它一旦创建是不会再改变的(点进String类中可以发现,String是被final修饰的),因此如果想要通过String补充对象中的内容,看似是直接添加,源码中是重新创建了一个新的对象并进行储存,给这个String重新的地址值以用来调用,工作中一般不使用String进行内容的添加,而是StringBuffer/StringBuilder,他们的添加是在原有内容的基础上直接进行添加,更加快捷,String的添加源码实际也是通过他们进行实现的。
讲到这里,就要说一个比较经典的String判断案例

String a = "abc";
String b = new "abc";
String c = "ab" + "c";
String d = "ab";
String e = "c";
String f = d + e;
String g = "ab" + e;
System.out,println(a==b?true:false); // false
System.out,println(a==c?true:false); // true
System.out,println(a==f?true:false); // false
System.out,println(a==g?true:false); // false

第一个false:不new的方式创建的对象,是在常量池中先找有没有“abc”,没有的话再创建“abc”,并使用其地址值,b是new,则是在堆中创建的对象,两个引用的方向不对,==在对引用数据进行比较的时候,比较的是他们的地址值,在对基础数据类型比较才是比较内容(如果要对基础类型进行比较应该使用equals),因此为false

第二个true:c会对字符串进行拼接(对于常量来说,c会直接将他们进行拼接),然后在常量池中查找是否有相同的值,如果有,则直接引用该地址值,没有的话再进行创建,很显然,a已经在常量池中进行创建了,因此a和c引用的是同一个地址值,理应为true;

第三个false:对象的拼接实际上是new 的过程,相当于在堆中开辟新的空间保存数据,然后该对象使用该数据的地址值,因此为false;

第四个其实和第三个原理相同,不多赘述

String和StringBuffer,StringBuilder的区别
String 被final修饰,而后两者都可以直接对字符串进行拼接(append)
StringBuffer和StringBuilder相较String处理速度更高效
StringBuffer 和 StringBuilder功能相雷同,区别就是StringBuffer是线程安全的,因此多用于多线程的场景,减少线程安全问题;
在这里插入图片描述
而StringBuilder多用于单线程,因为它为了提高效率,牺牲了锁/同步代码块的开销。
在这里插入图片描述

感想:看着容易理解,但实际敲一遍效果和看一遍还是有天壤之别的,这也说明了理论和实践同样重要,希望能坚持每天写!
ps:还在学习中,希望大牛们发现上面理解和代码中存在的问题能在评论中指出~感谢
(没有感情的复制怪~)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淳杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值