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

一、语法和声明数组

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. 翻译:DECLARE Variable(已提交到MariaDB官方手册)

    本文为mariadb官方手册:DECLARE Variable的译文. 原文:https://mariadb.com/kb/en/library/declare-variable/我提交到MariaD ...

  2. MySQL系列详解六:MySQL主从复制/半同步演示-技术流ken

    前言 随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求.此时数据库集群就很好的解决了这个问题了.采用MySQL分布式集群,能够搭建一个高并发.负载均衡的集群服务器.在 ...

  3. SpringBoot系列——Thymeleaf模板

    前言 thymeleaf是springboot官方推荐使用的java模板引擎,在springboot的参考指南里的第28.1.10 Template Engines中介绍并推荐使用thymeleaf, ...

  4. Linux常用命令汇总(一)

    线程操作 1.ps ps -ef 查看当前活动进程 ps -ef | grep [线程关键信息] ps -ef | grep java 查看java相关进程 2.kill killall -9 jav ...

  5. MVC学习之路(1) EF 增删查改合集

    首先再Model中创建一个类[WMBlogDB] public class WMBlogDB : DbContext { //连接字符串. public WMBlogDB() : base(" ...

  6. 汇编语言--微机CPU的指令系统(五)(比较运算指令)

    (7)比较运算指令 在程序中,我们要时常根据某个变量或表达式的取值去执行不同指令,从而使程序表现出有不同的功能.为了配合这样的操作,在CPU的指令系统中提供了各种不同的比较指令.通过这些比较指令的执行 ...

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

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

  8. jfinal中excel表格导出

    今天工作中遇到了excel表格导出的操作,还好有写好的模板,不然我也是焦头烂额,下面记录一下excel表格导出的操作步骤,同时用来给正在学习jfinal的小伙伴一些参考和学习. 首先我们需要把表格查询 ...

  9. JavaScript Hoisting(提升)

    Hoisting 是指 js 在执行代码前,默认会将变量的声明和函数的声明,提升到当前作用域顶端的行为. 这里要注意一下,只提升声明,例如: console.log(a); var a = 10; / ...

  10. layui layer select 选择被遮挡

    在编程的时候, layer弹窗中的select 经常会遇到被遮挡的情况: 解决方法:在页面里面找到对应div的class 给overflow新的属性visible即可(默认值.内容不会被修剪,会呈现在 ...