一.概述

  • 数组(Array),是多个相同类型数据一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理
  • 数组常见概念: 数组名, 下标(或索引), 元素, 数组的长度
  • 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型
  • 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址
  • 数组的长度一旦确定,就不能修改
  • 可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快
  • 数组的分类:
    • 按照维度: 一维数组、二维数组、三维数组、…
    • 按照元素的数据类型分: 基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)

二.一维数组的使用

1.声明

type var[]; type[] var;

例如: int a[]; int[] a; String[] b;

Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; // 非法

2.初始化

  1. 动态初始化 :数组声明且为数组元素分配空间与赋值的操作分开进行

    int[] arr = new int[3];
    arr[0] = 3;
    arr[0] = 6;
    arr[0] = 9;
  2. 静态初始化 :在定义数组的同时就为数组元素分配空间并赋值

    int arr[] = new int[]{3,6,9};
    // 或
    int[] arr = {3,6,9}; // 定义数组长度为0, 数组的长度可以为0
    int[] a = new int[]{};
    int[] a = {};

3.数组元素的引用

  • 定义并用运算符new为之分配空间后,才可以引用数组中的每个元素
  • 数组元素的引用方式:数组名[数组元素下标]
    • 数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*i]
    • 数组元素下标从0开始;长度为n的数组合法下标取值范围: 0 —> n-1
  • 每个数组都有一个属性length指明它的长度: 数组一旦初始化, 其长度是不可变的

4.元素默认初始化值

数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化

数组元素类型 元素默认初始值
byte 0
short 0
int 0
long 0L
float 0.0F
double 0.0
char 0 或写为: '\u0000'(表现为空)
boolean false
引用类型 null

5.示例

数组遍历:

// 数组的赋值和遍历输出
public class Test{
public static void main(String args[]){
int[] s; // 局部变量:栈空间
s = new int[10]; // 在堆内存为int[]对象分配空间,并隐式初始化为默认值
//int[] s=new int[10];
// 基本数据类型数组在显式赋值之前,自动赋默认值
for ( int i=0; i<10; i++ ) {
s[i] =2*i+1; //显示初始化
System.out.println(s[i]); //输出
}
}
}

对象数组:

声明和初始化: 类名称[] 对象数组名称 = new 类名称[对象个数];

// 对象数组的使用
Student[] stu = new Student[10];
for(int i=0; i<stu.length; i++){
Student s = new Student("Jack"+i,18+i); //实例化对象
stu[i] = s; //将对象放入数组
}
for(int i=0; i<stu.length; i++){
System.out.println(stu[i].name+" "+stu[i].age); //打印输出每个对象的属性
}

三.二维数组的使用

对于二维数组(数组中的数组)的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,其实没有多维数组

1.初始化

1.动态初始化: int[][] arr = new int[3][2];

  • 定义了名称为arr的二维数组
  • 二维数组中有3个一维数组
  • 每一个一维数组中有2个元素
  • 一维数组的名称分别为arr[0], arr[1], arr[2]
  • 给第一个一维数组1脚标位赋值为78写法是: arr[0][1] = 78;

2.动态初始化: int[][] arr = new int[3][]

  • 二维数组中有3个一维数组
  • 每个一维数组都是默认初始化值null
  • 可以对这个三个一维数组分别进行初始化
  • arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];

3.静态初始化: int[][] arr = new int[][]{{1,3,5},{2,4},{6,8,5,6}};

int[][] a = {(1,2,3),(4,5,6),(7,8,9)};

  • 定义一个名称为arr的二维数组,二维数组中有三个一维数组
  • 每一个一维数组中具体元素也都已初始化
  • 第一个一维数组arr[0] = {1,3,5};
  • 第二个一维数组arr[1] = {2,4};
  • 第三个一维数组arr[2] = {6,8,5,6};
  • 第三个一维数组的长度表示方式arr[2].length;
  • 注意特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组

2.示例

二位数组的遍历:

