电子商务物流网站建设规划方案,个人网页背景图片大全,产品开发设计,做网站的主要收入阅读本文大概需要 4分钟。所谓不可变对象#xff0c;是指一个对象在创建后#xff0c;它的内部状态不会被改变的对象。这意味着当我们将一个不可变对象的引用赋值给某个变量后#xff0c;我们就不能改变该对象的内部状态。 James Gosling也说过——Java开发者应该尽量使用不… 阅读本文大概需要 4分钟。所谓不可变对象是指一个对象在创建后它的内部状态不会被改变的对象。这意味着当我们将一个不可变对象的引用赋值给某个变量后我们就不能改变该对象的内部状态。 James Gosling也说过——Java开发者应该尽量使用不可变对象。 在Java中将String对象设置为不可变对象的好处很多例如缓存、安全、同步、性能等方面。 节省内存字符串常量池字符串常量池是JVM中的一块特殊区域1.7之前存放在perm区1.8之后存放在堆上用来存放字符串对象的值。在JVM中字符串是不可变的因此JVM对于相同的字符序列可以只保存一份这个特性称之为“interning”。由于字符串是JVM中最常见的对象因此实现字符串共享可以节省很多堆内存。 有两种方式定义的字符串可以存放在常量池中使用常量字符串初始化字符串变量String s1 Hello World;
String s2 Hello World;
System.out.printlin(s1 s2); //结果为true
调用String对象的intern方法需要注意的是直接通过String的构造方法初始化的字符串对象它的值并没有存放在字符串常量池需要对该对象调用intern方法之后才会将它的值放入字符串常量池。String s1 Hello World;
String s2 new String(Hello World);
System.out.println(s1 s2); //结果为falses2.intern();
System.out.println(s1 s2); //结果为true
安全问题Java应用中使用字符串对象存放一些敏感信息用户名、密码、连接地址、IP地址等等。Java中类加载器加载类的时候也是根据类的名字去文件系统中的对应路径去查找的类的名称、对应的路径都是使用字符串对象存储的。 将字符串对象设计为不可变的就意味着这个敏感信息一经生成就不会被改变有点现在流行的区块链的思路。 常见的安全检查流程有两个步骤1校验安全信息2进行敏感操作。如果字符串对象是可变的则在做完第1步安全校验后这个字符串对象依然可能被改变。例如我们现在在维护一个用户服务提供了更改用户昵称的服务业务逻辑是先检查用户昵称的合法性然后再进行数据库的操作如果字符串对象是可变的那么第一步的合法性检查就没有意义了。 并发问题不可变对象天然具备线程安全性因为不用担心两个线程同时修改该对象时候产生的争用问题。假设字符串变量str hello被多个线程同时使用如果在某个线程中对str赋了新的字符串值那么就会在字符串常量池中生成一份新的字符串不会有并发争用。 hashcode缓存在Java集合框架的很多数据结构中都用到了字符串对象例如HashMap、HashTable、HashSet等等在这些数据结构的实现过程中都使用hashcode()方法来进行hash操作。 由于字符串对象的不变性JDK将它的hashcode()做了缓存这样对于同一个字符串对象只会在第一次调用它的hashcode()方法的时候进行计算后面的调用直接使用缓存中的值这缓存也提升了集合数据结构的性能。 总结这个问题考察得比较细致需要用对应的案例进行理解不可变的字符串对象对于Java应用来说不可或缺下图是写这篇文章时候用到的思维导图也分享给大家。 【End】老王给大家准备一篇「Java最常见200面试题全解析」助力大家找到更好的工作这份面试题包含的模块Java、JVM 最常见面试题解析Spring、Spring MVC、MyBatis、Hibernate 面试题解析MySQL、Redis 面试题解析RabbitMQ、Kafka、Zookeeper 面试解析微服务 Spring Boot、Spring Cloud 面试解析扫描下面二维码付费阅读关注下方二维码订阅更多精彩内容。转发朋友圈是对我最大的支持。