Arrays的copyOf,copyOfRange和fill方法

在本文中,我们来看看 java.util.arrays ,我们可以使用 arrays 创建,比较,排序,搜索,stream 和转化数组。
创建我们来看看,使用arrays 怎么创建一个新的数组,一般来说,我们可以使用arrays 的 copyof , copyofrange 和 fill 方法。
copyof 和 copyofrange要使用copyofrange,我们需要一个原始数组和我们想要复制的开始索引(包括)和结束索引(不包括)。 我们先定一个数组 intro。
string[] intro = new string[] { once, upon, a, time };string[] abridgement = arrays.copyofrange(storyintro, 0, 3); assertarrayequals(new string[] { once, upon, a }, abridgement); assertfalse(arrays.equals(intro, abridgement));要使用 copyof ,,我们需要使用intro和一个目标数组大小,然后我们会得到一个该长度的新数组。
string[] revised = arrays.copyof(intro, 3);string[] expanded = arrays.copyof(intro, 5);assertarrayequals(arrays.copyofrange(intro, 0, 3), revised);assertnull(expanded[4]);注意,如果我们的目标尺寸大于原始尺寸,copyof会用 null 填充数组。
fill另一种方法,我们可以创建一个固定长度的数组,就是填充,当我们想要一个所有元素都相同的数组时,这个方法很有用。
string[] stutter = new string[3];arrays.fill(stutter, once);asserttrue(stream.of(stutter).allmatch(el - > once.equals(el));注意,我们需要事先将数组实例化,而不是像string[] filled = arrays.fill(once, 3);,因为这个特性是在语言中出现泛型之前引入的。
比较我们先走来看看 arrays 的比较方法
equals 和 deepequals我们可以使用 equals 进行简单的数组大小和内容比较。 如果我们添加一个null作为其中一个元素,内容检查就会失败。
asserttrue(arrays.equals(new string[] { once, upon, a, time }, intro));assertfalse(arrays.equals(new string[] { once, upon, a, null }, intro));当我们有嵌套或多维数组时,我们可以使用deepequals不仅检查顶层元素,还可以递归地执行检查。
object[] story = new object[] { intro, new string[] { chapter one, chapter two }, end };object[] copy = new object[] { intro, new string[] { chapter one, chapter two }, end };asserttrue(arrays.deepequals(story, copy));assertfalse(arrays.equals(story, copy));注意,这里 deepequals 是通过的,但equals却失败了。这是因为deepequals在每次遇到数组时都会调用自己,而equals只是比较子数组的引用。
hashcode 和 deephashcode我们使用hashcode来计算一个基于数组内容的整数
object[] looping = new object[]{ intro, intro }; int hashbefore = arrays.hashcode(looping);int deephashbefore = arrays.deephashcode(looping);现在,我们将原数组的一个元素设置为空,并重新计算哈希值。
intro[3] = null;int hashafter = arrays.hashcode(looping);deephashcode检查嵌套数组的元素数量和内容是否匹配。 如果我们用deephashcode重新计算。
int deephashafter = arrays.deephashcode(looping);现在,我们能够看到这两个方法的不同。
assertequals(hashafter, hashbefore);assertnotequals(deephashafter, deephashbefore);deephashcode是我们在数组上使用hashmap和hashset等数据结构时使用的基础计算。
排序和搜索排序如果我们的元素是原始类型,或者它们实现了 comparable 接口,我们可以使用sort来执行排序。
string[] sorted = arrays.copyof(intro, 4);arrays.sort(sorted);assertarrayequals(new string[]{ a, once, time, upon }, sorted);请注意,排序会使原始引用发生变化,这就是为什么我们在这里进行复制。
排序将对不同的数组元素类型使用不同的算法。原始类型使用quicksort,对象类型使用timsort。对于一个随机排序的数组,两者的平均情况都是o(n log(n))。
从java 8开始,parallelsort可用于并行排序, 它提供了一种使用几个arrays.sort任务的并发排序方法。
搜索如果我们有一个排序的数组,那么我们可以在 o(log n) 中完成,我们可以用 binarysearch 来完成这样的任务。
int exact = arrays.binarysearch(sorted, time);int caseinsensitive = arrays.binarysearch(sorted, time, string::comparetoignorecase);assertequals(time, sorted[exact]);assertequals(2, exact);assertequals(exact, caseinsensitive);如果我们没有提供一个比较器作为第三个参数,那么 binarysearch 就默认我们的元素类型是可比较的。如果我们的数组没有被首先排序,那么 binarysearch 将不会像我们所期望的那样工作。
流我们都知道arrays在java 8中进行了更新,包含了stream api的方法,如parallelsort、stream和setall等。
stream 使我们能够完全访问我们的数组的stream api。
assert.assertequals(arrays.stream(intro).count(), 4);exception.expect(arrayindexoutofboundsexception.class);arrays.stream(intro, 2, 1).count();我们可以为流提供包容性和排他性指数,但是如果指数失序、为负数或超出范围,我们应该判断 arrayindexoutofboundsexception。
转化tostring、aslist和setall给了我们几种不同的方法来转换数组。
tostring和deeptostring我们可以通过tostring获得原始数组的可读版本的一个好方法。
assertequals([once, upon, a, time], arrays.tostring(storyintro));当数组有嵌套的时候,我们必须再次使用deeptostring 来打印嵌套数组的内容。
assertequals( [[once, upon, a, time], [chapter one, chapter two], [the, end]], arrays.deeptostring(story));aslist在所有的数组方法中,最方便我们使用的是aslist。我们有一个简单的方法把数组变成一个列表。
list rets = arrays.aslist(storyintro);asserttrue(rets.contains(upon));asserttrue(rets.contains(time));assertequals(rets.size(), 4);返回的列表将是一个固定的长度,而且无法添加或删除元素,还要注意的是,aslist会返回这个arraylist的类型,和我们平常在使用的arraylist 并不一样。在调试的时候,就可能是非常具有欺骗性的,我们在写的过程中特别要注意。
setall通过setall,我们可以用一个 functional interface 来设置一个数组的所有元素。下面的代码现将位置索引作为一个参数传入到getword方法中。
string[] longago = new string[4];arrays.setall(longago, i - > this.getword(i)); assertarrayequals(longago, new string[]{a,long,time,ago});当然,异常处理是使用lambda的一个比较棘手的部分。所以请记住,如果lambda抛出一个异常,那么java就不会定义数组的最终状态。

无线数传电台模块E3A-DTU-500介绍
富士通NEC表示2014年将推出Tizen OS设备
oppor11什么时候上市?oppor11最新消息:oppor11发布盛典再曝亮点,满满的都是惊喜,你不期待?
催化燃烧式传感器的工作原理
军哥哥,这是真的么?红米手机还有一个小弟?
Arrays的copyOf,copyOfRange和fill方法
IBM惠普将推双内核芯片服务器
开关电源超强总结
一种面向医疗应用的全印刷柔性超声换能器
适用于Linux的基于Rust的同步客户端介绍
莫大康:中国半导体业通向强国之梦定能实现
浅谈防水连接器的插针插孔和镀层
新唐科技M261KIAAE主板简介
英特尔推出面向移动设备和台式机的锐炫Pro图形显卡
浅析RFID技术的三个重要阶段
计算机网络的几条规则
变频器在伟创旋切机控制系统的应用
DS1345W 3.3V、1024k NV SRAM
4G网络环境的局限性,基于5G的边缘云VR技术可以一定程度解决这个问题
全球大尺寸面板3月出货量大幅回升,环比增幅近30%