srk*_*srk 5 java memory-management
首先道歉,如果这是一个非常基本的问题,我只是想知道以下字符串定义之间的区别
String x= "hello";
String y = new String("hello");
Run Code Online (Sandbox Code Playgroud)
我知道在java中,String是一个类,它既不是原始也不是包装器(如果这是一种误解,请纠正我).考虑一个A类,到目前为止我已经看过任何类的以下声明.我认为A c;是有效的,A a = new A();也是有效的.我很困惑A a ="xyz";这就是我们如何在上面的第一种类型的定义中声明一个String.我确信上面两个定义是完全不同的,就像我说它x==y返回false.我知道y是对String对象的引用.什么是x,它是如何存储在内存中的,有趣的是我发现x和y都可以访问String类的所有方法.
那么一个人的优势是什么呢.我知道每个人的适用性.
从Joshua Bloch的第二版"Effective Java"开始:
Run Code Online (Sandbox Code Playgroud)String s = new String("stringette");// DON'T DO THIS!该语句在每次执行时都会创建一个新的String实例,并且这些对象创建都不是必需的.String构造函数("stringette")的参数本身就是一个String实例,在功能上与构造函数创建的所有对象完全相同.如果在循环或频繁调用的方法中发生此用法,则可以不必要地创建数百万个String实例.改进版本简单如下:
Run Code Online (Sandbox Code Playgroud)String s = "stringette";
你得到的前几个答案是不正确的.还有就是这两种说法之间的差异.但首先,TL;DR版本:String x = "hello";在99.99999%的情况下使用.
完整答案:
这两者之间的主要区别在于,在第一种情况下,字符串是隐式intern编辑的 ; 在第二种情况下,它不是.这是一个非常真实的区别,虽然它只在特定情况下发挥作用.所以在第一种情况下,如果你有任何其他字符串具有相同的字符系列("hello"),你x将引用在所有这些地方使用的一个共享对象(这很有用,因为String实例是不可变的).在第二种情况下,您明确表示您需要(无论出于何种原因)拥有一个String与其他任何字符分开的字符序列的实例.这样做的理由非常非常少.
至于x==y,在Java中你用比较平等的字符串equals,没有==.在==与对象引用使用时操作比较引用(例如,做两个变量指向同一个对象),而不是对象的内容.
所以:除非你有充分的理由做第二种形式,否则首先选择第一种形式.
| 归档时间: |
|
| 查看次数: |
2091 次 |
| 最近记录: |