数组是一种数据结构,用于存储同一类型值的集合,也可以看做是数据类型一致的一组数据。

一、语法和声明数组

1、语法:数据类型[ ] array = new 数据类型[长度];

注意:

使用长度创建数组的时候,每个元素都有默认值。

对于int、byt、short、long,其默认值为0;

对于double、float,其默认值为0.0;

对于boolean值,其默认值为false;

对于char,其默认值为编码是0的字符;

对于引用类型(其中包括String),其默认值为null。

2、如果事先已经知道数组的元素,可以直接使用元素初始化数组,但是不需要写数组长度,元素的个数就是数组长度。其次,例如int[ ] a 和int a[ ]两种声明都可用,但是不建议使用后面的写法。

3、如果数据元素不多,并且知道每个元素的值,可以直接使用元素进行初始化。如果元素过多,使用长度创建数组。如果元素没有初始值,使用长度初始化。

   /**
* 数组的声明
*/
public static void testMethod() {
// 第一种写法
int[] array = new int[3];
// int类型的默认值是0
System.out.println(array[0]); //
String[] strArray = new String[3];
// 于引用类型(其中包括String),其默认值为null
System.out.println(strArray[0]); // null
// 数组声明的第二种写法
int[] array2 = {1,2,3};
System.out.println(array2[0]); // 1
// 下面这种写法也可以,但是不建议使用,将[]紧跟在数据类型后面,方面理解和区分
int array3[] = {4,5,6};
System.out.println(array3[0]); //
}

二、访问数组元素

1、使用 数组名[下标序号] 来访问数组元素。

2、数组的 .length 属性,可以获取数组的长度,即数组元素个数。

3、数组下标范围是从0开始,一直到 length-1 。

4、如果超范围访问,会出现运行异常,数组下标越界。下标小于0或者大于等于length,都是超范围。

    /**
* 数组长度获取,元素访问
*/
public static void arrayLength() {
// 获取数组的长度,使用 .length 属性
int[] array = {1,2,3,4};
System.out.println(array.length); // 4
// 数组的长度一经定义,就不能改变,因为其length属性是由final关键字修饰的,不可修改
//array.length = 5; // The final field array.length cannot be assigned
// 访问数组的元素,使用 [元素所在下标] , 下标从0开始
System.out.println(array[0]); // 打印数组第一个元素1
// 下标越界后,会出现 java.lang.ArrayIndexOutOfBoundsException 的异常
// System.out.println(array[4]);
}

三、数组遍历

利用for循环和for each循环,可以很轻松实现遍历数组元素。

   /**
* 数组遍历
*/
public static void seeArrayElements() {
int[] array = {1,2,3,4,5};
// for循环遍历打印
for (int i=0; i<array.length; i++) {
System.out.println(array[i]);
}
// for each遍历打印,括号中的第一个参数是元素的数据类型
// 第二个参数是获取值的局部变量名称(可以随意命名),第三个参数是数组名
for (int element : array) {
System.out.println(element);
}
}

四、数组拷贝和扩容

1、数组拷贝。

使用java.util.Arrays类中的copyOf( )方法来实现,而Arrays.copyOf( )方法的实现原理是借助System类的arraycopy方法,感兴趣的可以去尝试自己造下轮子,然后和官方的arraycopy方法进行对比。

2、数组扩容。

数组在初始化完成后,其长度是不能修改的,那么想要将一个数组长度变大或者变小,同样可以借助Arrays.copyOf( )方法。无论数组是扩容还是变小,原数组是不会改变的,只是将对象换做了一个新数组。

   /**
* 复制数组,数组扩容,无论数组是扩容还是变小,原数组是不会改变的
*/
public static void makeArrayCopy() {
// 复制数组,这里用到的是java.util.Arrays类中的copyOf()方法
int[] array = {2,4,6};
int[] newArray = Arrays.copyOf(array, array.length);
// 判断两个数组是否相等,用到的是Arrays类中的equals()方法
System.out.println(Arrays.equals(array, newArray)); // true
// 数组扩容
int[] addLength = Arrays.copyOf(array, array.length + 1);
System.out.println(addLength.length); //
for (int e : addLength) {
System.out.println(e); // 依次打印2 4 6 0
}
// 数组变小
int[] addLength2 = Arrays.copyOf(array, array.length - 1);
System.out.println(addLength2.length); //
for (int e : addLength2) {
System.out.println(e); // 依次打印2 4
}
}

