首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

聊聊JAVA中 String为什么可变

前世今生 String可变这个话题应该是老生长谈了,你可以说它就是设计者的龟腚,然后巴拉巴拉说出一大堆优点,也可以说它忠于爱情,只要JVM存活,它便万年不变。...我觉得到这里各位小伙们应该就知道为什么String可变了,戴了个final的帽子,官方注释说明创建后不能被改变,但是为什么String要使用final修饰呢?...面试精选 在了解String可变之前,我觉得有必要分析一道经典的面试题: public class Apple { public static void main(String[] args)...需要说明一点的是,在object中,equals()是用来比较内存地址的,但是String重写了equals()方法,用来比较内容的,即使是不同地址,只要内容一致,也会返回true,这也就是为什么a.equals...总结 了解到String是不可变的,知道了常量池是怎么个东西。 重温了面试题,有兴趣的小伙伴也可以去阅读下String的源码,浩浩荡荡的3000+。

39510

聊聊JAVA中 String为什么可变

前世今生 String可变这个话题应该是老生长谈了,你可以说它就是设计者的龟腚,然后巴拉巴拉说出一大堆优点,也可以说它忠于爱情,只要JVM存活,它便万年不变。...我觉得到这里各位小伙们应该就知道为什么String可变了,戴了个final的帽子,官方注释说明创建后不能被改变,但是为什么String要使用final修饰呢?...面试精选 在了解String可变之前,我觉得有必要分析一道经典的面试题: public class Apple { public static void main(String[] args)...需要说明一点的是,在object中,equals()是用来比较内存地址的,但是String重写了equals()方法,用来比较内容的,即使是不同地址,只要内容一致,也会返回true,这也就是为什么a.equals...总结 了解到String是不可变的,知道了常量池是怎么个东西。 重温了面试题,有兴趣的小伙伴也可以去阅读下String的源码,浩浩荡荡的3000+。

756190

Java中的String为什么是不可变的?

什么是不可变对象? 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。...为什么String对象是不可变的? 要理解String的不可变性,首先看一下String类中都有哪些成员变量。...这也是为什么像replace, substring,toLowerCase等方法都存在返回值的原因。...也是为什么像下面这样调用不会改变对象的值: String ss = "123456"; System.out.println("ss = " + ss); ss.replace('1', '0');...但是一般我们这么做。这个反射的实例还可以说明一个问题:如果一个对象,他组合的其他对象的状态是可以改变的,那么这个对象很可能不是不可变对象。

66530

为什么Java里面String类是不可变

在Java里面String类型是不可变对象,这一点毫无疑问,那么为什么Java语言的设计者要把String类型设计成不可变对象呢?这是一个值得思考的问题。...ok,下面我们来分析下为什么String是不可变的? 通过String源码可以看到,String类型的底层是由final修饰的char数组存储。...另一方面,如果String可变的,那么同时运行的其他线程如果修改这个值,就有可能导致混乱。...总结: 本文主要介绍了Java语言里面String类型为什么设计成不可变类型,以及分析了不可变类型的带来的主要优势,需要注意的是虽然不可变类型能够带来不少的好处,但并不是说其没有弊端,不可变类型的每一次修改都需要在内存中新生成一个对象...,从另一个方面说针对经常变化的对象是不适合使用不可变类型的,这也是为什么Java里面还提供了可修改值的StringBuilder和StringBuffer类,这在实际开发中常常是需要根据具体情况权衡的。

69740

String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么可变

可变,线程不安全;执行速度最快需要频繁操作数据、且不用考虑线程安全StringBuffer 可变,线程安全;性能较低 需要频繁操作数据、且需要考虑线程安全 二、String简介2.1 String...【new相当于在堆中新建了value值,每new一个对象就会在堆中新建,地址值也因此不同,堆中的value存储着指向常量池的引用地址】由于new关键字会在堆中开辟空间,因此开发中一般建议使用,直接用字面量形式赋值即可...为什么String对象能使用 "+" 操作符?毕竟String不是Java8大基本数据类型和对应的装箱类型,而是引用类型,它能够使用 "+" 是因为官方做了处理。...在谈String可变之前,我们先了解一下Java中的不可变对象3.1 可变类型与不可变类型1)改变一个变量、改变一个变量的值 有何区别改变一个变量:将该变量指向另一个存储空间 ——修改指向改变一个变量的值...不可修改该变量final + 可变的引用数据类型:final List——只限制了引用不可更改,但并未限制 引用指向的地址中的数据的修改3.2 String为什么可变查看源码,String底层使用的

13510

为什么String在Java中是不可变

String 在 Java 中是不可变的。 不可变类只是一个无法修改其实例的类。 创建实例时,将初始化实例中的所有信息,并且无法修改信息。 不可变类有许多优点。...本文总结了为什么 String 设计为不可变的。 这篇文章从内存,同步和数据结构的角度说明了不变性概念。 1. 字符串池 字符串池(String intern pool)是方法区域中的特殊存储区域。...String string1 = "abcd"; String string2 = "abcd"; 如下图所示: ? 如果字符串是可变的,则使用一个引用更改字符串将导致其他引用的错误。 2....(new String("b")); set.add(new String("c")); for(String a: set) a.value = "a"; 在此示例中,如果 String可变的...综上所诉,出于效率和安全原因,String 被设计为不可变的,这也是在一般情况下在一些情况下优选不可变类的原因。

1.3K20

Java 中的 String 为什么是不可变的?

什么是不可变对象? 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。...为什么String对象是不可变的? 要理解String的不可变性,首先看一下String类中都有哪些成员变量。...这也是为什么像replace, substring,toLowerCase等方法都存在返回值的原因。...也是为什么像下面这样调用不会改变对象的值: String ss = "123456"; System.out.println("ss = " + ss); ss.replace('1', '0');...但是一般我们这么做。这个反射的实例还可以说明一个问题:如果一个对象,他组合的其他对象的状态是可以改变的,那么这个对象很可能不是不可变对象。

1.8K01

请解释一下String为什么可变

“ 01 不可变对象是指一个对象的状态在对象被创建之后就不再变化。...String可变是因为在 JDK 中 String 类被声明为一个 final 类,且类内部的 value 字节数组也是 final 的,只有当字符串是不可变时字符串池才有可能实现,字符串池的实现可以在运行时节约很多...heap 空间,因为不同的字符串变量都指向池中的同一个字符串;如果字符串是可变的则会引起很严重的安全问题,譬如数据库的用户名密码都是以字符串的形式传入来获得数据库的连接,或者在 socket 编程中主机名和端口都是以字符串的形式传入...,因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子改变字符串指向的对象的值造成安全漏洞;因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享,这样便不用因为线程安全问题而使用同步...,字符串自己便是线程安全的;因为字符串是不可变的所以在它创建的时候 hashcode 就被缓存了,不变性也保证了 hash 码的唯一性,不需要重新计算,这就使得字符串很适合作为 Map 的键,字符串的处理速度要快过其它的键对象

1.7K20

【面试题精讲】String 为什么是不可变的?

什么是 String? 在 Java 中,String 是一个类,用于表示字符串。它是不可变的,即一旦创建就不能被修改。 2. 为什么 String 是不可变的?...String 被设计成不可变的主要有以下几个原因: 2.1 字符串常量池 在 Java 中,存在一个字符串常量池(String Pool),它是存储字符串对象的特殊内存区域。...而如果 String可变的,那么在修改字符串时,可能会导致其他使用相同字符串的地方出现问题。 2.2 安全性 由于 String 是不可变的,所以它在多线程环境下是安全的。...2.4 性能优化 由于 String 是不可变的,所以可以进行一些性能优化。...由于 String 是不可变的,所以对字符串的任何修改都会创建一个新的 String 对象。

49640

Java 中 String为什么要设计成不可变的?

String 是 Java 中不可变的类,所以一旦被实例化就无法修改。不可变类的实例一旦创建,其成员变量的值就不能被修改。...本文总结下 String 类设计成不可变的原因及好处,以及 String 类是如何设计成不可变的。 String 类设计成不可变的原因及好处?...其实好处就是原因,String 设计成不可变,主要是从性能和安全两方面考虑。 1、常量池的需要 这个方面很好理解,Java 中的字符串常量池的存在就是为了性能优化。...String s1 = "abc"; String s2 = "abc"; 比如引用 s1和 s2 都是指向常量池的同一个对象 "abc",如果 String可变类,引用 s1 对 String 对象的修改...3、多线程安全 多线程中,可变对象的值很可能被其他线程改变,造成不可预期的结果。而不可变String 可以自由在多个线程之间共享,不需要同步处理。 String 类是如何实现不可变的?

2.5K50

STRING对象不可变的原理

众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢?可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。...为什么String对象是不可变的? 要理解String的不可变性,首先看一下String类中都有哪些成员变量。...这也是为什么像replace, substring,toLowerCase等方法都存在返回值的原因。...也是为什么像下面这样调用不会改变对象的值: String ss = "123456"; System.out.println("ss = " + ss); ss.replace('1',...但是一般我们这么做。这个反射的实例还可以说明一个问题:如果一个对象,他组合的其他对象的状态是可以改变的,那么这个对象很可能不是不可变对象。

66940
领券