From 1dc1a75886236c4588301c092123e805a6aa8888 Mon Sep 17 00:00:00 2001 From: X-ljy <17637938901@163.com> Date: Fri, 11 Oct 2019 20:50:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=AB=A0=E8=8A=82=E5=AE=8C?= =?UTF-8?q?=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/book/21-Arrays.md | 56 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/docs/book/21-Arrays.md b/docs/book/21-Arrays.md index b14925c..74c5e67 100644 --- a/docs/book/21-Arrays.md +++ b/docs/book/21-Arrays.md @@ -2685,6 +2685,62 @@ All: 49999995000000 ## 本章小结 +Java为固定大小的低级数组提供了合理的支持。这种数组强调的是性能而不是灵活性,就像C和c++数组模型一样。在Java的最初版本中,固定大小的低级数组是绝对必要的,这不仅是因为Java设计人员选择包含原生类型(也考虑到性能),还因为那个版本对集合的支持非常少。因此,在早期的Java版本中,选择数组总是合理的。 + +在Java的后续版本中,集合支持得到了显著的改进,现在集合在除性能外的所有方面都优于数组,即使这样,集合的性能也得到了显著的改进。正如本书其他部分所述,无论如何,性能问题通常不会出现在您设想的地方。 + +使用自动装箱和泛型,在集合中保存原生类型是毫不费力的,这进一步鼓励您用集合替换低级数组。由于泛型产生类型安全的集合,数组在这方面也不再有优势。 + +如本章所述,当您尝试使用泛型时,您将看到泛型对数组是相当不友好的。通常,即使可以让泛型和数组以某种形式一起工作(在下一章中您将看到),在编译期间仍然会出现“unchecked”警告。 + +有几次,当我们讨论特定的例子时,我直接从Java语言设计人员那里听到我应该使用集合而不是数组(我使用数组来演示特定的技术,所以我没有这个选项)。 + +所有这些问题都表明,在使用Java的最新版本进行编程时,应该“优先选择集合而不是数组”。只有当您证明性能是一个问题(并且切换到一个数组实际上会有很大的不同)时,才应该重构到数组。这是一个相当大胆的声明,但是有些语言根本没有固定大小的低级数组。它们只有可调整大小的集合,而且比C/C++/java风格的数组功能多得多。例如,Python有一个使用基本数组语法的列表类型,但是具有更大的功能—您甚至可以从它继承: + +```Python +# arrays/PythonLists.py + +aList=[1,2,3,4,5]print(type(aList)) # +print(aList) # [1,2,3,4,5] + print(aList[4]) # 5Basic list indexing + aList.append(6) # lists can be resized + aList+=[7,8] # Add a list to a list + print(aList) # [1,2,3,4,5,6,7,8] + aSlice=aList[2:4] + print(aSlice) # [3,4] + +class MyList(list): # Inherit from list + # Define a method;'this'pointer is explicit: + def getReversed(self): + reversed=self[:] # Copy list using slices + reversed.reverse() # Built-in list method + return reversed + # No'new'necessary for object creation: + list2=MyList(aList) + print(type(list2)) # + print(list2.getReversed()) # [8,7,6,5,4,3,2,1] + output=""" + + [1, 2, 3, 4, 5] + 5 + [1, 2, 3, 4, 5, 6, 7, 8] + [3, 4] + + [8, 7, 6, 5, 4, 3, 2, 1] + """ + +``` +前一章介绍了基本的Python语法。在这里,通过用方括号包围以逗号分隔的对象序列来创建列表。结果是一个运行时类型为list的对象(print语句的输出显示为同一行中的注释)。打印列表的结果与在Java中使用Arrays.toString()的结果相同。 +通过将 : 操作符放在索引操作中,通过切片来创建列表的子序列。list类型有更多的内置操作,通常只需要序列类型。 +MyList是一个类定义;基类放在括号内。在类内部,def语句生成方法,该方法的第一个参数在Java中自动与之等价,除了在Python中它是显式的,而且标识符self是按约定使用的(它不是关键字)。注意构造函数是如何自动继承的。 + +虽然一切在Python中真的是一个对象(包括整数和浮点类型),你仍然有一个安全门,因为你可以优化性能关键型的部分代码编写扩展的C, c++或使用特殊的工具设计容易加速您的Python代码(有很多)。通过这种方式,可以在不影响性能改进的情况下保持对象的纯度。 + +PHP甚至更进一步,它只有一个数组类型,既充当int索引数组,又充当关联数组(Map)。 + +在经历了这么多年的Java发展之后,我们可以很有趣地推测,如果重新开始,设计人员是否会将原生类型和低级数组放在该语言中(同样在JVM上运行的Scala语言不包括这些)。如果不考虑这些,就有可能开发出一种真正纯粹的面向对象语言(尽管有这样的说法,Java并不是一种纯粹的面向对象语言,这正是因为它的底层缺陷)。关于效率的最初争论总是令人信服的,但是随着时间的推移,我们已经看到了从这个想法向更高层次的组件(如集合)的演进。此外,如果集合可以像在某些语言中一样构建到核心语言中,那么编译器就有更好的机会进行优化。 + +撇开““Green-fields”的推测不谈,我们肯定会被数组所困扰,当你阅读代码时就会看到它们。然而,集合几乎总是更好的选择。