String[][] s = new String[2][3];
for(int i=0; i<s.length; i++){ //s.length表示二维数组的行数
for(int j=0; j<s[i].length; j++){ //s[i].length表示二维数组的列数
s[i][j] = "第"+i+"行,第"+j+"列"; //将字符串对象存入数组
}
}
//遍历输出二维数组的值 --嵌套循环
for(int i=0; i<s.length; i++){
for(int j=0; j<s[i].length; j++){ //遍历每个一维数组
System.out.print(s[i][j]+" ");
}
System.out.println();
}

不规则二维数组遍历:

// a.定义
int[][] a = new int[5][]; //定义行,即a[0]-a[4],a[i]都是数组对象的引用
a[0] = new int[4]; //定义a[0]所实际引用的数组对象,即第一行由4个元素组成
a[1] = new int[3];
a[2] = new int[1];
a[3] = new int[2];
//没有定义a[4],即第五行开辟的空间,没有显示初始化,a[4]默认值为null // b.数组的遍历
for(int i=0; i<a.length; i++){
System.out.print("第"+(i+1)+"行:");
if(a[i] == null){ //判断数组对象的引用是否是null
System.out.print(a[i]);
continue;
}
for(int j=0; j<a[i].length; j++){
System.out.print(a[i][j]+" ");
}
System.out.println();
}

四.常用两种排序

1.冒泡排序

