在 Java 泛型出现之前,只有数组可以用来存储指定类型的对象;在自动装箱机制出现之前,只有数组可以用来存储基本数据类型;也就是说,在泛型和自动装箱机制出现之前,数组在 Java 当中的分量举足轻重。

况且数组还是一种效率最高的存储和随机访问对象序列的方式,但遗憾的是,数组的长度是固定的——举个例子,创建它的时候指定长度是 6,就只能存储 6 个元素,当你想放第 7 个元素时,是无法做到的。

随着计算机硬件能力的提升,开发人员在存储一组数据的时候更愿意使用 ArrayList 而不是数组。尽管 ArrayList 内部是通过数组实现的,但与数组相比,它的容量能够自动增长,还有很多数组没有的特性。能不使用数组就别使用数组,除非要用数组来改善性能问题。

01、创建数组

让我们来给Java数组下一个明确的定义——数组用来存储固定长度同类型元素。

示例如下:

int[] ints = new int[3];
ints[0] = 1;
ints[1] = 2;
ints[2] = 3;int ints1[] = new int[3];int[] ints2 = { 1, 2, 3 };

int[] ints相较于int ints1[]是优选的声明方式, int ints1[]风格来自于 C/C++ 语言 ,便于 C/C++ 程序员能够快速地理解Java语言。

数组的创建方式有两种,一种是通过new关键字,同时指定长度,然后通过array[index] = value的方式赋值;另外一种方式是通过{value1, value2, ...}的方式直接创建并同时赋值。

最常见的应用如下(日期的占位符字符串):

private static String[] parsePatterns = { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd","yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM" };

02、小心length

在使用List和Map的时候,可以直接通过size()方法获取容器的实际大小(长度)。数组也有一个关键字length来获取大小(长度),但意思大不相同。length只表示数组所能够容纳元素的大小,而并非数组的实际大小。

举例如下:

int[] ints = new int[3];
ints[0] = 1;
ints[1] = 2;System.out.println(ints.length); // 输出3

尽管ints的实际长度为2,但ints.length的长度却为3——要小心了。

03、Arrays工具类

Java的设计者可谓良苦用心,特意为数组设计了一个专属工具类——java.util.Arrays,里面有几个常用的方法我们来介绍一下。

1)sort()

sort()方法用来对数组进行排序,该方法要求数组的元素要实现Comparable接口。如果排序的元素不是String或者基本数据类型,就需要主动实现Comparable接口(基本数据类型和String本身已经实现了Comparable接口)。

示例如下:

String[] strs = {"沉", "默","王", "二"};Arrays.sort(strs);
System.out.println(Arrays.toString(strs));
// 输出[二, 沉, 王, 默]

sort()方法排序后的结果就是[二, 沉, 王, 默]。

2)binarySearch()

binarySearch()方法用来对数组进行二分查找(返回值所在的下标,未找到的话返回-1),调用该方法之前必须要先排序。

示例如下:

String[] strs = {"沉", "默","王", "二"};Arrays.sort(strs);
System.out.println(Arrays.binarySearch(strs, "二"));
// 排序后的结果为[二, 沉, 王, 默]
// 二分查找的结果范围0

由于sort()方法排序后的结果为[二, 沉, 王, 默],所以Arrays.binarySearch(strs, "二")返回下标值0。

3)asList()

asList()方法用来将数组转化成List(ArrayList),源码如下:

public static <T> List<T> asList(T... a) {return new ArrayList<>(a);
}

那如何将List转化成数组呢?通过List的toArray()方法。可参照下例体验由数组定义方式不同带来的细微差别。

String[] strs = {"沉", "默","王", "二"};List<String> list = Arrays.asList(strs);
System.out.println(list);
// 输出[沉, 默, 王, 二]String[] strs1 = new String[list.size()];
System.out.println(Arrays.toString(list.toArray(strs1)));
// 输出 [沉, 默, 王, 二]String[] strs2 = new String[5];
System.out.println(Arrays.toString(list.toArray(strs2)));
// 输出 [沉, 默, 王, 二, null]String[] strs3 = new String[1];
System.out.println(Arrays.toString(list.toArray(strs3)));
// 输出 [沉, 默, 王, 二]String[] strs4 = {};
System.out.println(Arrays.toString(list.toArray(strs4)));
// 输出 [沉, 默, 王, 二]

当声明的数组大小超出List的大小后,toArray()方法会对转换后的数组进行补位(null)。

4)toString()

toString()方法用来将数组进行字符串格式的输出([value1, value2, value3, ...]的格式),源码如下:

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(", ");}
}

上一篇:Java String,看这篇就够了

下一篇:Java 集合类入门篇

微信搜索「沉默王二」公众号,关注后回复「免费视频」获取 500G 高质量教学视频(已分门别类)。

