范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

想要数组用的六,怎能不懂java。util。Arrays

  java.util.Arrays 类就是为数组而生的专用工具类,基本上常见的对数组的操作,Arrays 类都考虑到了,这让我由衷地觉得,是时候给该类的作者 Josh Bloch、Neal Gafter、John Rose 点个赞了。
  (我是怎么知道作者名的?看源码就可以,小伙伴们,装逼吧)
  Arrays 都可以干嘛呢?常见的有:创建数组比较数组数组排序数组检索数组转流打印数组数组转 ListsetAll(没想好中文名)parallelPrefix(没想好中文名)
  那接下来,小伙伴们是不是已经迫不及待想要和二哥一起来打怪进阶了。走你。01、创建数组
  使用 Arrays 类创建数组可以通过以下三个方法:copyOf,复制指定的数组,截取或用 null 填充copyOfRange,复制指定范围内的数组到一个新的数组fill,对数组进行填充
  1)copyOf,直接来看例子:String[] intro = new String[] { "沉", "默", "王", "二" }; String[] revised = Arrays.copyOf(intro, 3); String[] expanded = Arrays.copyOf(intro, 5); System.out.println(Arrays.toString(revised)); System.out.println(Arrays.toString(expanded));
  revised 和 expanded 是复制后的新数组,长度分别是 3 和 5,指定的数组长度是 4。来看一下输出结果:[沉, 默, 王] [沉, 默, 王, 二, null]
  看到没?revised 截取了最后一位,因为长度是 3 嘛;expanded 用 null 填充了一位,因为长度是 5。
  2)copyOfRange,直接来看例子:String[] intro = new String[] { "沉", "默", "王", "二" }; String[] abridgement = Arrays.copyOfRange(intro, 0, 3); System.out.println(Arrays.toString(abridgement));
  copyOfRange() 方法需要三个参数,第一个是指定的数组,第二个是起始位置(包含),第三个是截止位置(不包含)。来看一下输出结果:[沉, 默, 王]
  0 的位置是"沉",3 的位置是"二",也就是说截取了从 0 位(包含)到 3 位(不包含)的数组元素。那假如说下标超出了数组的长度,会发生什么呢?String[] abridgementExpanded = Arrays.copyOfRange(intro, 0, 6); System.out.println(Arrays.toString(abridgementExpanded));
  结束位置此时为 6,超出了指定数组的长度 4,来看一下输出结果:[沉, 默, 王, 二, null, null]
  仍然使用了 null 进行填充。为什么要这么做呢?小伙伴们思考一下,我想是作者考虑到了数组越界的问题,不然每次调用 Arrays 类就要先判断很多次长度,很麻烦。
  3)fill,直接来看例子:String[] stutter = new String[4]; Arrays.fill(stutter, "沉默王二"); System.out.println(Arrays.toString(stutter));
  使用 new 关键字创建了一个长度为 4 的数组,然后使用 fill() 方法将 4 个位置填充为"沉默王二",来看一下输出结果:[沉默王二, 沉默王二, 沉默王二, 沉默王二]
  如果想要一个元素完全相同的数组时, fill() 方法就派上用场了。02、比较数组
  Arrays 类的 equals() 方法用来判断两个数组是否相等,来看下面这个例子:String[] intro = new String[] { "沉", "默", "王", "二" }; boolean result = Arrays.equals(new String[] { "沉", "默", "王", "二" }, intro); System.out.println(result); boolean result1 = Arrays.equals(new String[] { "沉", "默", "王", "三" }, intro); System.out.println(result1);
  输出结果如下所示:true false
  指定的数组为沉默王二四个字,比较的数组一个是沉默王二,一个是沉默王三,所以 result 为 true,result1 为 false。
  简单看一下 equals() 方法的源码:public static boolean equals(Object[] a, Object[] a2) {     if (a==a2)         return true;     if (a==null || a2==null)         return false;      int length = a.length;     if (a2.length != length)         return false;      for (int i=0; i fence(1)     at java.base/java.util.Spliterators.checkFromToBounds(Spliterators.java:387) 06、打印数组
  关于数组的打印方式,我之前单独写过一篇文章:
  打印Java数组最优雅的方式是什么?
  里面谈了很多种数组打印的方式,因为数组是一个对象,直接 System.out.println 的话,结果是这样的:[Ljava.lang.String;@3d075dc0
  那最优雅的方式,其实文章里面已经出现过很多次了,就是 Arrays.toString():public static String toString(Object[] a) {     if (a == null)         return "null";      int iMax = a.length - 1;     if (iMax == -1)         return "[]";      StringBuilder b = new StringBuilder();     b.append("[");     for (int i = 0; ; i++) {         b.append(String.valueOf(a[i]));         if (i == iMax)             return b.append("]").toString();         b.append(", ");     } }
  小伙伴可以好好欣赏一下这段源码,感觉考虑得非常周到。07、数组转 List
  尽管数组非常强大,但它自身可以操作的工具方法很少,比如说判断数组中是否包含某个值。转成 List 的话,就简便多了。String[] intro = new String[] { "沉", "默", "王", "二" }; List rets = Arrays.asList(intro); System.out.println(rets.contains("二"));
  不过需要注意的是,Arrays.asList() 返回的是 java.util.Arrays.ArrayList,并不是 java.util.ArrayList,它的长度是固定的,无法进行元素的删除或者添加。rets.add("三"); rets.remove("二");
  执行这两个方法的时候,会抛出异常:Exception in thread "main" java.lang.UnsupportedOperationException     at java.base/java.util.AbstractList.add(AbstractList.java:153)     at java.base/java.util.AbstractList.add(AbstractList.java:111)
  要想操作元素的话,需要多一步转化:List rets1 = new ArrayList<>(Arrays.asList(intro)); rets1.add("三"); rets1.remove("二"); 08、setAll
  Java 8 新增了 setAll() 方法,它提供了一个函数式编程的入口,可以对数组的元素进行填充:int[] array = new int[10]; Arrays.setAll(array, i -> i * 10); System.out.println(Arrays.toString(array));
  这段代码什么意思呢?i 就相当于是数组的下标,值从 0 开始,到 9 结束,那么 i * 10 就意味着 0 * 10 开始,到 9 * 10 结束,来看一下输出结果:[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
  比之前的 fill() 方法强大多了,对吧?不再填充的是相同的元素。09、parallelPrefix
  parallelPrefix() 方法和 setAll() 方法一样,也是 Java 8 之后提供的,提供了一个函数式编程的入口,通过遍历数组中的元素,将当前下标位置上的元素与它之前下标的元素进行操作,然后将操作后的结果覆盖当前下标位置上的元素。int[] arr = new int[] { 1, 2, 3, 4}; Arrays.parallelPrefix(arr, (left, right) -> left + right); System.out.println(Arrays.toString(arr));
  上面代码中有一个 Lambda 表达式((left, right) -> left + right),需要入门的小伙伴可以查看我之前写的一篇文章:
  Lambda 表达式入门,看这篇就够了
  那为了让小伙伴看得更明白一些,我们把上面这段代码稍微改造一下:int[] arr = new int[]{1, 2, 3, 4}; Arrays.parallelPrefix(arr, (left, right) -> {     System.out.println(left + "," + right);     return left + right; }); System.out.println(Arrays.toString(arr));
  先来看一下输出结果:1,2 3,3 6,4 [1, 3, 6, 10]
  也就是说, Lambda 表达式执行了三次:第一次是 1 和 2 相加,结果是 3,替换下标为 1 的位置第二次是 3 和 3 相加,结果是 6,也就是第一次的结果和下标为 2 的元素相加的结果第三次是 6 和 4 相加,结果是 10,也就是第二次的结果和下标为 3 的元素相加的结果
  有点强大,对吧?

英媒关注中国正在酝酿的寻找地球2。0计划,究竟是什么?前不久,英国自然杂志网站刊登了一篇文章,标题是中国正在酝酿一项寻找地球2。0的计划。所谓的地球2。0,就是要在类太阳恒星的宜居带内找到与地球环境相似的行星。在天文学家看来,这样的行用进废退进化法则生物钟的物理学和生物学本质作者太空生物学太阳围绕着银河系中心黑洞人马座A星以每秒240公里的速度公转一圈是2。5亿年。地球围绕着太阳以每秒30公里的速度公转一圈是365天,而地球自转一圈是24小时。地月系中Meta(Facebook)和微软纷纷杀入元宇宙,开发氢能源氢能新闻Facebook的母公司Meta计划发布数据集,以帮助开发更便宜的氢燃料。该数据集是与卡耐基梅隆大学(CarnegieMellonUniversity)合作开发的,可以为人工智能(你的诞生几率在这个世界看来都是非常低的,为什么?听科学家答案我是谁?我在哪?我为什么会有生命?生命的真谛是什么?在地球悠久历史的长河中,生命一直是科学以及神学思索的主题。根据美国科学家分析了当前所有研究数据,他认为,地球克服许多困难,才使得太阳系真正的模样我们大多数人对太阳系运行以为是这样子的或许又认为是这样平面的或许地理老师上课时,我们脑海里最合理的认为是这样子的其实这才是它真正运行的模样,好怕把地球给甩出去它是这样子的方式带着木里德堡原子携手神经网络实现多频率微波精密探测4月17日,科技日报记者从中国科学技术大学获悉,该校郭光灿院士团队史保森丁冬生课题组利用人工智能实现了基于里德堡原子多频率微波的精密探测,相关成果日前发表在国际期刊自然通讯上。里德天文学家在遥远的恒星表面发现新型热核爆炸微新星天文学家在遥远的恒星表面发现了一种新型的热核爆炸。它被称为微新星(Micronova),它比经典的新星或耀眼的超新星要小,但仍然强大到足以在几个小时内烧毁整个山脉。杜伦大学银河系外新型恒星发生大爆炸!几小时内可摧毁35亿个大金字塔近日,天文学家发现了一种新的恒星爆炸,这种爆炸的威力足以摧毁约35亿个吉萨大金字塔(GreatPyramidsofGiza)。这种是所谓的微新星爆炸,爆炸过程虽然只持续几个小时,但火星上的毅力号探测器到达新探索区域,将挑战40米高的山坡在4月19日NASA公布了火星上的毅力号探测器的最新情况,目前毅力号已经到达了新的探索区域,是位于杰泽罗陨石坑中的一处古代河床三角洲,毅力号需要寻找合适的路线爬上面前的这座小山坡,遇见微新星!天文学家发现新型恒星爆炸科技日报记者李山近日,一个国际天文学家团队使用欧洲南方天文台(ESO)的甚大望远镜首次观测并确认一种新型的恒星爆炸,其强度约为新星爆发的百万分之一,暂命名为微新星。这一全新机制丰富NASA韦伯太空望远镜完成关键里程碑测试状态良好NASA詹姆斯韦伯太空望远镜已经成功通过了另一系列关键测试,这是走向发射台的里程碑。在近期声学和正弦振动测试中,技术人员和工程师们将韦伯的航天器元器件置于严酷的动态机械环境条件下,
高阶凡尔赛指南,你不看,翻车快男朋友送的红色法拉利太土了,直男就这审美吗?最近,凡尔赛文学因其似贬实褒,暗自炫富而被广大网友调侃。与以往的流行词不同,凡尔赛文学具有强烈的文学气质,起源于日本漫画家池田理代子的漫马云,演员生涯无止境文特约主笔陆星集马云今天退休了,但他的演员生涯,刚刚进入人生第三个阶段。昨天晚上,很多媒体人知识工作者互联网里大大小小的V们,都在微信上疯狂的互相问一个问题马云究竟为什么要退休啊?心术不正的人,身上有3个特征,趁早和他绝交!活到老学到老,在做人这个方面,永远有学不完的东西,人生就像是一本忏悔录,要不断的记录自己,纠正自己,最后成就自己,这虽然是一个很漫长的路程,却值得每一个人去践行。在这个世界上,有很演谁都像自己的4位演员,几乎没有演技,第一名就是众望所归娱乐圈内有不少的花瓶,虽然他们的颜值很高,但是他们的演技却很烂,所以今天我们就来盘点一下,娱乐圈内公认演技最差的几位演员,他们几位无论演谁都像自己,有人说第一名简直就是众望所归。第周宏达技术转让!美国与土耳其就燃气轮机领域开展合作获取更多信息,请关注我们美国柴油机与燃气轮机网2021年8月19日报道通用电气海事公司与土耳其图萨斯发动机公司签署谅解备忘录,计划授权后者在土耳其境内制造组装维修LM2500和LM张大中强化反舰能力!美军联合部队在珍珠港附近进行了反舰打击演习获取更多信息,请关注我们美国海上力量网2021年8月18日报道8月15日,美国联合部队在夏威夷珍珠港开展了反舰打击演习,对退役的导弹护卫舰英格拉姆号进行了跨域多角度远程协同打击并成苏翔提高协同作战能力!英航母打击群与美远征打击群联合开展空中作战行动获取更多信息,请关注我们比利时海军认知网2021年8月22日报道根据美国防部8月20日发布的消息,英国航母打击群(CSG21)和搭载海军陆战队第31远征部队的美国号远征打击群(AM张大中英国舰载机在美国两栖攻击舰上完成起降训练获取更多信息,请关注我们英国防务期刊网2021年8月21日报道2021年8月20日,英国伊丽莎白女王号航母的F35B舰载机成功降落在美国美国号两栖攻击舰上,完成挂弹和加油后起飞,继张大中美众议院军事委员会提议采购12架战机并研发新型核巡航导弹获取更多信息,请关注我们美国海军学院网2021年8月25日报道8月25日美国众议院军事委员会主席马克表示,委员会计划花费9。7亿美元采购12架超级大黄蜂战斗机,保留1000万美元的苏翔里程碑!美海军第四艘福特级航母正式开工建造获取更多信息,请关注我们美国海上力量网2021年8月25日报道8月25日,亨廷顿英格尔斯工业公司举行第四艘福特级航母多里斯米勒号航母(CVN81)的首块钢板切割仪式,标志着该航母达周宏达马晓晨美海军研究实验室展示海水制油和锌基电池技术获取更多信息,请关注我们8月2日,2021年海空天博览会在美国马里兰州开幕,此次博览会为期3天,共有来自57个国家的337家企业和科研机构参展,包括亨廷顿英格尔斯工业公司通用动力公