static final String =“ something”-静态有意义吗?

卡洛·贝图奇尼
static final String = "something";

我想知道这样的声明在Java中是否具有某种实际意义。我已经在代码中发现了数千次,但是研究并使用了字符串,据我了解,声明String对象的次数并不重要:如果在您的类之前声明了该字符串,则将其合并并重用(谈论在没有显式构造函数调用的情况下创建的字符串)

public class StringCompare {   
    private void toCompare(String h) {
        String x = "hello";
        System.out.println( x == h);
    }

    public void compare() {
        String h = "hello";
        toCompare(h);
    }      
}

实际上,此代码在true调用compare时打印,因此2个变量都引用同一对象。表示final无法重新定义变量,在这种情况下static单词完全没有用我错过了重点吗?

还有两件事:

1-为什么显式调用String构造函数不会导致将String合并?与上面相同的代码使用new String("hello")打印false

2-池行为是否保留给字符串?还有其他一些不可变的对象(例如BigInteger),但我认为这些对象没有被合并...为什么?

谢谢,卡洛

克里斯·克

尽管您对运行时行为及其使用的字符串池的分析是正确的,但仍有一些原因使开发人员使用此模式。

  1. 它更清晰地传达了开发人员的意图。具体地说,字符串现在的名称希望比常量更清晰,并且它传达了并非所有人都知道的运行时行为(或者他们有时会忘记)。
  2. 如果开发人员想要更改源文件中的值,并且已在多个位置使用它,则只有一个位置可以进行更改。
  3. 一旦决定使用变量,关键字static将意味着内存使用率较低。也就是说,只有一个字段用于存储引用,而不是每个对象实例一个字段。

至于您对问题的关注:

  1. 问:为什么显式调用String构造函数不会导致将String合并?与上面相同的代码使用一个新的String(“ hello”)打印false。

因为字符串池仅用于字符串文字,如JLS所述,并且调用构造函数时未归类为字符串文字。

  1. 问:池行为是否保留给字符串?

字符串池仅用于字符串文字,但是当然还有针对不同用例的其他缓存。最容易想到的是用于优化自动装箱的int缓存。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

static final String =“ something”-静态有意义吗?

来自分类Dev

返回Try [Option [String]]是否有意义?

来自分类Dev

PyGTK仍然有意义吗?

来自分类Dev

PyGTK仍然有意义吗?

来自分类Dev

base()的用法有意义吗?

来自分类Dev

属性的属性有意义吗?

来自分类Dev

静态多态性对实现接口有意义吗?

来自分类Dev

指向成员的指针对静态成员有意义吗?

来自分类Dev

是吗 超级/扩展byte []有意义吗?

来自分类Dev

像String这样的不可变对象而不是仅使用static final的实际好处是什么?

来自分类Dev

使用R进行回归的randomForest有意义吗?

来自分类Dev

缩小和缩小都有意义吗?

来自分类Dev

Abs(无符号长整数)有意义吗?

来自分类Dev

单例模式对套接字有意义吗?

来自分类Dev

使IO成为MonadCont的实例有意义吗?

来自分类Dev

REM在边界半径上有意义吗?

来自分类Dev

阻止全局迭代器有意义吗?

来自分类Dev

python中的`def main(args):`有意义吗?

来自分类Dev

测试猫鼬模型有意义吗?

来自分类Dev

catch(...)总是有意义吗?

来自分类Dev

HTML元素上的rem单位有意义吗?

来自分类Dev

混合正则化符有意义吗?

来自分类Dev

Little Man Computer仍然有意义吗?

来自分类Dev

将btrfs放在lvm上有意义吗?

来自分类Dev

使IO成为MonadCont的实例有意义吗?

来自分类Dev

对ConcurrentDictionary进行排序有意义吗?

来自分类Dev

单例模式对Socket有意义吗?

来自分类Dev

交流定义宏有意义吗?

来自分类Dev

这种家庭网络配置有意义吗?