Java 数组,看这一篇就够了相关推荐

  1. override java field_JavaPoet 看这一篇就够了

    Post Views: 13 JavaPoet 是用来生成 Java 代码的一个 Java Library. 学习 JavaPoet, 唯一也是最快的方法是自己动手生成一个 Java Code 文件. ...

  2. Java基础看这一篇就够了

    一.基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平台,jvm不是跨平台的. J ...

  3. java面试看这一篇就够了

    由于最近比较忙,项目赶的比较紧所以一直没有更新整理面试题,这次抽了些时间把答应大家的面试题整理出来了感谢各位小伙伴们的支持,你们的支持是我分享的动力,希望在以后的日子里咱们共同学习进步.如果感觉不错就 ...

  4. java注解看这一篇就够了

    java注解-最通俗易懂的讲解 转载 Tanyboye 最后发布于2018-06-05 10:24:36 阅读数 27063 收藏 发布于2018-06-05 10:24:36 分类专栏: java ...

  5. serviceloader java_【java编程】ServiceLoader使用看这一篇就够了

    转载:https://www.jianshu.com/p/7601ba434ff4 想必大家多多少少听过spi,具体的解释我就不多说了.但是它具体是怎么实现的呢?它的原理是什么呢?下面我就围绕这两个问 ...

  6. 聊聊Java8之后的JDK升级内容(看这一篇就够了)

    聊聊Java8之后的JDK升级内容(看这一篇就够了) 背景 从 JDK 8 到 JDK 17 的新特性 JDK8 回顾 JDK9 JDK10 JDK11 JDK12 JDK13 JDK14 JDK15 ...

  7. 面试被问到 ConcurrentHashMap答不出 ,看这一篇就够了!

    本文汇总了常考的 ConcurrentHashMap 面试题,面试 ConcurrentHashMap,看这一篇就够了!为帮助大家高效复习,专门用"★ "表示面试中出现的频率,&q ...

  8. api网关选型_如何轻松打造百亿流量API网关?看这一篇就够了(下)

    如何轻松打造百亿流量API网关?看这一篇就够了(上) 上篇整体描述了网关的背景,涉及职能.分类.定位环节,本篇进入本文的重点,将会具体谈下百亿级流量API网关的演进过程. 准备好瓜子花生小板凳开始积累 ...

  9. docker 删除所有镜像_关于 Docker 镜像的操作,看完这篇就够啦 !(下)| 文末福利...

    紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...

  10. mysql ip比较大小_MySQL优化/面试,看这一篇就够了

    原文链接:http://www.zhenganwen.top/articles/2018/12/25/1565048860202.html 作者:Anwen~ 链接:https://www.nowco ...

最新文章

  1. 堆积木(基本数据结构-ArrayList数组的使用)
  2. python画人脸关键点
  3. Solaris的md5sum和sha1sum命令
  4. 图解用Scientific Toolworks Understand分析Microsoft DirectX SDK (June 2010)自带D3D示例
  5. Nexus学习笔记 -- 安装到运行
  6. CentOS下安装MySQL报安装文件conflicts错误:
  7. logback 常用配置详解appender
  8. 动图图解 | Go 的 timer 是如何被Runtime调度的?
  9. SVN服务的部署及使用
  10. java 程序找错_JAVA程序找错~
  11. 个人项目3:一个能生成小学二年级四则运算题目的“软件”版本3
  12. 线程打印_Java编程核心技术之——线程操作
  13. 上海自考计算机及应用,上海交通大学--计算机及应用(独立本科080901)
  14. Axure share APP使用教程——如何在手机上演示axure文件
  15. PWM占空比控制电机转速
  16. R中设置图形参数--函数par()详解
  17. winword.exe应用程序错误0xc0000142
  18. RTC实时通信提高音质方法QOS(一)
  19. “新基建”背景下,智慧灯杆产业面临的问题及思考
  20. 零基础HTML教程(4)--动手创建第一个网页吧

热门文章

  1. 在同一个二维坐标系绘制出一元二次曲线, sin正弦、cos余弦曲线 (numpy,matplotlib.pyplot )
  2. 干货!程序员需掌握的100个英语词汇
  3. Android 基于高德地图的锁屏后定位和轨迹自动纠偏(离线版)
  4. TeamViewer试用到期修改MAC地址(解决找不到“网络地址”选项的问题)
  5. 计算机绘图c2是什么,Cad里c2表示(cad中C1(C2)这样的符号是什么意思)
  6. APP进行微信分享,提示签名不一致解决方案
  7. Tech Lead 实践
  8. 使用oschina的git服务器
  9. php天花板好吗,最近听了听平头塞天花板瑞弦D3,说说感受(对比钛铃)
  10. 面向对象程序设计c++版董正言张聪课本课后习题答案第三章