在Java中,为什么String是非原始数据类型?

7
在Java中,我们可以直接使用String来声明一个字符串变量,并指定其值。即使String是非原始数据类型,我们也不必使用new关键字来定义字符串作为数组。
有人能解释一下为什么String是非原始数据类型吗?

老实说,这并不是非常清楚。请澄清您需要什么。 - Caffeinated
你是否在问为什么我们可以在没有导入的情况下使用String?可能是重复的问题:https://dev59.com/fWsz5IYBdhLWcg3wWmfL - rousseauo
3
@rousseauo,我在那个问题中没有看到import这个词。 - takendarkk
@Takendarkk 他似乎不确定这个字符串是否是原始类型,因为他不需要导入它。(我猜的)也许他需要学习的是,他不需要定义一个数组,因为String是一个对象,默认情况下已经被导入了。 - rousseauo
1
他想知道为什么他不必使用new来创建一个String对象。为什么他可以使用字面量,即使它不是原始类型。 - takendarkk
12个回答

33

字符串是非原始数据类型,因为只有类可以拥有方法,而原始数据类型则不行。在处理字符串时,需要调用许多函数,例如substring、indexof、equals和touppercase等。如果它不是一个类,这些操作都不可能实现。

此外,通过将字符串定义为类,使其不可变和最终化,可以通过允许池化来增强安全性和效率。


谢谢,我得到了我需要的答案。 - Ank
4
如果你同意的话,那么这个回答应该会被采纳... - Rohit

11

String 的 Javadoc 明确指出 StringObject 的子类,并且进一步说明 String.equals(Object) 重写了Object.equals(Object)

JLS-3.10.5.字符串字面值 指定:

字符串字面值是由双引号括起来的零个或多个字符组成的。

此外,JLS-4.3.3. 字符串类 补充说:

字符串类的实例表示 Unicode 代码点序列。

String 对象具有常量(不变)值。

字符串字面值 (§3.10.5) 是对字符串类实例的引用。

字符串拼接操作符 + (§15.18.1) 会在结果不是编译时常量表达式 (§15.28) 时,隐式地创建一个新的 String 对象。

值得指出的是,数组也是 Object 类型,并且字符数组不是一个字符串。最后,如果一个 String 不是一个 Object,那它就不能为 null


3

2

每次在其字符串池中分配值时,String都会创建一个对象。如果您创建了一个类似的对象,它将查找并引用该对象,如果该值不存在,则会再次创建一个新对象。更多地了解字符串池,您将自动了解其中的区别。


1
我认为您混淆了“原始数据类型”和“字面量”。原始数据类型是一种不是对象的数据类型。字面量是一种方便描述数据类型比特模式的方式。例如,-1描述int的0xFFFFFFFF比特模式,“a”描述16位中小写A的Unicode代码点(0x0061)。字面量不限于描述原始数据类型。您可以描述一个数组。例如,int [] a = {1, 2, 3};
字符串字面量只是一种描述带有一些方法附加的不可变字符数组的方式。字面量是用来描述本来会非常复杂的东西的语法糖。例如:
String s = "ab";

比起以下代码要简单得多:

char[] c = new char[2];
c[0] = 'a';
c[1] = 'b';
String s = new String(c);

1

String是Java对象而不是原始数据类型。String是java.lang包的一部分,在任何Java项目中默认导入。

无需定义char数组,只需使用String。

可能有重复: Java字符串导入


1

字符串是对象,是不可变的,这意味着您不能更改对象本身,但可以更改对对象的引用。

这就是字符串的工作方式。

String myStr = "test";

这通常会创建一个名为“test”的字符串,并将其引用分配给“myStr”。需要注意的重要一点是,尽管String对象是不可变的,但它的引用变量并非如此。

1

在Java中,String是一个对象,它存储实际的字符串值所在的位置。

当生成一个字符串数组时,您需要使用new关键字,就像生成其他任何数组一样。

String[] text = new String[4]

这创建了四个String引用,指向计算机上文本所在的位置。此外,所有字符串默认为null,因为在您赋予它们内存地址上的值之前,没有要存储的内容。


1
  1. 字符串是字符数组
  2. 原始数据类型有限制,而固定数据类型没有限制
  3. 但在字符串中,大小是变化的,这就是为令字符串非原始的主要原因
  4. Java中的字符串本身就是一个类,并且具有自己的方法来操作和处理字符串类的对象
  5. 字符串有自己的特性,即它们是不可变的。

0
String str = “This is string literal”;

这是一个字符串字面量。当您声明像这样的字符串时,实际上是在调用String上的intern()方法。

此方法引用了一个内部字符串对象池。如果已经存在一个字符串值“这是字符串字面量”,那么str将引用该字符串,不会创建新的String对象。

String str = new String(“this is string created by new operator”);

这是一个字符串对象。即使“this is string created by new operator”已经存在于引用池中,JVM也被迫创建一个新的String引用。


最好的方法是判断是否有固定大小的字节,称为原始类型(primitives),而不是非原始类型(如字符串)。 - Raghavendra

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