有人问我为什么String是不可变的
我这样回答:
当我们在Java中像这样创建一个字符串时,String s1="hello"
;将在字符串pool(hello)中创建一个对象,并且s1将指向hello。现在再次执行该操作String s2="hello"
;将不会创建另一个对象,但是s2将指向该对象,hello 因为JVM将首先检查如果在字符串池中是否存在相同的对象, 如果不存在则仅创建一个新对象。
现在,如果假设Java允许串可变那么如果我们改变S1到hello world
那么S2价值也将hello world
因此Java字符串是不可改变的。
有谁能告诉我我的答案是对还是错?
String
是不可变的,原因有以下几点:
String
以网络连接,数据库连接URL,用户名/密码等形式表示。如果可变,则可以轻松更改这些参数。String
不可变自动使其线程安全,从而解决了同步问题。String
对象时,它会看到如果两个对象具有相同的值(a =“ test”
和b =“ test”
),因此你只需要一个字符串对象(对于a
和b
,这两个对象将指向同一对象)。String
用作类加载的参数。如果可变,则可能导致装入错误的类(因为可变对象更改其状态)。String
仅表示你无法使用其公共API对其进行更改。实际上,你可以使用反射来绕过常规API。在这里查看答案。在你的示例中,如果String
是可变的,请考虑以下示例:
String a="stack";
System.out.println(a);//prints stack
a.setValue("overflow");
System.out.println(a);//if mutable it would print overflow
本文向大家介绍String 为什 么是不可变的?相关面试题,主要包含被问及String 为什 么是不可变的?时的应答技巧和注意事项,需要的朋友参考一下 简单的来说:String 类中使用 final 关键字修饰字符数组来保存字符串,`private final char value[]`,所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 Ab
本文向大家介绍Java 中的 String对象为什么是不可变的,包括了Java 中的 String对象为什么是不可变的的使用技巧和注意事项,需要的朋友参考一下 什么是不可变对象? String对象是不可变的,但这仅意味着你无法通过调用它的公有方法来改变它的值。 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再
本文向大家介绍浅谈为什么Java里面String类是不可变的,包括了浅谈为什么Java里面String类是不可变的的使用技巧和注意事项,需要的朋友参考一下 在Java里面String类型是不可变对象,这一点毫无疑问,那么为什么Java语言的设计者要把String类型设计成不可变对象呢?这是一个值得思考的问题 Java语言的创建者James Gosling,曾经在一次采访中被人问到:什么时候应该使用
问题内容: 我知道整数在Java中是不可变的。但是为什么要这样设计呢? 我找不到强制Integer不可变的用例。是否有类似String的技术原因? 字符串在网络连接,数据库URL等中用作参数。如果它是可变的,则很容易遭到破坏。 支持StringPool功能。 支持使用字符串作为参数的类加载机制。字符串可变会导致加载错误的类。 我知道有些包装很易变。 更新: 从对话中,并没有普遍的理由要求整数是不可
本文向大家介绍为什么字符串对象在Java中是不可变的?,包括了为什么字符串对象在Java中是不可变的?的使用技巧和注意事项,需要的朋友参考一下 通常,字符串用于表示重要细节,例如数据库连接URL,用户名密码等。字符串的不变性有助于使这些细节保持不变。 类似地,在加载类时,将String用作参数。那时,更改字符串可能会导致加载错误的类。 如果不可变,则变量(字符串)自动为线程安全的。