为什么没有字符串的原始类型?

37

为什么Java没有字符串的原始数据类型,而其他数据类型都有呢?


5
唉,老实说,我希望根本没有原始类型存在。 - CookieOfFortune
基本上是你在这里问的相同问题:https://dev59.com/jEvSa4cB1Zd3GeqPeW90 - David
你是真的想知道为什么没有字符串的“值类型”对象而只有原始类型吗?(即如何将字符串放在堆栈上而不是堆中?) - BrainSlugs83
@BrainSlugs83:通过使其具有足以识别可以存储在其他地方(可能但不一定在与其他对象相同的堆上)的字符序列的信息。作为一个简单的变化,让它持有一个“Object”,其中包含对“char[]”、“byte[]”或“Integer”的引用(取决于它的长度和是否包含任何非ASCII字符)。将“string”存储到“Object”会将其转换为“String”——一个包含单个类型为“string”的“final”字段的类。 - supercat
@BrainSlugs83: 将 string 作为原始类型可能会减少处理字符串时需要操作的对象数量,并允许实现一个支持子字符串的垃圾回收机制(如果字符串内容存储在特殊的“仅字符串”堆中,由GC管理)。这还将允许 == 操作符按照 + 的方式处理字符串内容。 - supercat
但是你对待它的方式并没有与对象有任何不同(即指针放在堆栈上,对象放在堆中)...-- Java 中的所有其他原始类型都是值类型吗?也许我的问题很愚蠢,如果 Java 中的所有其他原始类型都是值类型,那么这两个术语将是同义词?-- 接受的答案甚至使用“primitive”来特指“非对象”...-- 另外,如果它是一个值类型,== 仍然会起作用吗?-- 我想你可以手动使其工作--只需将所有字符串存储在一个大数组中,并传递整数...然后 == 将起作用(用于精确匹配)。 - BrainSlugs83
3个回答

62

字符串是一个对象,它不是原始类型,只是字符数组。为什么Java存在原始类型是一个有趣的问题,引自James Gosling的一次采访:

Bill Venners: 为什么Java有原始类型呢?为什么不一切都是对象呢?

James Gosling: 完全是出于效率考虑。有各种各样的人构建了整个系统,其中int和其他类型都是对象。有各种方法可以实现这一点,但它们都有严重的问题。有些方法很慢,因为它们为所有事情分配内存。有些方法则尝试创建对象,有时它们是对象,有时它们不是(这就是标准LISP系统所做的),然后事情变得非常奇怪。它有点工作,但很奇怪。

只需使其存在原始类型和对象,并且它们是不同的。你就可以解决很多问题。

简而言之,原始类型因为效率原因而存在。


30
+1 - 同样的推论是,String不是原始类型,因为将其作为原始类型并不能使其更有效率。 - Stephen C
1
确实有使用基本类型的很好的理由!只需制作一个int比浪费宝贵的时间(大约10秒)制作一个实例Integer foo = new Integer(aValueFoo);。在我看来,如果看到 Integer foo Integer foo Integer foo Integer foo...这样的代码排列会很混乱。当涉及到整数的更大事情时,Integer有其用处...基本类型是一种福音! - AMDG

20

int、char、float、double等在内存中具有固定长度。例如,一个 int 占用 4 个字节,即 32 位。

但是字符串可以具有不同的长度,它实际上是一个 char 数组。


1
那更加说明了为什么它应该是一个对象类型(即类),而不是值类型(即结构体)的原因——问题是,为什么它不是原始类型?在Java中,所有的原始类型都是值类型吗?Java中没有结构体吗? - BrainSlugs83
1
唯一的合理答案是:由于内存分配问题。整型或浮点型需要特定的内存大小,但字符串(抱歉,String)是由不确定长度的内存组成的可变长度。就是这样。非常感谢! - alejandrob

6

大多数编程语言不认为字符串是原始类型,因为实际上它是字符数组。原始类型几乎总是具有固定大小。

但我必须说,有些人可能会认为String是“原始的”,因为它是内置的。但从基本类型与组合类型相对立的意义上来看,它并不是原始类型。因为字符串是字符数组,它是一个组合类型。


有没有编程语言认为它是原始类型?在内存中固定长度会导致它成为原始类型吗? - Jeff
奇怪的是,在Javascript中,字符串是原始类型。它可以具有固定的内存长度,因为它是不可变的。 - Vojtech Ruzicka

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