为什么是 java.lang.String 唯一存在两种创建方式的类:

1)用正常方式“new” 关键字。

String s = new String("abc");

2) 与 String 文字(仅适用于 String 班级)

String s = "abc";

那么为什么会有 String 文字并且没有任何其他类的文字?

有帮助吗?

解决方案

String是一个普通的类,代表编程的基本元素之一(其他是数字和布尔值)。因此,Java从第一天开始就将String对象视为半原始变量,并允许这样做。

稍后,当自动装箱成为标准编译器的一部分时,您也可以用这种方式构建数字包装器对象,即

Integer i = 123;
正如Tom Hawtin-tackline在评论中提到的那样。

其他提示

简短的回答,因为语言设计师感觉就像。

我猜String是一个普通的类,他们做了一个例外。我确信还有一些其他类似的例外,(参见Tom Hawtins评论)

不考虑自动装箱(不计算IMO - 文字用于原始类型而不是类;只是隐式转换为包装类), String(String)构造函数实际上很有用。它需要一个字符数据的副本,这意味着如果原始字符串很小但具有较大的后备 char [] ,则新字符串独立于它。 / p>

例如,如果您从文件中读取短行,这可能很重要。

至于为什么有字符串文字:因为它们很有用。你还会有什么?你想强迫开发者使用:

String x = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });

并且同时没有实习?

你想要一个文字的其他课程?可以说地图和列表的文字是有用的 - 我不记得他们是否会使用Java 7。您可以将数组初始值设定项视为“有点像文字”。因为它是对象初始化的简写。

我想因为String是基本数据类型,他们认为它与基元处于同一级别。

顺便说一下,

new String("abc");

实际上创建了2个字符串:

  1. 被扣留的一个,你失去了参考
  2. 具有相同内容的新实例
  3. 就个人而言,我从未发现需要使用String的构造函数。

最后我查了一下:

Integer wInt = 1;

工作得很好。

后一种创建形式还涉及字符串实习。也就是说,如果您有代码:

String s = "abc";
String t = "abc";

编译器将对此进行优化,并且您将获得对同一 String 对象的两个引用。(s == t 为真)。

字符串驻留也适用于字符串表达式。

当然,对于所有原始数字类型,以及布尔值true和false以及字符,也有文字。我想你可以回答一下,在你的问题中,你在技术上说“没有任何其他类的文字”。好的。我想有人指出“null”是一个文字对象,所以你的陈述在技术上是不准确的,但我认为这是唯一的另一个例子。

然而,接下来,下一个显而易见的问题是,您希望其他课程有哪些文字?如果您正在设计语言,那么BufferedReader文字会是什么样子?或者ResultSet文字?还是JCheckBox?

理论上你可以说,例如,“文件文字”和“文件文字”。是包含在某个特殊分隔符中的文件名,例如“$ / home / bob / myfile.txt $”。但是有人可以说,对于一个JButton来说,我们不能为它做一个文字就像按钮的文本和它触发的ActionListener和适当的分隔符,如“%Submit,SubmitListener%”。那么套接字怎么样,我们不能把主机名放在一些特殊的分隔符等等。我认为很明显我们很快就会用掉标点符号作为分隔符。因此,我们最终必须编写某种文本来识别我们正在讨论的类,例如说文件(“/home/bob/myfile.txt"”)或Socket(“www.example.com”等)。 ,631)。但这看起来很像构造函数,我们会回到Java的作者实际做的事情。

“事物”的数量。可以纯粹由值的性质表示(例如,所有数字都是数字文字)或者用标点符号表示非常受限于可以非常适合键盘的标点符号的数量。你想要一个带有600个特殊图标的键盘来处理你可能想要谈论的所有不同类型的东西吗?言语更容易,更灵活。

字符串是如此常用,替代品本身也很笨拙,因此将其作为一种特殊情况是有意义的。

字符串文字是一个方便的捷径,具有良好的优先级(在C中)和语法。如果Java设计者想引诱C ++程序员,那么字符串文字就必须存在。幸运的是,字符串处理在Java中比在C ++中更加安全。

没有其他标准对象具有事实上的语法 - 您将如何编写地图文字?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top