- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
执行String S1 = "hello";
后,JVM将在SCP中创建一个String对象,该对象将在value
字段中保存一个字符数组,如
s1.value = {'h', 'e', 'l', 'l', 'o'}
当我们说
String s2 = new String("hello");
并且根据String
类的源码,构造函数执行后s2.value
也会变成"hello".value
,即类似于s1.value
。
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
所以每次我们使用new
创建String对象时,JVM都会创建
堆中的对象内部指向SCP中的文字对象。
每次,我们都会对 s2
或任何其他字符串(无论是从文字创建还是使用 new
创建)进行更改,生成一个新的字符串文字将在堆上创建,新更改的 s2
将指向该堆。
使用String s2 = new String("hello")
不会在堆中创建"hello"
对象。仅当 SCP 中不存在并且 s2 指向它时,JVM 才会在 SCP 中创建“hello”。
我的问题不是,new String("hello")
或简单的 "hello"
之间有什么区别。
我的问题是当使用public String(String original)
时只是在堆中创建空字符串对象并浪费内存为什么Java允许开发人员调用public String(String original)
> 为什么它甚至在 String 类中提供,它有什么好处?
最佳答案
Joshua Bloch 的《Effective Java》,第二版,第 4 章,第 15 项中有一个有趣的陈述:
A consequence of the fact that immutable objects can be shared freely is that you never have to make defensive copies (Item 39). In fact, you never have to make any copies at all because the copies would be forever equivalent to the originals. Therefore, you need not and should not provide a
clone
method or copy constructor (Item 11) on an immutable class. This was not well understood in the early days of the Java platform, so theString
class does have a copy constructor, but it should rarely, if ever, be used (Item 5).
(我的副本中的第 76 页)
我认为,Joshua Bloch 可以被视为权威来源,特别是 Java 发明者之一 James Gosling 曾被引用说:“我真希望十年前就拥有这本书……”(指 2001 年第一版) )。
因此,String(String)
构造函数的存在可以被视为一个设计错误,就像无参数 String()
构造函数一样。另请注意工厂方法的存在 String.valueOf(char[])
/String.valueOf(char[],int,int)
和 String.copyValueOf(char[])
/String.copyValueOf(char[],int,int)
,其命名暗示了根本不存在的根本区别。 String
的不可变性质要求所有变体都创建所提供数组的防御性副本,以防止后续修改。因此,无论您使用 valueOf
还是 copyValueOf
,行为都是完全相同的(文档明确说明了这一点)。
也就是说,有一些实际的用例,尽管不一定符合初衷。其中一些在this question的答案中进行了描述。 。由于 new 操作保证生成新实例,因此它对于依赖于不同身份的任何后续操作可能很有用,例如同步该实例(这并不是一个好主意)或尝试通过身份比较来识别该实例,以确保它不是来自外部源。例如,您可能想要区分属性的默认值和已显式设置的值。然而,这用途有限,因为即使字符串内容没有改变,其他代码也可能无法保证在其操作中维护对象标识。或者,一旦遇到该字符串,它可能会记住您的特殊实例并重用它。
在 Java 7、更新 6 之前,String
有一个 offset
和 length
字段,允许使用廉价的子字符串
操作,引用原始数组内的范围,而不进行复制。这导致了这样的情况:(概念上)小字符串可以保存对相当大数组的引用,从而阻止其垃圾收集。对于引用实现(由 Sun/后来的 Oracle 提供),通过 String(String)
构造函数重新创建字符串会生成一个带有数组新副本的 String
,占用仅需要所需的内存。所以这是一个用例,结合了针对特定于实现的问题的特定于实现的修复......
当前的 Java 版本不维护这些 offset
和 length
字段,这意味着可能更昂贵的 substring
操作,但在不再是 String(String)
构造函数了。这是您在问题中引用的版本,其源代码。旧版本可以在 this answer 中找到。 .
关于java - 当它间接指向 ("hello"时,使用 new String "hello") 是否比简单的 "hello"完全无用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40721145/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!