五、数组排序

对数组的相邻元素进行比较,按照升序或降序规则进行换位,最后得到排序后的数组。

   /**
* 对数组进行升序排序
*/
public static void sortArrayAsc() {
// 声明并初始化一个数组
int[] array = {2, 10, 3, 78, 1, 29, 91, 5};
System.out.println(Arrays.toString(array));
for (int i=0; i<array.length-1; i++) {
for (int j=0; j<array.length-i-1; j++) {
if (array[j] > array[j+1]) {
int k = array[j];
array[j] = array[j+1];
array[j+1] = k;
}
}
}
System.out.println(Arrays.toString(array));
} /**
* 对数组进行降序排序
*/
public static void sortArrayDesc() {
// 声明并初始化一个数组
int[] array = {2, 10, 3, 78, 1, 29, 91, 5};
// 将数组变为字符串输出
System.out.println(Arrays.toString(array));
for (int i=0; i<array.length-1; i++) {
for (int j=0; j<array.length-i-1; j++) {
if (array[j] < array[j+1]) {
int k = array[j];
array[j] = array[j+1];
array[j+1] = k;
}
}
}
System.out.println(Arrays.toString(array));
} /**
* 利用Arrays.sort()方法进行排序
*/
public static void utilSort() {
// 声明并初始化一个数组
int[] array = {2, 10, 3, 78, 1, 29, 91, 5};
System.out.println(Arrays.toString(array));
Arrays.sort(array);
System.out.println(Arrays.toString(array));
}

六、二维数组

二维数组,从本质上来讲,还是一维数组,对二维数组的操作其实还是对一维数组的操作。

1、声明。类型[ ][ ] 变量名 = new 类型[ 长度 ][ 长度 ] ;

2、length属性。其长度是第一个[ ]中的长度值。

3、下标也是从0开始,也遵循下标不能越界的规则。

4、其他操作也和一维数组的操作类似。

   public static void stateTwoDimArray() {
// 声明一个二维数组
   int[][] array = new int[2][3];
// 对其元素赋值
array[0][0] = 1;
array[0][1] = 2;
array[0][2] = 3;
System.out.println(Arrays.toString(array[0])); // [1, 2, 3]
System.out.println(Arrays.toString(array[1])); // [0, 0, 0]
System.out.println(array.length); // 2
// 声明并初始化一个二维数组
int[][] array2 = {{1,2},{3,4}};
System.out.println(Arrays.toString(array2[0])); // [1, 2]
System.out.println(Arrays.toString(array2[1])); // [3, 4]
System.out.println(array2.length); //
}

上面的代码都上传至了GitHub,地址是https://github.com/XiaoChuan94/javalearning/tree/master/javalearningday05,有需要的可以去下载观看,如果喜欢就给个star吧!如有不足,欢迎下方留言交流。

文章首发于我的个人公众号:悦乐书。喜欢分享一路上听过的歌,看过的电影,读过的书,敲过的代码,深夜的沉思。期待你的关注!

公众号后台输入关键字“Java学习电子书”,即可获得12本Java学习相关的电子书资源,如果经济能力允许,还请支持图书作者的纸质正版书籍,创作不易。