// 定右边数字
int[] a = {1,3,2,6,4,8};
for(int i=0; i<a.length-1; i++){ //轮数
for(int j=0; j<a.length-1-i; j++){ //次数
if(a[j]>a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}

2.选择排序

// 定左边数字
int[] flag = new int[2]; //中间容器
for(int i=0; i<a.length-1; i++){ //a.length轮只需要比较a.length-1轮
flag[0] = a[i];
flag[1] = i;
for(int j=i+1; j<a.length; j++){ //比较最小值,放入中间容器
if(a[i]>a[j]){
flag[0] = a[j];
flag[1] = j;
}
}
if(flag[1] != i){ //换位置
int temp = a[i];
a[i] = flag[0];
a[flag[1]] = temp;
}
} // 简单写法
int[] a = {1,3,2,6,4,8};
for(int i=0; i<a.length-1; i++){ //轮数
for(int j=i+1; j<a.length; j++){ //次数
if(a[i]>a[j]){
int temp = a[i];
a[i] = a[j];
a[j] = temp
}
}
}

五.其它使用

1.Arrays工具类的使用

java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法

方法 描述
boolean equals(int[] a,int[] b) 判断两个数组是否相等
String toString(int[] a) 输出数组信息
void fill(int[] a,int val) 将指定值填充到数组之中
void sort(int[] a) 对数组进行排序
int binarySearch(int[] a,int key) 对排序后的数组进行二分法检索指定的值

示例:

// 利用sort()方法对数组进行排序
import java.util.Arrays;
public class SortTest {
public static void main(String[] args) {
int[] numbers = {5,900,1,5,77,30,64,700};
Arrays.sort(numbers);
for(int i = 0; i < numbers.length; i++){
System.out.println(numbers[i]);
}
}
}

2.数组使用中的常见异常

  1. 数组脚标越界异常(ArrayIndexOutOfBoundsException)

    // 访问到了数组中的不存在的脚标时发生
    int[] arr = new int[2];
    System.out.println(arr[2]);
  2. 空指针异常(NullPointerException)

    // arr引用没有指向实体,却在操作实体中的元素时
    int[] arr = null;
    System.out.println(arr[0]);

java 数组详细介绍的更多相关文章

  1. java agent 详细介绍 -javaagent参数

    java agent 详细介绍 简介 java agent是java命令的一个参数.参数 javaagent 可以用于指定一个 jar 包,并且对该 java 包有2个要求: 这个 jar 包的MAN ...

  2. JAVA HashMap详细介绍和示例

    http://www.jb51.net/article/42769.htm 我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.   第1部分 HashMa ...

  3. !!对python列表学习整理列表及数组详细介绍

    1.Python的数组分三种类型:(详细见 http://blog.sina.com.cn/s/blog_6b783cbd0100q2ba.html) (1) list 普通的链表,初始化后可以通过特 ...

  4. Java linkedList详细介绍及使用示例

    ①LinkedList简单介绍 是一个继承于AbstractSequentialList的双向链表.它可以被当成堆栈.队列或双端队列进行操作. 实现了List接口,能对它进行队列操作. 实现了Dequ ...

  5. Java反射详细介绍

    反射 目录介绍 1.反射概述 1.1 反射概述 1.2 获取class文件对象的三种方式 1.3 反射常用的方法介绍 1.4 反射的定义 1.5 反射的组成 1.6 反射的作用有哪些 2.反射的相关使 ...

  6. Java高精度学习第三弹——ACM中使用JAVA的详细介绍

    Chapter I. Java的优缺点各种书上都有,这里只说说用Java做ACM-ICPC的特点: (1) 最明显的好处是,学会Java,可以参加Java Challenge . (2) 对于熟悉C/ ...

  7. Java ArrayList详细介绍和使用示例

    ①对ArrayList的整体认识 ArrayList是一个数组队列,相当于动态数组.与Java中的数组相比,它的容量能动态增长.它继承了AbstractList,实现了List,RandomAcces ...

  8. Java Vertor详细介绍和使用示例

    ①对Vector有个整体认识 Vector是向量类,继承于AbstractList,实现了List,RandomAccess,Clonable这些接口. Vector继承于AbstractList,实 ...

  9. Java Hashtable详细介绍和使用示例

    ①对Hashtable有个整体认识 和HashMap一样,Hashtable 也是一个散列表,它存储的内容是键值对(key-value)映射.Hashtable 继承于Dictionary,实现了Ma ...

随机推荐

  1. CodeForces-585B(BFS)

    链接: https://vjudge.net/problem/CodeForces-585B 题意: The mobile application store has a new game calle ...

  2. JavaWeb面试篇(6)

    51.说一说Servlet的生命周期? Servlet有良好的生存期的定义,包括加载和实例化.初始化.处理请求以及服务结束.这个生存期由javax.servlet.Servlet接口的init(),s ...

  3. js对象的创建模式

    方式一: Object构造函数模式 * 套路: 先创建空Object对象, 再动态添加属性/方法 * 适用场景: 起始时不确定对象内部数据 * 问题: 语句太多 /* 一个人: name:" ...

  4. 字典,set

    字典 dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度 存取速度快 key-value存储方式,在放进去的时候,必须根据key算出v ...

  5. BZOJ 4881: [Lydsy1705月赛]线段游戏 动态规划 + 线段树

    Description quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐 标分别为(0,i)和(1,p_i),其中p_1,p_2,. ...

  6. BZOJ 4488: [Jsoi2015]最大公约数 暴力 + gcd

    Description 给定一个长度为 N 的正整数序列Ai对于其任意一个连续的子序列 {Al,Al+1...Ar},我们定义其权值W(L,R )为其长度与序列中所有元素的最大公约数的乘积,即W(L, ...

  7. POJ 2182 Lost Cows (树状数组 && 二分查找)

    题意:给出数n, 代表有多少头牛, 这些牛的编号为1~n, 再给出含有n-1个数的序列, 每个序列的数 ai 代表前面还有多少头比 ai 编号要小的牛, 叫你根据上述信息还原出原始的牛的编号序列 分析 ...

  8. 【BZOJ2409】 地下车会

    Description 小Y喜欢速度与激情,于是他参加了地下车会.  地下车会设有N 个分赛区,M种赛事.每个分赛区有C[i]场比赛.由于地下车会经营者想要赚到更多的钱,规定小 Y 必须参加某一些赛区 ...

  9. dell笔记本 win10 下安装 ubuntu16.04 踩坑记录

    硬件配置情况: dell笔记本-灵越-5577 —— I5七代(带有集显),8G内存条DDR4,GTX1050,128G固态硬盘,1T机械硬盘. 固态硬盘划分为3部分,100GB给win10的C盘,1 ...

  10. git回滚操作

    一,找到之前的版本历史纪录,确定要回滚到那个版本号:git log 二,回滚到这个版本:git reset --hard 72229f823c8b21cbe52142a944d74f1883fa41a ...