Java 数组,看这一篇就够了

在 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 高质量教学视频(已分门别类)。

原文地址:https://blog.51cto.com/2324584/2448854

时间: 2024-11-05 22:46:58

Java 数组,看这一篇就够了的相关文章

Java NIO看这一篇就够了

原文链接:https://mp.weixin.qq.com/s/c9tkrokcDQR375kiwCeV9w? 现在使用NIO的场景越来越多,很多网上的技术框架或多或少的使用NIO技术,譬如Tomcat,Jetty.学习和掌握NIO技术已经不是一个JAVA攻城狮的加分技能,而是一个必备技能.在前篇文章<NIO基础>中我们学习了NIO的相关理论知识,而在本篇中我们一起来学习一下Java NIO的实战知识. 一.概述 NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Se

Java注解 看这一篇就够了

注解 1.概念 注解:说明程序的.给计算机看的 注释:用文字描述程序的.给程序员看的 注解的定义:注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来对这些元素进行说明,注释. 2.作用 ①编写文档:通过代码里标识的注解生成文档[生成文档doc文档]: ? shift+右键 -> 在此处打开Powershell窗口 -> 输入:javadoc .\

Java中的多线程你只要看这一篇就够了

Java中的多线程你只要看这一篇就够了 引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其实只有一半对,因为反应"多角色"的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的"生产者,消费者模型". 很多人都对其中的一些概念不够明确,如同步.并发等等,让我

Java中的多线程=你只要看这一篇就够了

如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”. 很多人都对其中的一些概念不够明确,如同步.并发等等,让我们先建立一个数据字典,以免产生误会. 多线程:指的是这个程序(一个进程)运

iOS动画详解(学习动画看这一篇就够了)

iOS动画详解(学习动画看这一篇就够了) 一.基础知识 CAAnimation.png 二.CABasicAnimation 1. 动画的属性和解释 2.属性值的解释 repeatCount : 如果在swift中需要一直不断重复:Float.infinity,OC:HUGE_VALF timingFunction: timingFunction.png kCAMediaTimingFunctionLinear--在整个动画时间内动画都是以一个相同的速度来改变.也就是匀速运动.一个线性的计时函数

关于 Docker 镜像的操作,看完这篇就够啦 !(下)

原文:关于 Docker 镜像的操作,看完这篇就够啦 !(下) 紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌握的.本文将带您一步一步,图文并重,上手操作来学习它. 目录: 一.Docker 删除镜像 1.1 通过标签删除镜像 1.2 通过 ID 删除镜像 1.3 删除镜像的限制 1.4 清理镜像 二.Docker 创建镜像 2.1 基于已有的镜像创建

用markdown写博客,看这一篇就够了,附markdown文件分享

0. 前言 为什么用markdown写博客? 在写博客的过程中,最大的"痛点"在于写作中总是被"格式"之类的困扰,无法专注于内容写作: 在线写博客,会被网络或者编辑器本身所拖累: 本文介绍的markdown写作,可以使你专注于博客内容本身,写好即成稿: 更重要的是,博客内容及相关素材保存在本地,可以几乎不用修改就可以发布在不同的平台,类似java程序的"一次编写,到处运行". 记得上次用markdown写博客,尽管我有markdown使用经验,但

[转]关于深度学习,看这一篇就够了

关于深度学习,看这一篇就够了 原文地址:http://www.dlworld.cn/XueXiSuanFa/13.html [日期:2016-04-26] 来源:36氪  作者: [字体:大 中 小] 编者按:本文作者王川,投资人,中科大少年班校友,现居加州硅谷,个人微信号9935070,36 氪经授权转载自其个人微信公众号 investguru. 一 2016 年一月底,人工智能的研究领域,发生了两件大事. 先是一月二十四号,MIT 的教授,人工智能研究的先驱者,Marvin Minsky 去

中后台产品的表格设计,看这一篇就够了(原型规范下载)

中后台产品的表格设计,看这一篇就够了(原型规范下载) 2018年4月16日luodonggan 中后台产品的表格设计,看这一篇就够了(原型规范下载) 经过了将近一年的后台产品经历,踩了很多坑,试了很多错,也学习到了很多东西,目前也形成了自己的一套规范.本文将其中的部分收获汇总成文,希望能够对大家有所帮助. 后台产品有一个很重要.常见的元素,就是表格.表格承担着详情入口.数据展示的功能,看似简单,其实里面的细节特别多.在以效率为最重要的需求的后台产品中,如何设计一个能够高效率地进行查看和编辑的表格

源码时代前端干货分享| AE如何实现文字消散效果?看这一篇就够了!

源码时代前端干货分享| AE如何实现文字消散效果?看这一篇就够了!首先:1.新建合成IMAge012.新建一个纯色层做背景(如果自带背景可以忽略)02 3.新建文本图层034.打上文字,调整文字大小,让文字在画布中居中04 然后:5.给文字添加一个蒙版05 6.在0秒的位置的蒙版路径打上关键帧067.0秒的时候蒙版路径最大,3秒的时候蒙版路径最小078.继续添加蒙版羽化089.再新建一个合成为置换0910.新建一个纯色的白图层1011.给它添加一个蒙版1112.在蒙版路径上打上关键帧13.0秒的