Java 中的 ArrayList 与 Python 中的 List

Posted

技术标签:

【中文标题】Java 中的 ArrayList 与 Python 中的 List【英文标题】:ArrayList in Java vs List in Python 【发布时间】:2016-03-02 21:23:50 【问题描述】:

为什么 Java 中的 ArrayList 是可散列的,而 Python 中的 List 不是。它只是基于开发人员或语言语义的选择。

我认为 Python 不允许列表是可散列的,因为它是可变的,因此散列可以在对象的生命周期内发生变化。

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

【问题讨论】:

请告诉我们为什么投反对票 尝试编辑您的问题,使其不那么随意和模糊。不要责怪 进一步投反对票。 【参考方案1】:

您说 Python 中的列表不可散列是正确的,因为 Python 不允许可变数据成为字典的键。

Java ArrayLists 可散列的,因为Java 一方面没有任何语言级别的不变性支持,另一方面则强制所有对象都是可散列的。哈希是否“有用”取决于类的实现。

我认为“故事”只是 Python 对字典具有语言级别的支持,并围绕此做出了一些设计决策,而 Java 没有。

虽然 Python 是“弱类型”for some definition of "weakly,",但您不应该推断 Python 是编程语言的狂野西部,一切都没有内置安全性。那将是 Perl 或 javascript

【讨论】:

我不明白您所说的语言级别支持是什么意思,Java 中也有字典。 @User 它是 java 8 的特性吗?如果是这样,那么将我的答案更改为“通过 Java 7”,如果不是,那么没有。 Python 是强类型的。 @User ericlippert.com/2012/10/15/… @User 字典是 Python 语言的一部分(例如 kwargs)。 Java 有HashMapHashtable,但这些只是类。没有需要它们的特殊语法或语言功能。

以上是关于Java 中的 ArrayList 与 Python 中的 List的主要内容,如果未能解决你的问题,请参考以下文章

源码系列Java中的数据结构——数组与ArrayList

ArrayList<Byte> 与 Java 中的字符串

Java - 将 ArrayList 中的字符串与 .txt 文件中的所有文本进行比较

ArrayList与HashMap的用法

[Java]ArrayList与LinkedList的模拟实现

Java容器之Collection与ArrayList一些理解及自己用代码实现ArrayList