最近看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对象的操作在不断创建对象,导致速度慢。而后两个直接改字符串,无创多余对象和回收机制,速度快