Java中用“ ”初始化String:一种特殊情况
Java的String类,尽管是面向对象的实体,但可以被初始化使用双引号。这种特性引发了一个问题:在面向对象编程的范围内,这怎么可能?
Java 的独特方法
与 Java 中的一切都必须的概念相反作为一个对象,出于性能原因,该语言的设计者选择保留原始数据类型。与堆分配的对象相比,驻留在调用堆栈中的基元可提供更快的处理速度和更低的内存使用量。
为了平衡这些考虑因素,Java 的 String 被设计为混合体。它的行为类似于基元,但也具有对象的一些特征。
字符串文字池
当使用双引号创建字符串文字时,它会直接分配给字符串文字池。该池存储常用字符串的共享存储库以优化内存使用。对同一字符串文字的后续引用将从该池中提取,避免不必要的重复。
String Object
相反,当使用“new”实例化 String 对象时运算符,它像其他对象一样分配在堆上。这些 String 对象是不同的,并占用自己的内存空间。
比较和存储
为了说明此行为,请考虑以下代码片段:
String s1 = "Hello"; // String literal String s2 = "Hello"; // String literal String s3 = s1; // Same reference String s4 = new String("Hello"); // String object String s5 = new String("Hello"); // String object
如图所示,s1、s2、s3 都指向池中同一个 String 字面量,而 s4 和 s5 是不同的 String 对象。
含义和注意事项
这种独特的行为对于字符串操作具有重要的影响。由于文字是不可变且共享的,因此修改一个文字会影响对其的所有引用。然而,String 对象是可变的,允许修改特定实例而不影响其他实例。
考虑这些区别对于 Java 程序中高效且正确的字符串处理至关重要。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3