Java中final修饰的字符串和常量池之间的联系

本文深入探讨了final修饰符在Java中的应用,包括final修饰的方法、常量和字符串的行为特性,并详细解释了final字符串如何影响字符串常量池的加载机制。

一、final修饰符

1、被final修饰的常量,在编译阶段会存入调用类的常量池中。
2、被final修饰的方法,JVM会尝试为之寻求内联,这对于提升Java的效率是非常重要的。因此,假如
能确定方法不会被继承,那么尽量将方法定义为final的。
3、final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。

二、用final来修饰字符串

先看一段代码

String a = "123";  
String b = "456";
String c = a+b;
System.out.println(c=="123456");
//输出:false
final String a = "123";  
final String b = "456";
String c = a+b;
System.out.println(c=="123456");
//输出:true

对于字面常量"123456"被接在进入常量池的。对于第一段代码a,b是变量所以在编译期间是不能确定其值的,所以c的值"123456"并没有加载进常量池,而对于第二段代码,因为a、b是常量,所以在编译期间就计算出了字面量"123456",并加载进常量池。结果就很明了了。

三、动态加载到常量池

String a = "123";  
String b = "456";
String c = a+b;
c.intern();	//在运行时加载到常量池
System.out.println(c=="123456");
//输出:true

通过 c.intern()方法动态加载到常量池之后输出true ,进一步论证了上文的结果。

四、通过new在字符串常量池中

String a= new String("123")+new String("456");
//String b= new String("123456");
System.out.println(a.intern()==a);
//输出:true ;放开注释输出:false

原因:没放开注释时在字符常量池中没有"123456"的字面常量,a.intern()方法赋值一份a的引用到常量池并返回,所以a.intern()==a,放开注释后,字符常量池中已经通过new String(“123456”)在常量池中新建了一个字符串对象(但是其本身是在堆上的对象),固a.intern()返回的不是a的引用,而是new String(“123456”)的同时在字符常量池中新创建的字符串对象。

感谢https://www.cnblogs.com/tongkey/p/8587060.html提供的帮助

Java中,字符串常量池(也称为String Pool或 intern pool)是一个特殊的区域,用于存储所有创建过的字符串字面量(即"final"修饰且不可变的字符串)。当一个新字符串字面量被创建时,JVM实际上并不会每次都创建一个新的对象,而是首先检查该字符串是否已经存在于常量池中。如果存在,则返回池中的已有对象;若不存在,则将其放入池中并返回新的引用。 这个机制有几个重要特点: 1. **节省内存**:避免对相同内容的字符串多次分配内存,尤其是对于长字符串或频繁使用的字符串,可以显著减少内存消耗。 2. **提高性能**:因为字符串常量池内的字符串是共享的,查找已存在的字符串比每次创建新字符串要快得多。例如,`System.out.println("hello")`两次不会实际创建两个不同的"hello"对象,因为第一次创建后就保存到了池中。 3. **安全性**:字符串字面量不可变,一旦加入池中,其值就不会改变,这保证了在多线程环境下的安全性,无需担心竞态条件。 当你直接使用双引号创建字符串(如`String str = "hello";`),或者是字符串字面量(如`println("hello");`),JVM会在运行时自动进行池化处理。如果你手动使用`intern()`方法,也可以请求一个字符串被添加到池中,如`String s1 = new String("hello").intern();`,此时如果已经有"hello"在池中,`s1`将会指向池中的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值