区分对象和对象的引用 对于Java初学者, 对于String是不可变对象总是存有疑惑。...看下面代码: String s = "ABCabc"; System.out.println("s = " + s); s = "123456"; System.out.println("s...= " + s); 输出结果: s = ABCabc s = 123456 首先创建一个String对象s,然后让s的值为“ABCabc”, 然后又让s的值为“123456”。...那么怎么还说String对象是不可变的呢? 其实这里存在一个误区: s只是一个String对象的引用,并不是对象本身。对象在内存中是一块内存区,成员变量越多,这块内存区占的空间越大。
String为什么是不可变的 我们通过查看String源码可以发现 String内部char数组是通过 private final修饰的,表示不可访问 而且String类也通过final修饰表示不可继承...这样做的目的是 保证了String类的线程安全,如果String可以改变,我们通过写一个类继承String 可以篡改数据 保证了hash属性值不会频繁变更,保证了唯一性,这也是HashMap采用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+。
分别使用 String 和 StringBuilder 拼接 /** * 循环内 String 拼接字符串,一次循环后销毁 */ public static void...也是分别使用 String 和 StringBuilder 拼接 /** * 多次循环拼接成一个字符串 用 String */ public static void...str1 = "张三"; public static final String str2 = "李四"; public static final String str3 = "王五";...为什么呢?...奈何才疏学浅我一直想不明白为什么他慢。
今天来分享一道群友去阿里云面试遇到的 Java 基础面试真题:“String、StringBuffer、StringBuilder 的区别?String 为什么是不可变的?”。...可变性 简单的来说:String 类中使用 final 关键字修饰字符数组来保存字符串,所以String 对象是不可变的。...因此,final 关键字修饰的数组保存字符串并不是 String 不可变的根本原因,因为这个数组保存的字符串是可变的(final 修饰引用类型变量的情况)。...String 类被 final 修饰导致其不能被继承,进而避免了子类破坏 String 不可变。 相关阅读:如何理解 String 类型值的不可变?...参考资料 [1]如何理解 String 类型值的不可变?
String 类的字段,除了 hash 之外都声明为 final。所以,严格来说,Java 的字符串并不是不可变的。...不过,hash 字段缓存的值是根据其他字段计算而来的,而这些字段的值都是不可变的,因此,只要选定了字符串的内容,那么表现出来的行为就像是不可变的一样。...具有这种特性的类称为事实不可变的类——现实中很少见到这种类,程序员往往可以忽略真正不可变的数据和事实不可变的数据之间的区别。
String是Java中最常用的类,是不可变的(Immutable), 那么String是如何实现Immutable呢,String为什么要设计成不可变呢?...String为什么要设计成Immutable?...this : new String(value, beginIndex, subLen); } 如果String是可变的,即修改String的内容后,地址不变。..." String会在加载class的时候需要,如果String可变,那么可能会修改加载中的类。...总之,安全性和String字符串常量池缓存是String被设计成不可变的主要原因。
什么是不可变对象? 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。...为什么String对象是不可变的? 要理解String的不可变性,首先看一下String类中都有哪些成员变量。...这也是为什么像replace, substring,toLowerCase等方法都存在返回值的原因。...也是为什么像下面这样调用不会改变对象的值: String ss = "123456"; System.out.println("ss = " + ss); ss.replace('1', '0');...但是一般我们不这么做。这个反射的实例还可以说明一个问题:如果一个对象,他组合的其他对象的状态是可以改变的,那么这个对象很可能不是不可变对象。
在Java里面String类型是不可变对象,这一点毫无疑问,那么为什么Java语言的设计者要把String类型设计成不可变对象呢?这是一个值得思考的问题。...ok,下面我们来分析下为什么String是不可变的? 通过String源码可以看到,String类型的底层是由final修饰的char数组存储。...另一方面,如果String是可变的,那么同时运行的其他线程如果修改这个值,就有可能导致混乱。...总结: 本文主要介绍了Java语言里面String类型为什么设计成不可变类型,以及分析了不可变类型的带来的主要优势,需要注意的是虽然不可变类型能够带来不少的好处,但并不是说其没有弊端,不可变类型的每一次修改都需要在内存中新生成一个对象...,从另一个方面说针对经常变化的对象是不适合使用不可变类型的,这也是为什么Java里面还提供了可修改值的StringBuilder和StringBuffer类,这在实际开发中常常是需要根据具体情况权衡的。
可变,线程不安全;执行速度最快需要频繁操作数据、且不用考虑线程安全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底层使用的
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 被设计为不可变的,这也是在一般情况下在一些情况下优选不可变类的原因。
从哪看出来String类是不可变的?...this : new String(value, beginIndex, subLen); } 为什么String被设置为不可变的? 字符串常量池 字符串常量池可以节省大量的内存空间。...如果String类可变就不可能有字符串常量池 字符串常量池放在哪?...jdk1.7之前的不讨论,从jdk1.7开始,字符串常量池就开始放在堆中,然后本文的所有内容都是基于jdk1.8的 下面这个代码还是经常被问到的 String str1 = "abc"; String...; // Default to 0 } 可以用作HashMap的key 由于String类不可变的特性,所以经常被用作HashMap的key,如果String类是可变的,内容改变,hashCode也会改变
“ 01 不可变对象是指一个对象的状态在对象被创建之后就不再变化。...String 不可变是因为在 JDK 中 String 类被声明为一个 final 类,且类内部的 value 字节数组也是 final 的,只有当字符串是不可变时字符串池才有可能实现,字符串池的实现可以在运行时节约很多...heap 空间,因为不同的字符串变量都指向池中的同一个字符串;如果字符串是可变的则会引起很严重的安全问题,譬如数据库的用户名密码都是以字符串的形式传入来获得数据库的连接,或者在 socket 编程中主机名和端口都是以字符串的形式传入...,因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子改变字符串指向的对象的值造成安全漏洞;因为字符串是不可变的,所以是多线程安全的,同一个字符串实例可以被多个线程共享,这样便不用因为线程安全问题而使用同步...,字符串自己便是线程安全的;因为字符串是不可变的所以在它创建的时候 hashcode 就被缓存了,不变性也保证了 hash 码的唯一性,不需要重新计算,这就使得字符串很适合作为 Map 的键,字符串的处理速度要快过其它的键对象
可变性 String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。...,这两种对象都是可变的。...线程安全性 String中的对象是不可变的,也就可以理解为常量,线程安全。...性能 每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。...对于三者的总结 如果要操作少量的数据用= String 单线程操作字符串缓冲区下操作大量数据= StringBuilder
什么是 String? 在 Java 中,String 是一个类,用于表示字符串。它是不可变的,即一旦创建就不能被修改。 2. 为什么 String 是不可变的?...String 被设计成不可变的主要有以下几个原因: 2.1 字符串常量池 在 Java 中,存在一个字符串常量池(String Pool),它是存储字符串对象的特殊内存区域。...而如果 String 是可变的,那么在修改字符串时,可能会导致其他使用相同字符串的地方出现问题。 2.2 安全性 由于 String 是不可变的,所以它在多线程环境下是安全的。...2.4 性能优化 由于 String 是不可变的,所以可以进行一些性能优化。...由于 String 是不可变的,所以对字符串的任何修改都会创建一个新的 String 对象。
String 是 Java 中不可变的类,所以一旦被实例化就无法修改。不可变类的实例一旦创建,其成员变量的值就不能被修改。...本文总结下 String 类设计成不可变的原因及好处,以及 String 类是如何设计成不可变的。 String 类设计成不可变的原因及好处?...其实好处就是原因,String 设计成不可变,主要是从性能和安全两方面考虑。 1、常量池的需要 这个方面很好理解,Java 中的字符串常量池的存在就是为了性能优化。...String s1 = "abc"; String s2 = "abc"; 比如引用 s1和 s2 都是指向常量池的同一个对象 "abc",如果 String 是可变类,引用 s1 对 String 对象的修改...3、多线程安全 多线程中,可变对象的值很可能被其他线程改变,造成不可预期的结果。而不可变的 String 可以自由在多个线程之间共享,不需要同步处理。 String 类是如何实现不可变的?
一、String为什么不可变? 要了解String类创建的实例为什么不可变,首先要知道final关键字的作用:final的意思是“最终,最后”。 final关键字可以修饰类、方法、字段。...二、String类不可变有什么好处? 最简单的就是为了安全和效率。...,提高执行效率; 总之,由于效率和安全问题,String被设计成不可变的,这也是一般情况下,不可变的类是首选的原因。...三String对象真的不可变吗? 从上文可知String的成员变量是private final 的,也就是初始化之后不可改变。...但是一般我们不这么做。这个反射的实例还可以说明一个问题:如果一个对象,他组合的其他对象的状态是可以改变的,那么这个对象很可能不是不可变对象。
众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢?可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。...为什么String对象是不可变的? 要理解String的不可变性,首先看一下String类中都有哪些成员变量。...这也是为什么像replace, substring,toLowerCase等方法都存在返回值的原因。...也是为什么像下面这样调用不会改变对象的值: String ss = "123456"; System.out.println("ss = " + ss); ss.replace('1',...但是一般我们不这么做。这个反射的实例还可以说明一个问题:如果一个对象,他组合的其他对象的状态是可以改变的,那么这个对象很可能不是不可变对象。
领取专属 10元无门槛券
手把手带您无忧上云