JVM中对象包括String

创建对象的方式
new 关键字,调用构造器进行创建
‘或者采用反射方式创建对象Class的Constructor的newInstance方式创建对对象,可以调用空参数或者带参数的构造器

使用clone方式创造一个对象并且不会调用任何构造器
当前类需要实现clone接口或者clone方法

使用反序列化。从二进制流中还原一个对象
或者第三方库

JAVA创建对象六大步骤:
1.在这里插入图片描述1.先将对象的类加载进来
2.分配内存空间
指针碰撞法分配内存空间,内存规整情况下用指针碰撞法,不规整情况下,空闲列表分配法,在空闲列表里去记录哪些空间可以用,哪些不能用
3,处理并发安全问题
在这里插入图片描述4初始化分配空间,将对象的属性值进行默认初始化
5.设置对象的对象头,将堆空间中对象和对象引用,关联到一起
6,执行init方法,相当于给变量赋值,用构造器去赋值
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
两个java数据对象定位方式
句柄访问方式,两个指针进行访问

在这里插入图片描述
直接访问方式
在这里插入图片描述
直接访问方式比较好,只要一个指针,还节省空间
句柄方式相对来说比较稳定。

对象元数据区中的hash值,就是对象在堆空间中的地址,交给栈空间中对象名。

在这里插入图片描述
元数据区的hash值,就是堆空间中对象的地址,也就是交给那个栈空间变量的东西。

两种方法,定位对象,句柄访问,或者直接指针访问。

对象嘛,当然就是类加实例数据组成的。

String简单介绍一下
String是final的,不可修改不可继承
在这里插入图片描述
String不可变性体现:
在这里插入图片描述
String abc = "adfsad"使用字符串定义方式
直接字面量赋值的方式,是
字符串定义方式,是使用的字符串常量池,字符串常量池中绝对不允许重复。
在这里插入图片描述
这种情况重新开辟一个空间,存储s1
z字符串常量池不可以修改,只能重新,分配地址
在这里插入图片描述
在这里插入图片描述
字符串拼接时候,最关键的点是看,这东西是常量还是变量???????字面值看,常量是和变量是相通的,但是实际上变量会开辟新的内存空间,所有所有变量的拼接,结果都是不一样,变量拼接并并没有经过字符串常量池。
变量和常量的关系有点像人命和钱一样,花钱买命是政治不正确的,但是出了事,还真是可以花钱买命,用经济补偿换一些东西。

字符串拼接操作:
在这里插入图片描述
在这里插入图片描述
字符串常量池中没有重复的东西,所以地址必然一样。
使用字面量的方式来赋值
String abc = ""放进字符串常量池中,也是引用字符串常量池
在这里插入图片描述
S8 == S6.intern方法是true

不用字面量拼接的话,会创造新的变量,只要有String对象拼接,就会创造新的对象,在堆空间中,而不是字符串常量池中
intern是一个做判断的方法,看看字符串常量池中有没有这个,如果有就返回常量池中的那个,没有的话,就在常量池中,创建一份,就相当于将new 这种方法,直接给优化了。本来new出来的东西不进常量池的。
在这里插入图片描述
左右两边只要是常量,就是引用字符串常量池

Str v= str + ""创建了无数个StringBuilder每次都创建
远不如StringBuiler sb.append()这个方法,因为只要一个StringBUilder
.
在这里插入图片描述
这样StringBuillder不会扩容,StringBuilder扩容要复制,然后需要创建新的空间,占用新的空间。

intern方法主要就是可以保证对象指向的是字符串常量池中的数据。
String str = “abc”
或者String str = new String().intern最终是字符串常量池。

new String(“ab”)会创建两个对象,一个放在常量池中作为战略资源储备,但是对象指向的只是堆中的那个
除非老兄你加了个intern()
在这里插入图片描述常量池子中没有ab,因为拼接是StringBUilder

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值