首页 > 编程语言 >Java String为什么被设计为final的

Java String为什么被设计为final的

时间:2023-01-06 14:04:18浏览次数:51  
标签:缓存 Java HashMap String 字符串 可变性 final 客户端


文章目录

String被设计为不可变是因为String对象是缓存在字符串池中的,因此这些缓存的字符串是可以被多个客户端访问的,如果一个客户端的访问影响了别的客户端的行为,这样就存在风险。例如一个客户端把"test"改为"TEST",其他所有的客户端都会跟着受影响。之所以把String进行了缓存处理,是出于性能的考虑。因此这个风险只能通过把String设置为不可变来避免。同时,String类被声明为final的。是防止其他人通过继承String类,覆盖父类的方法,会破坏String的不可变性、缓存性以及hascode的计算方式。

另一个String不可变的原因是由于HashMap。由于HashMap是基于hash规则,只有相同的对象有相同的Hash值,他才能运行良好。而人们又非常流行把String作为HashMap的键值,如果String可变,就会产生不同的Hash值,只有String不可变,才能取回存在HashMap中的值。

String被广泛用于Java类的参数,例如你可以通过把ip和端口的字符串作为参数打开一个网络连接,你可以通过把URL的字符串作为参数来打开一个数据库连接,你可以传一个文件名字符串作为参数,通过JAVA I/O类来打开一个文件。在这些例子中,如果String是可变的,就会导致严重的安全威胁,别人可以通过恶意的修改缓存的字符来访问所有你已经有授权的文件。通过把String设计为不可变的,就避免了这样的威胁。

对于多线程变成来说,由于String的不可变性,你可以安全的在多个重要的线程中共享String,不会造成线程同步问题。

另一个重要原因,是String的不可变性为Java的类加载机制的安全性提供了根本的保障。如果String是可变的,一个加载"java.io.Writer" 类的请求,可以被改变为"mil.vogoon.DiskErasingWriter",这样安全就没有保障了。


标签:缓存,Java,HashMap,String,字符串,可变性,final,客户端
From: https://blog.51cto.com/u_15932195/5993211

相关文章

  • Java 集合判空优化
    文章目录//反例LinkedList<Object>collection=newLinkedList<>();if(collection.size()==0){System.out.println("collectionisempty.");}//正例LinkedList<O......
  • Java 中map 遍历优化
    文章目录packagedemo.map;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;/***<p>*Map遍历优化*</P>......
  • Java嵌套if else优化
    文章目录​​1.传统实现​​​​2.策略模式+工厂模式+单例模式优化​​​​2.1策略接口​​​​2.2不同策略实现类​​​​2.2.1处理策略一​​​​2.2.2处理策略二​......
  • Java8 函数式接口
    文章目录​​一、特点​​​​二、函数式接口中允许定义的方法类型​​​​三、四大内置函数式接口​​​​1.`Consumer`消费​​​​1.1示例​​​​2.`Supplier`供应......
  • java实现微信公众号消息推送
    1.打开[(https://push.ggt1024.com)],微信扫码登录2.点击java生成代码复制3.在pom.xml中添加依赖<dependency><groupId>com.squareup.okhttp3</groupId>......
  • Java中解决lambda表达式内部访问在其外部定义的变量-使用mapToInt
    场景Java8新特性-Stream对集合进行操作的常用API:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126070657上面介绍Stream的相关使用示例。如果遇到在lam......
  • com.sun.tools.javac.code.TypeTags
    java:java.lang.ExceptionInInitializerErrorcom.sun.tools.javac.code.TypeTags   这个可能原因是你编译器的环境使用过高。但是你的依赖 <dependency>......
  • Java监听器实现原理
    文章目录​​监听器模型​​​​案例实现​​​​`DeveloperListener`​​​​`Developer`​​​​`Event`​​​​`DeveloperListenerImpl`​​​​测试​​监听器就是监听......
  • Day10:学习基础java方法
    方法何谓方法?System.out.println(),那么它是什么呢?Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法......
  • (一)Java入门
    java入门1、java跨平台原理:JVM(java虚拟机)2、JRE:包括JVM和运行所要的核心类库JDK:编译工具javac.exe运行工具java.exe(在bin目录下)3、常用DOS命令(1)dir:显示目录(2)cd......