Java作业笔记1:String的两种创建方式 & 两种比较方式

目录

一、两种创建方式:

1.直接赋值:

2.new创建:

二、两种比较方式:

1.==:

2.equals():

三、补充知识点:

1.字符串常量池

四、文章参考:


一、两种创建方式:

1.直接赋值:

创建0/1个对象,存储位置在常量池(String pool)

原理过程:常量池中还没有某字符串则创建,并返回其引用地址;常量池中已经有该字符串则不在创建,直接返回其地址。

2.new创建:

创建1/2个对象,存储位置在常量池和堆(Heap)

原理过程:常量池中还没有某字符串则创建,然后再在堆中创建某字符串,并返回堆中的地址;

常量池中已经有该字符串则不在创建,但堆中仍会创建某字符串,并返回堆中的地址。

解释:常量池只能有一个某字符串,堆中可以有任意个。

二、两种比较方式:

1.==:

比较 基础数据类型 或 引用类型

基础数据类型:比较值

        基础数据类型有:byte1 short2 int4 long8 float4 double8 boolean? char2

引用类型(对象):比较地址

2.equals():

只能用于比较 引用类型

方法未被重写:equals方法最开始定义在超类Object中,比较的是引用的地址。

方法被重写:对于String类,equals方法比较的是字符串的内容。

三、补充知识点:

1.字符串常量池

(String类型为什么可以直接赋值?就和它有关)

String类是我们平常项目中使用频率非常高的一种对象类型,jvm为了提升性能和减少内存开销,避免字符的重复创建,其维护了一块特殊的内存空间,即字符串池,当需要使用字符串时,先去字符串池中查看该字符串是否已经存在,如果存在,则可以直接使用,如果不存在,初始化,并将该字符串放入字符创常量池中。

使用new String赋值不可以吗?可以,但是我们不开发中不建议用new String()的方式去创建字符串,原因如下:
两种创建方法的区别:
1. String str1= “abc”; 在编译期,JVM会去常量池来查找是否存在“abc”,如果不存在,就在常量池中开辟一个空间来存储“abc”;如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str1的空间,来存储“abc”在常量池中的地址值。

2. String str2 = new String("abc") ;在编译阶段JVM先去常量池中查找是否存在“abc”,如果过不存在,则在常量池中开辟一个空间存储“abc”。在运行时期,通过String类的构造器在堆内存中new了一个空间,然后将String池中的“abc”复制一份存放到该堆空间中,在栈中开辟名字为str2的空间,存放堆中new出来的这个String对象的地址值。

也就是说,前者在初始化的时候可能创建了一个对象,也可能一个对象也没有创建;后者因为new关键字,至少在内存中创建了一个对象,也有可能是两个对象。

四、文章参考:

Java字符串池(String Pool)深度解析 - 风中程序猿 - 博客园 (cnblogs.com)

(1条消息) java中String new和直接赋值的区别_liuhmmjj的博客-CSDN博客_java string 赋值

(1条消息) Java:String类型为什么可以直接赋值?使用new String赋值不可以吗?_@阿证1024的博客-CSDN博客_string为什么可以直接赋值

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值