原文:Why String is immutable in Java ?
翻译:get-set
String是Java中的一个不<em>可变</em>类。所谓不<em>可变</em>,简单来说就是其对象不能被修改。实例中的所有信息在初始化的时候就已经具备,并且不能被修改(老外好啰嗦…)。不<em>可变</em>类有很多优点。这篇文章简要说明了为什么String被设计为不<em>可变</em>类。关于其好的回答应该建立在对内存模型、同步和数据结构等的理解之上。
String是否相等==判断的是对象的内存起始地址是否相同,equals判断自定义的语义是否相同
JVM为了提高内存效率,将所有不<em>可变</em>的字符串缓存在常量池中,当有新的不<em>可变</em>的字符串需要创建时,如果常量池中存在相等的字符串就直接将引用指向已有的字符串常量,而不会创建新对象
new创建的对象存储在堆内存,不可能与常量区的对象具有相同地址
public class Demo {
public st
StringTokenizer是字符串分隔解析类型,属于:<em>java</em>.util包。1.StringTokenizer的构造函数
StringTokenizer(String str):构造一个用来解析str的StringTokenizer对象。<em>java</em>默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。
StringTokenizer(String st
1.什么是【不<em>可变</em>】?
String不<em>可变</em>很简单,如下图,给一个已有字符串“abcd”第二次赋值成"abced",不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。
2.String为什么不<em>可变</em>?从原理上分析。
翻开JDK源码,<em>java</em>.lang.String类起手前三行,是这样写的:
public final class String implements...
翻译人员: 铁锚
翻译日期: 2013年11月18日
原文链接: Why
<em>string</em> is immutable in Java ?
这是一个老生常谈的话题(This is an old yet still popular question). 在Java中将String设计成不<em>可变</em>的是综合考虑到各种因素的结果,想要理解这个<em>问题</em>,需要综合内存,同步,数据结构以及安全等方面的考虑.
源码解释:
先贴一下String类的申明代码:
public final class String
implements <em>java</em>.io.Serializable, Comparable&amp;amp;amp;amp;lt;String&amp;amp;amp;amp;gt;, CharSequence {}
它最大的一个特点是被final修饰了。我们先看看官方怎么解释:
Strings are constant; their va...
final
首先来说说final。
对于基本数据类型的变量,一旦用final修饰,就表示这个变量不能被再次赋值。
对于对象形的变量,指的是这个引用不<em>可变</em>。而这个引用指向的堆内存区域中的值是可以变的。例如:
final List list = new ArrayList();
list.add(1);
list.add(2);上面定义了List类型的集合对象,我们知道上面代码的第
JAVA中的String是一个不<em>可变</em>(immutable)类,即创建一个String对象后,是不能直接改变字符串中的某个字符的。
我们打开JDK中String类的源代码来看一下:
/** The value is used for character storage. */
private final char value[];其中用于存储String值的仍然是一个char型数
原文来自:Why String is immutable in Java? 在<em>java</em>里String类是不<em>可变</em>的,不<em>可变</em>类是一个不能被修改实例的类,实例创建时所有的信息都被初始化,并且不可被修改。这样的设计也有很多优点,本文从内存、同步和数据结构方面总结了为什么把String类设计成不<em>可变</em>的原因。1、字符串常量池的需要字符串常量池是一个特殊的存储区域。当创建字符串时,如果字符串已经存在于池中,则将返
public final class String
implements <em>java</em>.io.Serializable, Comparable&lt;String&gt;, CharSequence {
/** The value is used for character storage. */
private final char value[];
1.String Po...
import <em>java</em>.math.BigInteger;
public class BigProblem {
public static void main(String[ ] args) {
BigInteger fiveThousand = new BigInteger("5000");
BigInteger fiftyThousand = new B
public class testString {
public static void main(String[] args) {
String s ="hello ";
s="hello world";
System.out.println(s);
tell(s);
System.out.println(s);
}
public static void tell(S
&gt;&gt;&gt; a = 'abcd'
&gt;&gt;&gt; a
'abcd'
&gt;&gt;&gt; b = 'abcd'
&gt;&gt;&gt; b
'abcd'
&gt;&gt;&gt; a == b
True
&gt;&gt;&gt; a is b
True
&gt;&gt;&gt; c = 'ab'
&gt
不<em>可变</em>类:所有成员都是private不提供成员的改变方法,例如:setXXX确保所有的方法不会被重载,手段有两种:使用final Class(强不<em>可变</em>类),或者将所有类方法加上final(弱不<em>可变</em>类)如果某一个类成员不是原始变量(private)或者不<em>可变</em>类,必须通过在成员初始化或者get方法时通过深度clone方法,来确保类的不<em>可变</em>。public final class MyImmutableC...
String s = "Hello";
s = s + " world!";这两行代码执行后,原始的String对象中的内容是否改变?不会改变。因为String类为final类型,它的所有对象都是不<em>可变</em>对象。在这段代码中,s原先指向一个String对象,内容是”Hello”,它在字符串常量池中。然后我们对s进行了+操作,这时s不再指向原来那个对象了,而指向另一个String对象,内容为“Hello
对象不<em>可变</em>定义
不<em>可变</em>对象是指对象的状态在被初始化以后,在整个对象的生命周期内,不可改变。
如何不<em>可变</em>
通常情况下,在Java中通过以下步骤实现不<em>可变</em>
对于属性不提供设值方法所有的属性定义为private final类声明为final不允许继承Return deep cloned objects with copied content for all mutable fields
要理解String的不<em>可变</em>性,首先看一下String类中都有哪些成员变量。 在JDK1.6中,String的成员变量有以下几个:
public final class String
implements <em>java</em>.io.Serializable, Comparable&lt;<em>string</em>&gt;, CharSequence{
/** The value is used for ...