zoukankan      html  css  js  c++  java
  • String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?

    没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。

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

    实际上,当我们需要一个字符串对象时,应该使用如下语法来创建String对象:

    Sring s = "fkjava.org";

    也就是直接使用字符串直接量的语法。而不是:

    String s = new String("fkjava.org");

    对于第二种语法而言,每次都会调用构造器生成新的String对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。

    基于这样一种想法,Java提供了字符串缓存池来管理字符串直接量,当程序多次用到同一个字符串直接量时,系统会让它们都引用字符串缓存池中的同一个String对象。因此使用在程序中使用字符串直接量可以充分利用这个特性来降低系统内存开销,提高程序性能。

  • 相关阅读:
    Sql Server--如何自动备份数据
    Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Chinese_PRC_CI_AI" in the equal to operation.
    GET方法和POST方法的区别,Get方法到底可传递的字符串的最大长度是多少?
    Specialization For SCCM
    Fullscreen API:全屏操作
    How to enable remote connections to SQL Server
    Advanced Installer
    ajax跨域请求webservice webconfig配置
    SharePoint Resize app
    Sharepoint 开启App 配置App
  • 原文地址:https://www.cnblogs.com/programb/p/14068487.html
Copyright © 2011-2022 走看看