Java中的ArrayList与Python中的List有何不同?

4
为什么Java中的ArrayList可以哈希,而Python中的List却不行。这只是开发人员或语言语义选择的结果。
我认为Python不允许List可哈希化是因为它是可变的,因此哈希值可能会随着对象生命周期的改变而改变。
这是一个好的特性还是坏的特性?为什么Java允许它呢?
public class Test {

    public static void main(String[] args) {


        ArrayList<String> list = new ArrayList<String>();

        list.add("hello");

        System.out.println(list.hashCode());

    }

}

下面的代码不起作用,而上面的可以正常工作。

>>> l = ["hello"]
>>> l.__hash__()

Traceback (most recent call last):
  File "<pyshell#103>", line 1, in <module>
    l.__hash__()
TypeError: 'NoneType' object is not callable

请告诉我们为什么要进行负投票。 - Roberto
2
尝试编辑你的问题,使其不那么随意和模糊。不要因为进一步的负评而责怪 - djechlin
1个回答

4
你是正确的,Python中的列表不可哈希化,因为Python不允许可变数据作为字典的键。
Java的ArrayLists是可哈希的,因为Java一方面没有任何语言级别的不可变性支持,另一方面强制所有对象都是可哈希的。哈希是否“有用”取决于类的实现。
我认为“故事”就是Python在语言级别上支持字典,并围绕此做出了一些设计决策,而Java则没有。
虽然Python是“弱类型的”对于“弱类型”的某种定义来说,但你不应该推断Python是编程语言的无序之地,在那里一切都可以自由发挥而没有内置的安全性。那将是Perl或Javascript。

我不明白你所说的语言级别支持是什么意思,Java中也有字典。 - User
1
Python 是一门强类型语言。 - User
1
@用户 http://ericlippert.com/2012/10/15/is-c-a-strongly-typed-or-a-weakly-typed-language/ - djechlin
2
@用户字典是Python语言的一部分(例如kwargs)。Java有HashMap和Hashtable,但这些只是类。没有特殊的语法或语言功能需要它们。 - Paul Boddington
@用户,我认为“弱类型”和“强类型”是相对的形容词,是主观而非技术性描述,这一点应该是普遍理解的。在你提出问题后,我添加了一个链接,以便更清楚地说明。我用引号标注了这个短语,以强调我的不精确之处。我认为这已经足够详尽了。 - djechlin
显示剩余5条评论

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