Java入门(六):数组的更多相关文章

  1. Java系列学习(六)-数组

    1.方法: (1)定义: 完成特定功能块的代码,在有些语言中也叫函数 (2)格式: (3)方法的重载 [在同一个类中,方法名相同,参数列表不同,与返回值无关] 2.数组 (1)定义 存储同一种数据类型 ...

  2. Java入门 第一季第六章 数组

    这是我学习慕课网Java课程的笔记,原视频链接为:http://www.imooc.com/learn/85 6-1什么是数组 数组中的元素都能够通过下标来訪问.下标从 0 開始.比如,能够通过 sc ...

  3. 【JAVA零基础入门系列】Day10 Java中的数组

    什么是数组?顾名思义,就是数据的组合,把一些相同类型的数放到一组里去. 那为什么要用数组呢?比如需要统计全班同学的成绩的时候,如果给班上50个同学的成绩信息都命名一个变量进行存储,显然不方便,而且在做 ...

  4. Java入门篇(六)——类和对象

    写到这里终于写到了入门篇的最后一个知识点了.类和对象是Java中经常被提到的两个词汇,实际上可以将类看作对象的载体,它定义了对象所具有的功能.Java是面向对象的语言,因此掌握类与对象是学习Java语 ...

  5. 067 01 Android 零基础入门 01 Java基础语法 08 Java方法 05 数组作为方法参数

    067 01 Android 零基础入门 01 Java基础语法 08 Java方法 05 数组作为方法参数 本文知识点:数组作为方法参数 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

  6. 062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用

    062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用 本文知识点:二维数组应用 二维数组的声明和创建 ? 出现空指针异常 数组的名字指向数组的第 ...

  7. JAVA入门第一季(mooc-笔记)

    笔记相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第一季 ...

  8. Java入门第二季学习总结

    课程总概 该门课程作为java入门学习的第二季,是在有一定的java基础上进行的进一步学习.由于该季涉及到了java的一些核心内容,所以相对第一季来说,课程难度有所提升.大致可将该季的课程分为五部分: ...

  9. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

  10. Java入门记(五):容器关系的梳理(下)——Map

    注意:阅读本文及相关源码时,需要数据结构相关知识,包括:哈希表.链表.红黑树. Map是将键(key)映射到值(value)的对象.不同的映射不能包含相同的键:每个键最多只能映射到一个值.下图是常见M ...

随机推荐

  1. python函数的参数细节

    按"指针"传递 python中变量赋值.参数传递都是通过"指针"拷贝的方式进行的.除了按"指针"拷贝,还有一种按值拷贝的方式,关于按值.按指 ...

  2. Go基础系列:空接口

    空接口 空接口是指没有定义任何接口方法的接口.没有定义任何接口方法,意味着Go中的任意对象都可以实现空接口(因为没方法需要实现),任意对象都可以保存到空接口实例变量中. 空接口的定义方式: type ...

  3. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  4. .net 数据类型转换int.Parse()与int.TryParse

    int.Parse()是一种类容转换:表示将数字内容的字符串转为int类型. 如果字符串为空,则抛出ArgumentNullException异常: 如果字符串内容不是数字,则抛出FormatExce ...

  5. This relative module was not found (转载)

    vue踩坑-This relative module was not found 在使用vue.js的日期选择插件 的时候,报错如下   This relative module was not fo ...

  6. Netty 系列八(基于 WebSocket 的简单聊天室).

    一.前言 之前写过一篇 Spring 集成 WebSocket 协议的文章 —— Spring消息之WebSocket ,所以对于 WebSocket 协议的介绍就不多说了,可以参考这篇文章.这里只做 ...

  7. Session的原理,大型网站中Session方面应注意什么?

    一.Session和Cookie的区别Session是在服务器端保持会话数据的一种方法(通常用于pc端网站保持登录状态,手机端通常会使用token方式实现),存储在服务端. Cookie是在客户端保持 ...

  8. 小tips:HTML DOM中的children和childNodes属性

    childNodes 属性 标准的,childNodes 属性返回节点的子节点集合,以 NodeList 对象.包括HTML节点,所有属性,文本.可以通过nodeType来判断是哪种类型的节点,只有当 ...

  9. CSS3布局之多列布局columns详解

    columns语法:columns:[ column-width ] || [ column-count ]设置或检索对象的列数和每列的宽度 其中:[ column-width ]:设置或检索对象每列 ...

  10. 洛谷P2421 [NOI2002]荒岛野人(扩展欧几里得)

    题目背景 原 A-B数对(增强版)参见P1102 题目描述 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,… ...