java string的作用_java基础-String不可变的好处

本文探讨了Java中String类的内部实现,从Java 8到Java 9的变化,指出String被定义为final不可变的原因,主要是为了优化内存使用、保证String常量池的效率以及提供线程安全。String的不可变性还在HashMap的key使用、网络参数传递和安全性方面带来益处。此外,文章还阐述了不可变对象在多线程环境和哈希映射中的重要性。
摘要由CSDN通过智能技术生成

一、java内部String类的实现:

java 8:

1 public final classString2 implements java.io.Serializable, Comparable, CharSequence {3 /**The value is used for character storage.*/

4 private final charvalue[];5 }

java 9 及之后:(使用coder标识了编码)

1 public final classString2 implements java.io.Serializable, Comparable, CharSequence {3 /**The value is used for character storage.*/

4 private final byte[] value;5

6 /**The identifier of the encoding used to encode the bytes in7 {@codevalue}.*/

8 private final bytecoder;9 }

二、为何要将String定义为final不可变?

因为在程序编写的过程中,会大量地用到String常量,如果每次声明一个String引用都要新建一个String对象,那么会造成空间的极大浪费。于是,在java的堆中开辟了一块存储空间String pool,用于存储String常量对象。当有多个String引用指向同样的String字符串时,实际上是指向的是同一个Sting pool中的对象,而不需要额外的创建对象。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 public classTest{2 public static voidmain(String [] args){3 String a="abc";4 String b="abc";//对象保存在string pool中

5 String c=new String("abc");//以new创建的对象保存在堆中

6 System.out.println("a==b:"+(a==b));7 System.out.println("a==c:"+(a==c));8

9 }10 }

View Code

实现String pool就需要String定义为final,否则,当引用a、b都指向“abc”时,通过a将对象改变后,引用b所指向的对象被动地改变了。那程序员不得气得半死?

三、String不可变的其他好处

1、以String作为HashMap的key,String的不可变保证了hash值的不可变。

2、String作为网络连接的参数,它的不可变性提供了安全性。

3、String不可变,所以线程安全。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值