- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设我有这个代码:
String[] left = { "1", "2" };
String[] leftNew = Collections.emptyList().toArray(left);
System.out.println(Arrays.toString(leftNew));
[null, 2]
.这种是有道理的,因为我们有一个空列表,它以某种方式假设处理我们正在传递一个更大的数组并将第一个元素设置为 null 的事实。这大概是说空列表中不存在第一个元素,因此设置为
null
.
String[] right = { "nonA", "b", "c" };
// or Collections.singletonList("a");
// or a plain List or Set; does not matter
String[] rightNew = Collections.singleton("a").toArray(right);
System.out.println(Arrays.toString(rightNew));
["a", "b", "c"]
[a, null, c]
If this set fits in the specified array with room to spare (i.e., the array has more elements than this set), the element in the array immediately following the end of the set is set to null.
This is useful in determining the length of this set only if the caller knows that this set does not contain any null elements.
String[] middle = { "nonZ", "y", "u", "m" };
List<String> list = new ArrayList<>();
list.add("z");
list.add(null);
list.add("z1");
System.out.println(list.size()); // 3
String[] middleNew = list.toArray(middle);
System.out.println(Arrays.toString(middleNew));
[z, null, z1, null]
最佳答案
<T> T[] toArray(T[] a)
Collection 上的方法很奇怪,因为它试图同时实现两个目的。
首先我们来看toArray()
.这从集合中获取元素并在 Object[]
中返回它们。 .即返回数组的组件类型总是Object
.这很有用,但它不能满足其他几个用例:
1) 如果可能,调用者想要重用现有的数组;和
2)调用者想要指定返回数组的组件类型。
处理案例 (1) 原来是一个相当微妙的 API 问题。调用者想要重用一个数组,所以显然需要传入它。与 no-arg toArray()
不同。方法,它返回一个合适大小的数组,如果调用者的数组被重用,我们需要一种方法来返回复制的元素数量。好的,让我们有一个看起来像这样的 API:
int toArray(T[] a)
void copyInto(Object[] anArray)
IndexOutOfBoundsException
如果目标数组太短。由于 Vector 是一个并发集合,在调用之前大小可能随时发生变化,因此调用者无法保证目标数组有足够的大小,也无法知道复制的元素数量。调用者唯一能做的就是在整个序列周围锁定 Vector:
synchronized (vec) {
Object[] a = new Object[vec.size()];
vec.copyInto(a);
}
Collections.toArray(T[])
如果目标数组太小,API 会通过不同的行为来避免这个问题。它不会像 Vector.copyInto() 那样抛出异常,而是分配一个大小合适的新数组。这将牺牲阵列重用情况以获得更可靠的操作。现在的问题是调用者无法判断它的数组是被重用还是分配了一个新数组。因此,返回值
toArray(T[])
需要返回一个数组:参数数组,如果它足够大,或者新分配的数组。
null
将复制的元素数量传达给调用者。到从集合中复制的最后一个元素之后的数组位置。如果知道源集合没有空值,这将使调用者能够确定复制的元素数。调用后,调用者可以搜索数组中的第一个空值。如果有,它的位置决定了复制的元素数量。如果数组中没有空值,则知道复制的元素数等于数组的长度。
MyType[] a = coll.toArray(new MyType[0]);
toArray(new MyType[coll.size()])
实际上更慢。这是因为需要初始化数组为空值,然后用集合的内容填充它。请参阅 Alexey Shipilev 关于此主题的文章,
Arrays of Wisdom of the Ancients。)
MyType[] a = coll.toArray(MyType[]::new);
关于java - 集合 emptyList/singleton/singletonList/List/Set toArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51902362/
我一直在学习如何使用 java 进行编程,但对于 LinkedList 的 toArray(T[] a) 的区别我还没有得到任何明确的解释和 toArray() 方法。第二个简单地将 LinkedLi
查看 java 集合框架的 java api,我在 HashSet 中找不到 toArray() 方法,抽象类 Set 中有 toArray() 方法。 class Ideone { publ
对不起,如果我问的是愚蠢的问题,但任何人都可以解释以下两个调用 (ToArray) 之间的区别。在智能感知中,它不会将它们显示为重载方法,当然这两个调用的输出是相同的。 List i = new Li
考虑以下代码: List myList = Arrays.asList(1, 2, 3); String[] myArray1 = myList.toArray(new String[myList.s
我有一个ArrayList叫listtable 。由于某种原因Clause[] whatever = listtable.toArray()给出不兼容的类型错误,但 Clause[] whatever
我从不使用重载版本的 toArray Object[] toArray(Object[] a) 将集合转换为数组。 下面是我的javacode- public class Track { publi
我需要将 ID 列表转换为 ID 数组。我可以通过多种方式做到这一点,但不确定应该使用哪一种。 说, 1. ids.stream().toArray(Id[]::new) 2. ids.toArray
我试图通过在类中实现 List 接口(interface)来稍微调整 List。 我可以毫无问题地重写和实现所有方法,除了这个: T[] toArray(T[] a); Android Studio
我对 Node.js 和 MongoDB 非常陌生,正在尝试拼凑我自己的博客应用程序。我在尝试通过我的“博客”模型查询具有特定用户名的模型时遇到问题。当我尝试运行时: var userBlogs =
根据 toArray() 的 java 文档返回包含此集合中所有元素的数组。 和 toArray(Object obj[])。返回包含此集合中所有元素的数组;返回数组的运行时类型是指定数组的类型。 第
当尝试从 IEnumerable 对象集合中获取对象数组时(与我想要的数组不同的转换方式),我知道我可以先将源集合转换为正确的类型,然后从中获取数组,但是方法 ToArray() 给我的印象是它可以一
这些查询之间有区别吗?我很想知道 mongo 如何解释传递给 map 方法的 javascript 代码与查询解析后的映射。 db.collection('myCollection').find()
假设我有一个 ArrayList ArrayList myList; 我想调用toArray,是否有性能原因需要使用 MyClass[] arr = myList.toArray(new MyClas
我有一个 List在 Java 中,并希望将其转换为数组。 起初,我使用以数组作为输入的 toArray 语法,但后来我切换到无参数版本,即我从: String[] myArray = myList.
我最近在使用某种网络方法时遇到了很多问题: void CheckGfiHelpdesks(string ticket, GfiCheck[] newHelpdeskChecks, GfiCheck[]
我在我的项目中使用 angular-filter 按页面对输出对象进行排序,问题是当我使用这样的语法时: {{key}} {{dziecko.rodzina}} {{dzi
Laravel 5.8 我懒惰地将用户加载到与 crmaccount 对象具有一对一关系的相关客户 这些模型正在工作,因此当我检索预先加载的实体时,它会显示所有嵌套关系。 一行之后,我对该对象使用了“
我有一个简单的问题。 这是我的代码,问题是当我运行一些表情符号时,它会将它们显示为?,因为它将表情符号切成两半。 angular.module('Joe.filters').filter("initi
我想我已经陷入困境。由于性能原因,我正在尝试利用Java parallelStream。 函数Specimen.pick()采样并返回Specimen的实例。 我想在替换池时使用parallelStr
我写了这段代码,这是一个评级系统。我想要发生的是,当你将鼠标悬停在一颗星星上时,它应该触发之前的星星。 每当我将鼠标悬停在星星上时,图片就会发生变化,但它之前的星星不会改变。
我是一名优秀的程序员,十分优秀!