关于Java字符串

本文讲述了Java中字符串new的创建过程,区分了String对象和直接创建的区别,并详细讲解了String、StringBuilder和StringBuffer在可变性、方法、线程安全性和性能上的差异。
摘要由CSDN通过智能技术生成

最近看java刚好看到string这里,简单做一下笔记,自己也加深一下印象

刚学不久,如有错误或不妥之处烦请大佬指正!!

对象new过程

先记一下普通对象new的过程

如Demo demo =new Demo(),

1. 第一步在栈区,做Demo=demo,创建demo对象的引用;

2. 第二步在堆区,做new Demo(),创建demo对象,注意括号意思是创建对象后立即调Demo的构造函数对demo对象进行初始化;

3. 第三步把栈区的demo引用指向堆区的demo对象。

String的两种new

众所周知,java字符串有两种创建格式。

第一种是new对象:String =new,参数为要创建的字符串

第二种直接创建:String=

new和直接创建区别

粗略理解

直接创建就是所有以""创建的字符串在常量池中,整个过程只创建一个String对象,调用字符串检查是不是在常量池,不在就创建,在就复用。直接常见结果是存在常量池中

而new对象:每次new一个就调一块内存,两个字符串如果内容一样,但地址不一样。new对象存在堆区中;

注意:string中的类似赋值操作实际不是赋值,而且改变引用的指向

详细说明new String和String

1. 首先明确堆栈区

堆栈:堆区存对象;栈区存基本数据类型和引用

2. 分析String str="xxx"过程

第一步先在栈区创建str引用,然后去常量池中找指向内容为xx的字符串对象(常量池专用存储不可修改量如产量,独立于堆栈);如果没有,在堆区创建对象xx,然后把str指向该对象;如果有,直接把str指向该对象。如再创建一个str2还是xx,只需要把str2指向xx即可,不创建新对象。

注意此时如果用==比较str和str2,结果相等,因为对于引用类型比较的是地址,而两个地址肯定相同。但注意如果进行字符串拼接后的内容相同,此时比较结果不相等,因为虽然拼接的内容一样,但拼接是开辟一块新内存存储这个拼接后的新对象,地址不一样

3. 分析new String

如new,是在堆区直接创建对象xx,然后在栈区创建引用指向堆区的对象str3。注意如果再创建一个相同内容的str4,是重新创建新对象让str4指向这个新对象。

此时==比较不相等,因为比较的是引用类型比较的是地址,两个地址显然不相等

String,StringBuilder,StringBuffer区别

这里我是查了很多资料的,也写一下记录一下自己的理解

首先明确,三者毋庸置疑都是操作字符串的。

区别一:String创建的字符串不可被修改,后两个可以创建可变长度字符串。后两个new的参数可以是int,意思是创建该长度的字符串,而String的new不能带int参数

区别二:String和后两个都可调内置方法length(),得到字符串长度。但后两个还有内置方法capacity()得到字符数组总容量,可以大于字符串长度。而且后两个可使用String的所有内置方法

区别三:String和后两个可以互转。SB调toString()方法转String对象,SB构造函数把String转SB对象。这个用于String先转SB然后调内置reverse()方法进行字符串反转

区别四:SBF线程安全,SBB线程不安全,速度快。运行速度SBB大于SBF大于S。S在字符串拼接方面性能最差,因为S为字符串常量,后两个都是变量。S一旦创建不可修改,所以每次拼接都要不断创建对象,而后两个可以直接在同一个对象操作

关于字符串拼接原理:对String类型字符串常量,如给str=abc拼接de,过程是第一次创建对象str,把abc赋值给str;第二次创建新对象也叫str,把abc和de拼接起来赋给这个 新的str;第一次创建的str被垃圾回收机制回收。因此这种对S对象的操作在不断创建对象,导致速度慢。而后两个直接改字符串,无创多余对象和回收机制,速度快

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

genshin lover

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

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

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

打赏作者

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

抵扣说明:

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

余额充值