单个字符字符串

10

直到今天,我的观点是像"c"这样的文字会创建一个String对象。今天我听说Java并不会为单个字符的字符串创建对象。这是正确的吗?它会将该文字存储为char吗?


这将是一个有趣的概念,将单个字符的字符串自动装箱/拆箱为char... - Nick
告诉那个告诉你的人去阅读Java语言规范中关于字面量的部分。字符字面量和字符串字面量:http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#100960 - Joshua Davis
8个回答

16

不,这是错误的。即使是 "",也会创建一个 String 对象。 但是如果你输入 'c',你会得到一个字符而不是一个 String 对象。


9

"c"将创建一个字符串。'c'将创建一个字符。


6

即使是单个字符的字符串,Java也会创建一个字符串实例。以下代码将打印java.lang.String

public class Test{
    public static void main(final String[] args){
        System.out.println("c".getClass().getName());
    }
}

是的,它显然返回字符串,因为""(双引号)用于字符串,而''(单引号)用于字符。 - Woot4Moo

5

"c" 是一个 String 文本。它表示一个字符串,就像 "foo" 一样。

单个字符的 String 文本没有特殊处理(即使是零长度的 String 文本 "" 也不例外)。

如果有人告诉你这种文本被特别对待了,那么要么是错的,要么可能是在谈论另外一件事(比如某个库对它进行了特殊处理)。


1

"c" 会创建一个对象。但是,如果你在源代码的其他地方再次分配这个字面量,它不会创建一个新的对象,而是引用第一个字符串对象。

例如:

String s1 = "abc";   //creates the String object
String s2 = "abc";   //references the same object as s1

变量s1和s2都指向同一个对象,因此使用==运算符是可行的。

您可以在此处阅读更多信息:http://javatechniques.com/blog/string-equality-and-interning/


@Woot4Moo 不,那是真的。字面字符串默认情况下会被内部化。 - sfussenegger
@Woot4Moo,我同意sfussenegger的观点,所有字符串字面量默认都是interned。 intern() 的文档对此进行了澄清:http://download.oracle.com/javase/6/docs/api/java/lang/String.html#intern%28%29 - xkrz
这仍然是非常危险和糟糕的。建议始终在字符串比较中使用.equals。如果我将字符串推入字符数组中,将原始字符串置空,然后从数组重新构建字符串,这是一种使==失败的方法。是的,我意识到这不是同一件事,但这就是为什么应该使用.equals。 - Woot4Moo
同意,通常应该使用equals()进行比较。 - xkrz

1

也许所指的是,在底层创建了flyweights(不清楚在Java中是如何工作的,但我推测这个概念在某种程度上被应用于字符串)。


这对于某些操作是正确的,即substring(..),subSequence(..)和trim(),其中生成的String将在底层使用相同的char[]。但我不认为这会影响字符串字面量。 - sfussenegger

0

String 存储字符作为 char[],所以最有可能的是 "c"String 对象中表示为 new char[] { 'c' }

由于 String 类是 final 的,这意味着没有子类将单个字符字符串存储在 char c 字段中。

此外,对于单个字符的 Stringchar 的自动装箱/拆箱概念不存在 -- 就目前所知,因此可以安全地假设单个字符的字符串与任何其他类型的字符串存储方式相似。


0

在编程中,与大多数事物一样,请查看源代码 -> java.lang.String。

所有字符串都是java.lang.String的实例,没有特殊情况。每个java.lang.String都包括一个char[]和一些整数来保存开始和结束索引。请注意,char[]在Strign实例之间共享,例如当使用String.substring()时,原始char[]不会被克隆或复制,而是共享,但是开始/结束索引会被更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接