`
zengguo1988
  • 浏览: 274551 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

String类型对象是否改变

    博客分类:
  • J2EE
阅读更多

 

因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:   


 

String s = "Hello";   

s = s + " world!";   

  s所指向的对象是否改变了呢?从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中,s原先指向一个String对象,内容是"Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。   


 

  通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。

同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:   


 

public class Demo {   

private String s;   

...   

public Demo {   

s = "Initial Value";   

}   

...   

}   

  而非   


 

s = new String("Initial Value");   

  后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String

对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。   

上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象

,无论内容是否相同。   


 

  至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会

有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即StringBuffer。   

 

分享到:
评论

相关推荐

    String.pdf

    string是C++、java、VB等编程语言中的字符串,字符串是一个特殊的对象,...对String类的任何改变,都是返回一个新的String类对象。 C++标准库中string类以类型的形式对字符串进行封装,且包含了字符序列的处理操作。

    JavaScript帮助手册-String对象.pdf

    JavaScript String 对象参考手册 字符串是 JavaScript 的一种基本的数据类型。 String 对象的 length 属性声明了该字符...需要注意的是,JavaScript 的字符串是不可变的,String 类定义的方法都不能改变字符串的内容。

    JAVA字符串

    Java中将字符串作为String类型对象来处理。当创建一个String对象时,被创建的字符串是不能被改变的。每次需要改变字符串时都要创建一个新的String对象来保存新的内容。原始的字符串不变。之所以采用这种方法是因为...

    JavaScript中json对象和string对象之间相互转化

    json对象 代码如下: var json = {aa:true,bb:true}; var json1 = {aa:’b’,bb:{cc:true,dd:true}}; 1:js操作json对象 代码如下: for(var item in json){ alert(... //改变json对象的值 } 2:json对象转化为

    jsp九大内置对象

     当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个Session对象,同时分配一个String类型的ID号,JSP引擎同时将这换个ID号发送到客户端,存放在Cookie中,这样Session对象,直到客户关闭浏览器后,...

    java面试常见问题

    因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当...

    Video_2019-03-11_数据类型.wmv

    Python数据类型,在内存中存储的数据可以有多种类型。例如, 一个人的名字可以用字符来存储, 年龄可以用数字来存储, 爱好可以用集合来...他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。

    Java问题宝典2012版

    Overloaded的方法是否可以改变返回值的类型? 15 19、构造器Constructor是否可被override? 16 20、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否...

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

    不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。  区分对象和对象的引用  对于Java初学者, 对于...

    史上最全Java面试题目大集合

    对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 4、String 和StringBuffer的区别 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符...

    为什么Java字符串是不可变对象?

     流行的Java面试题之一是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类型?  不可变对象,顾名思义是创建后不可以...

    Java的六大问题你都懂了吗

    也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,...

    Java初学者都必须理解的六大问题

    也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。  上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造...

    Java中的String为什么是不可变的?? String源码分析

    不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。  区分对象和对象的引用  对于Java初学者, 对于...

    第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社.pptx

    引用类型参数,相对应的实参和形参链接到同一个对象,在方法中改变了形参引用对象时,其实就是改变了实参引用的对象。 例4.2 TwoInt类中有两个int类型的属性,编写方法swap交换该类对象的两个属性的值,并显示交换...

    Java基础面试题 91道面试复习八股文

    88. String和StringBuffer、StringBuilder的区别是什么?String为什么是不可 变的 可变性 String类中使用字符数组保存字符串,private final char value[],所以string对象...每次对String 类型进行改变的时候,都会

    【05-面向对象(下)】

    类型完全可以改变他的对象。 可执行“宏替换”的final变量 •对一个final变量来说,不管它是类变量、实例变量,还是局部变量,只要该变量满足3个条件,这个final变量就 不再是一个变量,而是相当于一...

    详解C# 匿名对象(匿名类型)、var、动态类型 dynamic

    C# 语言从诞生起就是强类型语言,这一性质到今天不曾改变,我想以后也不会变。既然是强类型语言,那编写任一程序均要求满足下面的基本条件: 1、变量声明必须指明其类型 2、变量类型明确后,其类型在Runtime亦不能...

    [java]读书笔记整理:一切都是对象

    当然,String类型并非是唯一存在的类型,java提供了数量众多的现成类型。重要的是,你不能盲目的创建类型。 二.存储到什么地方 程序运行时,对象是怎么进行放置安排的呢?特别是内存是怎样分配的呢?对这些方面...

    Java面向对象程序设计方案练习题(1).doc

    构造方法的重载 定义一个名为Vehicles 交通工具 的基类 该类中应包含String类型的成员属性brand 商 标 和color 颜色 还应包含成员方法run 行驶 在控制台显示"我已经开动了" 和showI nfo 显示信息 在控制台显示商标和...

Global site tag (gtag.js) - Google Analytics