@@ -2685,6 +2685,62 @@ All: 49999995000000
26852685< ! -- Summary -- >
26862686## 本章小结
26872687
2688+ Java 为固定大小的低级数组提供了合理的支持。这种数组强调的是性能而不是灵活性,就像C 和c++ 数组模型一样。在Java 的最初版本中,固定大小的低级数组是绝对必要的,这不仅是因为Java 设计人员选择包含原生类型(也考虑到性能),还因为那个版本对集合的支持非常少。因此,在早期的Java 版本中,选择数组总是合理的。
2689+
2690+ 在Java 的后续版本中,集合支持得到了显著的改进,现在集合在除性能外的所有方面都优于数组,即使这样,集合的性能也得到了显著的改进。正如本书其他部分所述,无论如何,性能问题通常不会出现在您设想的地方。
2691+
2692+ 使用自动装箱和泛型,在集合中保存原生类型是毫不费力的,这进一步鼓励您用集合替换低级数组。由于泛型产生类型安全的集合,数组在这方面也不再有优势。
2693+
2694+ 如本章所述,当您尝试使用泛型时,您将看到泛型对数组是相当不友好的。通常,即使可以让泛型和数组以某种形式一起工作(在下一章中您将看到),在编译期间仍然会出现“unchecked”警告。
2695+
2696+ 有几次,当我们讨论特定的例子时,我直接从Java 语言设计人员那里听到我应该使用集合而不是数组(我使用数组来演示特定的技术,所以我没有这个选项)。
2697+
2698+ 所有这些问题都表明,在使用Java 的最新版本进行编程时,应该“优先选择集合而不是数组”。只有当您证明性能是一个问题(并且切换到一个数组实际上会有很大的不同)时,才应该重构到数组。这是一个相当大胆的声明,但是有些语言根本没有固定大小的低级数组。它们只有可调整大小的集合,而且比C / C ++ / java风格的数组功能多得多。例如,Python 有一个使用基本数组语法的列表类型,但是具有更大的功能—您甚至可以从它继承:
2699+
2700+ ```Python
2701+ # arrays/ PythonLists . py
2702+
2703+ aList= [1 ,2 ,3 ,4 ,5 ]print(type(aList)) #< type ' list' >
2704+ print(aList) # [1 ,2 ,3 ,4 ,5 ]
2705+ print(aList[4 ]) # 5Basic list indexing
2706+ aList. append(6 ) # lists can be resized
2707+ aList+= [7 ,8 ] # Add a list to a list
2708+ print(aList) # [1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ]
2709+ aSlice= aList[2 : 4 ]
2710+ print(aSlice) # [3 ,4 ]
2711+
2712+ class MyList (list): # Inherit from list
2713+ # Define a method;'this'pointer is explicit:
2714+ def getReversed(self):
2715+ reversed=self[:] # Copy list using slices
2716+ reversed.reverse() # Built-in list method
2717+ return reversed
2718+ # No'new'necessary for object creation:
2719+ list2=MyList(aList)
2720+ print(type(list2)) #<class '__main__.MyList'>
2721+ print(list2.getReversed()) # [8,7,6,5,4,3,2,1]
2722+ output="""
2723+ <class 'list'>
2724+ [1, 2, 3, 4, 5]
2725+ 5
2726+ [1, 2, 3, 4, 5, 6, 7, 8]
2727+ [3, 4]
2728+ <class '__main__.MyList'>
2729+ [8, 7, 6, 5, 4, 3, 2, 1]
2730+ """
2731+
2732+ ```
2733+ 前一章介绍了基本的Python语法。在这里,通过用方括号包围以逗号分隔的对象序列来创建列表。结果是一个运行时类型为list的对象(print语句的输出显示为同一行中的注释)。打印列表的结果与在Java中使用Arrays.toString()的结果相同。
2734+ 通过将 : 操作符放在索引操作中,通过切片来创建列表的子序列。list类型有更多的内置操作,通常只需要序列类型。
2735+ MyList是一个类定义;基类放在括号内。在类内部,def语句生成方法,该方法的第一个参数在Java中自动与之等价,除了在Python中它是显式的,而且标识符self是按约定使用的(它不是关键字)。注意构造函数是如何自动继承的。
2736+
2737+ 虽然一切在Python中真的是一个对象(包括整数和浮点类型),你仍然有一个安全门,因为你可以优化性能关键型的部分代码编写扩展的C, c++或使用特殊的工具设计容易加速您的Python代码(有很多)。通过这种方式,可以在不影响性能改进的情况下保持对象的纯度。
2738+
2739+ PHP甚至更进一步,它只有一个数组类型,既充当int索引数组,又充当关联数组(Map)。
2740+
2741+ 在经历了这么多年的Java发展之后,我们可以很有趣地推测,如果重新开始,设计人员是否会将原生类型和低级数组放在该语言中(同样在JVM上运行的Scala语言不包括这些)。如果不考虑这些,就有可能开发出一种真正纯粹的面向对象语言(尽管有这样的说法,Java并不是一种纯粹的面向对象语言,这正是因为它的底层缺陷)。关于效率的最初争论总是令人信服的,但是随着时间的推移,我们已经看到了从这个想法向更高层次的组件(如集合)的演进。此外,如果集合可以像在某些语言中一样构建到核心语言中,那么编译器就有更好的机会进行优化。
2742+
2743+ 撇开““Green-fields”的推测不谈,我们肯定会被数组所困扰,当你阅读代码时就会看到它们。然而,集合几乎总是更好的选择。
26882744
26892745
26902746<!-- 分页 -->
0 commit comments