一.概述

  • 数组(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. vue3之组件

    目录 组件 根组件 局部组件 全局组件 组件的注册 组件名 组件名大小写 全局注册 局部注册 模块系统 组件注册实例: 组件化 组件间数据的传递 父组件传递数据给子组件 父组件传递数据给子组件例子 子 ...

  2. VUE实现限制输入框最多输入15个中文,或者30个英文

    vue项目,输入框限制输入15个中文,或者30个英文 <input type="text" v-model="groupName" class=" ...

  3. 使用 XSLT 显示 XML

    通过使用 XSLT,您可以向 XML 文档添加显示信息. 使用 XSLT 显示 XML XSLT 是首选的 XML 样式表语言. XSLT (eXtensible Stylesheet Languag ...

  4. BZOJ 3786: 星系探索 ETT

    Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅有一个依赖星球.主星球 ...

  5. 02-scrapy的cmdline命令

    1.启动爬虫的命令为: scrapy crawl spidername(爬虫名) 2.我们还可以通过下述方式来启动爬虫 步骤一:创建一个.py文件.startspider.py(这里文件的名称可以自己 ...

  6. 【转载】mysqld_safe Directory ‘/var/run/mysqld’ for UNIX socket file don’t exists.

    This is about resetting the MySQL 5.7 root password in Ubuntu 16.04 LTS You probably tried something ...

  7. Oracle rac11g 安装报INS41112

    由于集群服务器上的数据库存储层要上双活,所以需要重置存储 不幸17服务器在重启后突然奔溃了,所以需要重新安装17服务器系统 在把18的软件全都卸载干净后,重新安装集群服务器,但却遇到了如下问题 多次针 ...

  8. sqli-labs(17)

    0x01简介 百度翻译了一下 基于错误的更新查询 字符型 第一次遇到这种情况 那我们先看看源代码行吧 不懂函数的百度 $result = mysql_query($sql);//返回查询的数据的一个结 ...

  9. [CSP-S模拟测试]:表达式密码(模拟)

    题目传送门(内部题87) 输入格式 从文件$expression.in$中读入数据.输入一行,一个字符串$S$,表示原表达式,保证为合法表达式 输出格式 输出到文件$expression.out$中. ...

  10. Laravel提交POST请求报错

    提交POST请求出现如下错误: The page has expired due to inactivity Please refresh and try again 这是由于在Laravel框架中有 ...