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

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

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

可以这么肯定的说,能不使用数组就别使用数组,除非要用数组来改善性能问题。

那为什么还要学习数组呢?因为Java的设计者没有对数组痛下杀手,就像曹操当年并没有扔掉那碗食之无味弃之可惜的鸡肋。

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泛型的重要目的:别让猫别站在狗队里
Java如何在运行时识别类型信息?

转载于:https://www.cnblogs.com/qing-gee/p/10367595.html

Java中食之无味弃之可惜的数组相关推荐

  1. Java中forEach, 用来遍历数组

    这里的for是Java中forEach, 用来遍历数组的.for(int i : d) 就是遍历int型数组d的 每一次访问数组d的时候读取的数据放入int型的i中.和for(int i=0;i< ...

  2. Java中如何打印出一个数组中所有元素呢?

    转自: Java中如何获取出一个数组中最大元素值呢? 数组简介: 数组(Array)是有序的元素序列.若将有限个类型相同的变量的集合命名,那么这个名称为数组名.组成数组的各个变量称为数组的分量,也称为 ...

  3. 在Java中如何高效的判断数组中是否包含某个元素

    如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Overflow中也是一个非常热门的问题.在投票比较高的几个答案中给出了几种 ...

  4. Java中如何将以byte数组给出的数据转换为double数组形式

    1 致谢 感谢陈玮学长的代码  由于学习了他的代码 我才最终得出了正确的结论 2 问题描述 今天编程的时候遇到1个问题 需要从一个二进制文件中读取double[]的数据 我们使用的编程语言是Java语 ...

  5. java初始化字符串数组_在java中如何定义一个字符串数组

    展开全部 1. java中定义一个字符串数组方式如32313133353236313431303231363533e59b9ee7ad9431333366306465下,string类型和其他基本类型 ...

  6. java中控制台输入二维数组(Scanner类总结)

    由于牛客和LeetCode上的题目不用自己写输入,但实际笔试中都需要从输入开始写,遇到需要从控制台输入二维数组的情况,故对java中的Scanner类作整理和总结. 通过 Scanner 类能获取用户 ...

  7. Java中json格式的字符串数组,list,json,map相互转换

    日常开发中免不了和json格式的字符串数组,list,json,map打交道,因此这篇文章的着重点就是这四者的相互转换 1.json格式的字符串数组转list String json = " ...

  8. Java中List、Set和数组之间转换方法总结

    List转数组: 方法一:(笨办法硬换) //array为待转换int[] int[] res = new int[list.size()]; int i = 0; for(int num : lis ...

  9. 在Java中以空格分隔输入数组

    在OJ中经常遇到在以空格分隔输入数组的情况,在c和c++下还挺好整,在java里头不太好搞了,而且在java这种语法特别冗长的语言中做这种跟主要思想无关的体力活特别烦人( ´_ゝ`) 虽然在pytho ...

最新文章

  1. 人大经济论坛:统计学的一些经典教材
  2. Leetcode 188.买卖股票的最佳时机IV
  3. (需求实战_01)_shell脚本 ftp协议下载文件
  4. 对datatable类型列名排序_表格数据的排序功能(支持多列)
  5. 使用cdn和npm引入的区别_中央空调和新风系统有什么区别?有必要一起装吗?
  6. yum info 查不到nginx下载info的问题
  7. python项目方案书模板格式_项目策划书格式范文
  8. 用R软件绘制中国分省市地图
  9. Android 打造RxBus2.x的全面详解
  10. 3.c++计算字符串长度的函数
  11. 刷脸支付到来用户连密码都不需要
  12. 自如_智能家居硬件测试
  13. (3)聚类算法之DBSCAN算法
  14. SM30表维护自动更新值
  15. CUMTOJ算法实验四
  16. 最全中文3DMAX四边形散布插件QuadScatter使用教程
  17. C语言实现“21点”游戏的输入
  18. 近代物理实验 数字图像文件操作及代数运算 含思考题及其答案 和图像运行结果
  19. 第一篇,开个好头,匠奥壁挂炉M,哈哈
  20. 云原生数据仓库AnalyticDB MySQL版用户手册

热门文章

  1. Unity游戏开发文档(3.1.2):下拉式音乐选择菜单
  2. vux 选择器_vue项目中安装和使用vux组件
  3. matlab车头时距,怎么知道自己的车头距离前面的车的距离
  4. 统计每个数字出现的次数。
  5. 图论学习--4 欧拉图与哈密尔顿图(思维导图)
  6. 正交分解与完全正交分解的数学解释
  7. python神经网络:女生颜值打分器(一)
  8. 剑指Offer--022-栈的压入、弹出序列
  9. HDMI-CEC 控制服务
  10. 知识普及:关于Fuzzing模糊测试入门原理及实践的讨论