为什么在Java中调用容器类的方法而不是它的实例

问题描述 投票:4回答:5

我正在尝试学习java集合。但是有一种特殊的语法,我无法理解调用收集方法。像.toString().sort() e。 G。 ;

我不明白为什么我们从Arrays类或Collections类调用以下方法。对于打印阵列,这在println()内部调用。

Arrays.toString(myArray);

用于排序列表

Collections.sort(myList);

那么为何不 ?

myArray.toString();

myList.sort();

任何人都可以带我走过吗?

java class methods collections call
5个回答
1
投票

docs的第一行:

集合框架是一个统一的体系结构,用于表示和操作集合,使它们能够独立于其表示的细节进行操作。它减少了编程工作量,同时提高了性它实现了不相关API之间的互操作性,减少了设计和学习新API的工作量,并促进了软件重用。该框架基于十几个集合接口。它包括这些接口的实现和操作它们的算法。

目标是减少代码重复。在myList.sort()的情况下,List接口的所有实现都必须实现sort函数,并且每个实现的排序可能在行为上有所不同。但是作为Collections类的静态方法,List实现不需要实现sort函数。从用户的角度来看,你可以将你拥有的任何List传递给Collections.sort()并知道会发生什么。

从Java 8开始,这个功能可以用默认方法实现,这就是List.sort(comparator)所做的。默认方法允许所有实现接口接收接口中定义的实现,因此从Java 8可以做myList.sort(),但需要告诉它如何通过提供比较函数进行排序。例如,假设你有一个List<Integer>mylist.sort(Integer::compareTo)。但Collections Framework早于默认方法,因此需要Collections.sort()

除了Collections.sort()List.sort(comparator),你也可以使用Stream.sorted()myList.stream().sorted().collect(Collectors.toList());


3
投票

你的两个例子的原因是不同的:

数组类型中没有toString的自定义实现。对于MyType[].toString(),开发人员不会为数组类型“覆盖”toString()。这就是提供助手Arrays.toString的原因。数组类型的toString实现是从Object继承的,它几乎总是不是很有帮助。

List.sortdefault中的List方法,在Java 8中引入。在此之前,可以仅使用Collections.sort进行排序。如果你看一下Collections.sort的来源,它会将排序本身委托给List.sort。至于为什么从一开始就不在List,这只能由API设计师来回答。但是,我能想到的一个原因是一致性(Collections有许多静态集合方法,而Java在版本8之前不支持接口中的静态方法)。


0
投票

最好使用

Arrays.toString(myArray);

代替

myArray.toString();

因为,如果myArray为null,则myArray.toString()将抛出java.lang.NullPointerException,但Arrays.toString(myArray)将返回null。与myArray.sort()相同


0
投票

Java的toString()用于数组是打印[,后跟一个表示数组元素类型的字符,然后是@,然后是数组的“身份哈希码”(想象它就像你的“内存地址”)。

要获得人类可以理解的有意义的东西,你需要Arrays.toString(myArray);

数组不会覆盖toString,有一个静态方法:java.util.Arrays.toString来救援。


0
投票

您不能直接在对象上调用这些静态方法,因为参数不匹配。方法绑定到类而不是它的特定实例,因此您必须将对象作为参数。此外,这些方法做了不同的事情:

Arrays.toString(myArray);

是一种打印数组内容的便捷方法。如果你调用myArray.toString(),则打印对象的哈希码。

© www.soinside.com 2019 - 2024. All rights reserved.