String的比较


prtyaa
prtyaa 2023-12-28 17:20:34 50864 赞同 0 反对 0
分类: 资源
String有3个特性: 1、String是一个不可变的对象,一旦被创建就不能被修改,多线程的时候,可以保证数据的唯一性。 2、其次String是带常量池优化的 3、String是一个类,被final修饰的,不可以被继承

String不是基本数据类型。创建String的方式

区别:直接赋值这种是创建在常量池中,newString在堆内存中。

这其实都是true,因为"Java"在字符串常量池中,"Java"的地址只有一个,s1保存的"Java"的地址,s2也保存的"Java"的地址。 ==比较的是地址值是否相等,显然s1和s2的地址值是一样的,那么equals呢?Object的equals方法我来给大家看一下。

Object的equals的方法其实就是比较了地址值,为什么这样做?因为obejct这个类是根,所有的类去继承他,所以所有的类可以去重写object类中的所有方法,所以也就可以重写equals方法,那么我们看一下String的equals都做了哪些改动?

来看一下这个equals,首先进了一个if判断,判断是不是地址是一样的,==是判断地址值是否相同,如果相同,那么字符串肯定相等,因为都指向了堆内存当中的同一块区域,==如果是true,那么字符串的值肯定相等。

如果

这个判断不成立的话,也就是说,他们地址不一样怎么办?先判断传进来的是不是String类型的,如果不是String类型的话,直接不走if,返回false。然后属于String类的话,就判断组成字符串的byte数组中的每一个位置上的值是否都相等,数组长度是否都相等。如果都相等的话,返回true,否则false。

这样一来

这种方式创建的字符串都在常量池中,首先在常量池中创建了“Java”,然后把Java的地址给s1,然后继续创建“Java”,发现字符串常量池中有,所以就不用继续开辟空间了,直接把s2也指向了“Java”。这样一来s1和s2指向的是常量池中的同一块区域,所以无论是==还是equals都返回的是true。


然后我们看看new这种的比较,原因不说了,图上已经写了


然后看一下直接赋值和new的比较,想也很好想。直接赋值和new比较的话 ==肯定是false,equals的话肯定是true。

substring和replace出来的都是新的字符串,即使常量池中存在,截取后的,或者替换后的,==也不相等。(当然equals是相等的,这点毋庸质疑。)

 


下图中,为什么是相等?首先是他们都在常量池中,s2采用+号进行拼接字符串的时候,s2也是直接赋值的方式,也是在常量池中,拼接的结果在常量池中可以找到,所以s1和s2的地址是一样的,所以是true,equlas以后就不提了,字符串内容相等的情况下都是true的。


看起来和上面是一样的,为什么会返回false?首先s1是一个变量,存在于字符串常量池中,是String的优化机制,然后s2也是一个变量存在于常量池中," world"是一个常量。。。。。。然后s2(变量)+ " world"(常量)的结果是在堆里面。所以+后的地址和s1的地址肯定不一样。所以返回false。


首先s1是一个变量,存在于字符串常量池中,是String的优化机制,然后s2也是一个变量存在于常量池中,hello是一个常量,然后hello(常量)+s2(变量) 的结果s3是在堆里面。所以+后的地址和s1的地址肯定不一样。所以返回false。


看下面这个s2本来是变量的,然后用final修饰后就变成了常量,然后hello是一个常量,一个常量和常量拼接,还是常量,还是存在于常量池中。然后s1也是在常量池中,s3拼接完成后回去常量池中有没有拼接后的结果,发现有,就是s1,所以s1和s3的地址是一样的。


看一下这个 new出来的在堆里,hello是在常量池里,拼起来是在堆里,所以是false


和上面一样的,加不加final都不能改变它存在与堆内存中的事实。


虽然s2,s3是在常量池中,但是他们拼起来是在堆里

 

 

 

 

 

 

 

 

 

 

 

 

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL2
粉丝 1 资源 1949 + 关注 私信
最近热门资源
银河麒麟桌面操作系统备份用户数据  123
统信桌面专业版【全盘安装UOS系统】介绍  116
银河麒麟桌面操作系统安装佳能打印机驱动方法  108
银河麒麟桌面操作系统 V10-SP1用户密码修改  102
最近下载排行榜
银河麒麟桌面操作系统备份用户数据 0
统信桌面专业版【全盘安装UOS系统】介绍 0
银河麒麟桌面操作系统安装佳能打印机驱动方法 0
银河麒麟桌面操作系统 V10-SP1用户密码修改 0
作者收入月榜
1

prtyaa 收益393.62元

2

zlj141319 收益217.85元

3

1843880570 收益214.2元

4

IT-feng 收益208.98元

5

风晓 收益208.24元

6

777 收益172.71元

7

Fhawking 收益106.6元

8

信创来了 收益105.84元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!