java string的使用_【Java】 String类型的==使用
发布日期:2021-10-25 22:55:52 浏览次数:2 分类:技术文章

本文共 1439 字,大约阅读时间需要 4 分钟。

public class StringDemo {

public static void main(String[] args) {

String s1 = "abc";

String s2 = "abc";

String s3 = new String("abc");

System.out.println(s1 == s2);//true

System.out.println(s1 == s3);//false

}

}

按照==的语法来看,首先s1、s2、s3是三个不同的对象,常理来说,输出都会是false。然而程序的运行结果确是true、false。

第二个输出false可以理解,第一个输出true就又让人费解了。我们知道一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,而堆内存中则存放new 出来的对象和数组。然而除此之外还有一块区域叫做常量池。

当像String s1 = "abc"; 这样申明的字符串对象,其值就是存储在常量池中。当我们创建String s1 = "abc"这样一个对象之后,"abc"就存储到了常量池(也可叫做字符串池)中,当我们创建引用String s2 = "abc" 的时候,Java底层会优先在常量池中查找是否存在"abc",如果存在则让s2指向这个值,不会重新创建,如果常量池中没有则创建并添加的池中。这就是为什么答案是true 和false的原因。

以下是一种带final修饰符的情况

public class Test {

public static void main(String[] args) {

String a = "hello2";

final String b = "hello";

String d = "hello";

String c = b + 2;

String e = d + 2;

System.out.println((a == c));

System.out.println((a == e));

}

}

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

true

false

View Code

为什么第一个比较结果为true,而第二个比较结果为fasle。这里面就是final变量和普通变量的区别了。

当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时确定。这种和C语言中的宏替换有点像。因此在上面的一段代码中,由于变量b被final修饰,因此会被当做编译器常量,所以在使用到b的地方会直接将变量b 替换为它的值。而对于变量d的访问却需要在运行时通过链接来进行。想必其中的区别大家应该明白了,不过要注意,只有在编译期间能确切知道final变量值的情况下,编译器才会进行这样的优化,比如下面的这段代码就不会进行优化:

public class Test {

public static void main(String[] args) {

String a = "hello2";

final String b = getHello();

String c = b + 2;

System.out.println((a == c));

}

public static String getHello() {

return "hello";

}

}

这段代码的输出结果为false。

转载地址:https://blog.csdn.net/weixin_32075843/article/details/114429585 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java邮件收发系统_JavaWeb项目:邮件收发系统
下一篇:python 修图_拿到一张图怎么后期才能更好一点啊?告诉你具体的修图思路

发表评论

最新留言

不错!
[***.144.177.141]2024年04月14日 04时09分48秒