我正在尝试学习java集合。但是有一种特殊的语法,我无法理解调用收集方法。像.toString()
或.sort()
e。 G。 ;
我不明白为什么我们从Arrays类或Collections类调用以下方法。对于打印阵列,这在println()
内部调用。
Arrays.toString(myArray);
用于排序列表
Collections.sort(myList);
那么为何不 ?
myArray.toString();
myList.sort();
任何人都可以带我走过吗?
从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());
你的两个例子的原因是不同的:
数组类型中没有toString
的自定义实现。对于MyType[].toString()
,开发人员不会为数组类型“覆盖”toString()
。这就是提供助手Arrays.toString
的原因。数组类型的toString
实现是从Object
继承的,它几乎总是不是很有帮助。
List.sort
是default
中的List
方法,在Java 8中引入。在此之前,可以仅使用Collections.sort
进行排序。如果你看一下Collections.sort
的来源,它会将排序本身委托给List.sort
。至于为什么从一开始就不在List
,这只能由API设计师来回答。但是,我能想到的一个原因是一致性(Collections
有许多静态集合方法,而Java在版本8之前不支持接口中的静态方法)。
最好使用
Arrays.toString(myArray);
代替
myArray.toString();
因为,如果myArray为null,则myArray.toString()将抛出java.lang.NullPointerException,但Arrays.toString(myArray)将返回null。与myArray.sort()相同
Java的toString()
用于数组是打印[
,后跟一个表示数组元素类型的字符,然后是@
,然后是数组的“身份哈希码”(想象它就像你的“内存地址”)。
要获得人类可以理解的有意义的东西,你需要Arrays.toString(myArray);
数组不会覆盖
toString
,有一个静态方法:java.util.Arrays.toString
来救援。
您不能直接在对象上调用这些静态方法,因为参数不匹配。方法绑定到类而不是它的特定实例,因此您必须将对象作为参数。此外,这些方法做了不同的事情:
Arrays.toString(myArray);
是一种打印数组内容的便捷方法。如果你调用myArray.toString()
,则打印对象的哈希码。