java string部分比较_java定义字符串的两种方式的比较

大家都知道,java定义字符串有两种方式。

1.直接赋值

public class StringDemo{

public static void main(String[] args) {

String str1 = "791202.com";

String str2 = "791202.com";

String str3 = "791202.com";

String str4 = "791202.cn";

System.out.println(str1==str2);

System.out.println(str1==str3);

System.out.println(str2==str3);

System.out.println(str1==str4);

}

}

1

2

3

4

5

6

7

8

9

10

11

12

publicclassStringDemo{

publicstaticvoidmain(String[]args){

Stringstr1="791202.com";

Stringstr2="791202.com";

Stringstr3="791202.com";

Stringstr4="791202.cn";

System.out.println(str1==str2);

System.out.println(str1==str3);

System.out.println(str2==str3);

System.out.println(str1==str4);

}

}

输出结果

true

true

true

false

1

2

3

4

true

true

true

false

2.构造方法实例化

public class StringDemo{

public static void main(String[] args) {

String str1 = new String("791202.com");

String str2 = "791202.com";

System.out.println(str1==str2);

}

}

1

2

3

4

5

6

7

publicclassStringDemo{

publicstaticvoidmain(String[]args){

Stringstr1=newString("791202.com");

Stringstr2="791202.com";

System.out.println(str1==str2);

}

}

输出结果

false

1

false

两种方式的区别比较

第一种直接赋值定义

“==”虽然是一种字符串的比较,但是它实际上比较的并不是字符串的内容,而比较的是它们所在的内存地址的数值。可能会有疑惑,字符串的直接赋值,会产生一个新的堆内存空间,那么这里应该产生了三块堆内存空间,并且有不同的三个内存地址才对,但这里为什么会出现str1和str2和str3的内存地址是相同的呢?

第一种字符串的直接赋值方式,会给字符串赋予一个“名字”(其实就是堆内存的地址),并且开辟一段新的堆内存(存数据)。

那为什么这里会出现str1,str2,str3同时指向同一块堆内存?

因为JAVA有一个共享设计池(常量池)的概念

什么是共享设计模式?

在JVM底层实际会存在一个对象池,在用户通过直接赋值的方式定义了字符串时,这时候该字符串对应的匿名对象(在上述案例中就是791202.com和791202.cn,字符串常量就是对应的String类的匿名对象)自动“入池保存”,倘若后续过程中用户再次直接赋值定义了字符串并且还使用了相同的内容,那么将不再开辟新的堆内存,而是令其指向原来已经入池的对象进行引用。

因为字符串的值一旦设定将无法改变,因此,JAVA的设计者认为共享的设计方式,可以带来更高的效率。

第二种构造方法实例化

看到这里就已经很清楚构造方法实例化这种方式比较于直接赋值的缺陷所在,多开辟了一块堆内存,存在垃圾问题。

s1因为new关键字存在,就一定会去堆内存中开辟空间存放字符串,接着s2直接赋值定义字符串时,由于常量池存在,故不会创建新的字符串。我们说过==符号在用于引用数据类型时,比较的是两者的地址值,前者在堆内存中有指向,后者没有,因此结果会得到false。

总结

构造方法实例化字符串会存在一部分垃圾空间,便是堆内存中重复创建的字符串字段,因此直接赋值的方式确实优于构造方法的方式,因此字符串在使用时都使用的是直接赋值的方法。

浏览量:

72

0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值