大纲
一维数组
概述
数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。

这些按序排列的同类数据元素的集合称为数组“[]”。

特点
定长
长度一旦确定不可以改变。

相同数据类型
其元素必须是 相同 类型,不允许出现混合类型。数组中的元素可以是任何数据类型,包括基本类型和引用类型。

位置有序
元素所在的位置是有序的。

数组本身属于引用类型
数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象Java 中对象是在堆中的,因此数组无论保存基本类型还是其他对象类型,数组对象本身是在堆中的。

数组中可以存储任意类型的数据
定义
数组声明格式
数据类型[] 数组名称; --推荐使用
数据类型 数组名称[];
double[] arr;
char arr2[];
注意 : 引用数据类型只声明不赋值存在默认值null

数组初始化
动态初始化
数组定义与为数组元素分配空间和赋值的操作分开进行

数据类型[] 数组名=new 数据类型[长度];
int[] data = new int[5];
注意:元素为引用数据类型的数组中的每一个元素都需要实例化。

Person[] people; //声明说组
people = new Person[3]; //创建数组
people[0] = new Person(); //数组中元素实例化
people[1] = new Person();
people[2] = new Person();

静态初始化
在定义数组的同时就为数组元素分配空间并赋值

数据类型[] 数组名=new 数据类型[]{值1,值2...}; 
数据类型[] 数组名={值1,值2...}; --当面的简写方式
int[] arr=new int[]{1,3,4,6};
int[] arr2={1,2,3,4,5};
注意:
对于返回值类型为数组类型的方法来说,我们可以return new int[3];,我们也可以return new int[]{1, 2, 3};,但我们不可以return {1, 2, 3};。即简写方式,其不能脱离数组的声明,{1, 2, 3}并不能返回一个数组对象。

一维数组对象演示图
数组的默认值
数组中的元素只声明不赋值存在默认值,数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐式初始化。

一般规律为数值型数组默认值为 0,引用型数组默认值为 null:

数组类型 默认初始值
byte 0
short 0
int 0
long 0
char 编码为0的字符
String(引用类型) null
float 0.0
double 0.0
boolean false
使用
数组元素的界限
定义并用 new 为之分配空间之后,才可以引用数组中的每个元素,数组元素的引用方式为:

arrayName[index];
index为数组元素下标|索引,可以是整型常量或整型表达式 , 可以根据数组元素的下标操作数组中数据。如:

arr1[3] = 5; //为数组索引为0的空间位置赋值
arr2[0] = "张三"; //为数组索引为0的空间位置赋值
System.out.println(arr3[2]);//获取数组中索引为2的数据值
数组元素下标从0开始;长度为n的数组的合法下标取值范围为

0~n-1

每个数组都有一个属性length指明它的长度

a.length的值为数组a的长度(元素的个数)

数组元素遍历方式
(1)普通for循环

for(int 索引=0;索引<长度; 索引++){
数组名称[索引] = 值;
}
int[] arr={1,2,3,4};
//1.遍历数组---基本for循环
for(int i=0;i<arr.length;i++){
//变量i代表索引/元素的下标
System.out.println(arr[i]);
}
(2)增强for循环

for(元素类型 局部变量 : 数组){
局部变量-->为数组中的每一个元素值,从左向右以此获取
}
//2.遍历数组---增强for循环
for(int i : arr){
System.out.println(i); //i中存储数组的元素值,非索引
}
数组基本练习
//A:遍历int类型的数组 依次输出每个数组元素
public static void printArray(int[] arr){
//循环遍历数组下标
for(int i=0;i<arr.length;i++){
System.out.println("输出int类型数组的每一个元素"+arr[i]);
}
}
//B:逆序:倒叙输出数组元素
public static void printArr(String[] arr){
for(int i=arr.length-1;i>=0;i--){
System.out.println(arr[i]);
}
}
//C:最值:获取数组中的最大值和最小值
public static void maxMinValue(int[] arr){
//假设数组中的第一个元素当成最大值
int max=arr[0];
//假设数组中的第一个元素当成最大值
int min=arr[0];
//遍历数组
for(int i=0;i<arr.length;i++){
//比较数组元素与max
if(max<arr[i]){
max=arr[i];
}
//比较数组元素与min
if(min>arr[i]){
min=arr[i];
}
System.out.println("数组中最大的值为max"+max);
System.out.println("数组中最小的值为min"+min);
}
}
Arrays
该类提供了关于数组操作的API.

如何查看API
Arrays中常用方法
打印数组----toString方法。
比较两个数组是否相同----equals方法。
数组排序----sort方法。
数组查找----binarySearch 方法。
数组拷贝----copyOf方法。
数组拷贝----copyOfRange方法。
String[] arr1={"hello","shsxt"};
String[] arr2={"hello","shsxt"};
System.out.println(arr1.equals(arr2)); //false
//1.Arrays.equals() 先判断两个数组的length是否相等,如果相等,再比内容,如果不相等,直接返回false
System.out.println(Arrays.equals(arr1, arr2));
//2.Arrays.toString 字符串形式打印数组信息
System.out.println(Arrays.toString(arr1));

//3.Arrays.sort() 升序
int[] arr3={12,7,0,6,-32};
Arrays.sort(arr3); //-32 0 6 7 12 
String[] arr4={"ab","a","bc","abc"}; //根据Unicode表中的值
Arrays.sort(arr4); //a ab abc bc

//4.Arrays.binarySearch( 数组, 元素) ) :二分法查找 查找元素在数组中出现的索引
//前提:先升序排序,才能二分法查找
//找到返回索引,找不到返回-(插入点)-1
Arrays.sort(arr3); 
System.out.println(Arrays.binarySearch( arr3, 16)); // -6
经典案例实现-点名器
运行代码,随机打印班级同学名字

//1.数组存储姓名,用String数据类型
String[] names={"杰克","戴维琼斯","伊丽莎白","爱丽丝"}; 
//2.遍历数组,打印出所有姓名
for(int i=0;i<names.length;i++){
System.out.println(names[i]);

//3.随机出一个人名
//利用随机数,生成一个证书,作为索引,到数组中查找对应的元素
Random ran=new Random();
//随机数的范围是[0,names.length-1]
int index=ran.nextInt(names.length); //括号中填写的最大数是获取不到的,因为nextInt获取的范围是左闭右开区间
System.out.println(names[index]);
二维数组
二维数组可以看成以数组为元素的数组。

其实多维数组不仅仅只有二维数组,还有三维数组,四维数组…, 但是三维以上很少见到,所以大家重点了解二维数组即可。

举例
int [][] a = {{1,2},{3,4,0,9},{5,6,7}};
初始化
动态初始化
数组定义与为数组元素分配空间和赋值的操作分开进行

数据类型[][] 数组名 = new 数据类型[一维][二维];
注意:这种初始化方式,每一个内层的二位数组长度相同

int[][] a=new int[3][2];
a[0][0] = 1;
a[0][1] = 2;
数据类型[][] 数组名 = new 数据类型[一维][];
内层数组需要我们自己去创建(下面可以用一维数组的创建方式)
数组名[一维数组索引值] = new 数据类型[二维];
int[][] a=new int[3][];
arr[0]=new int[2];
arr[1]=new int[]{3,4,5,6};
arr[2]=new int[]{7,8,9};
arr[0][0] = 1;
arr[0][1] = 2;
静态初始化
在定义数组的同时就为数组元素分配空间并赋值

数据类型[][] 数组名 = new 数据类型[][]{{...},{...},{...}};
数据类型[][] 数组名 = {{...},{...},{...}}; --简化写法
int[][] arr1=new int[][]{{5,4,8},{3,8},{1}};
char[][] arr2={{'a'},{'b','c'}};
遍历方式
双重循环实现多维数组的遍历

//普通for循环嵌套增强for循环
for(int i=0;i<=arr1.length-1;i++){
for(int j:arr1[i]){
System.out.println(j);
}
}
//增强 for循环嵌套普通for循环
for(int[] arr:arr1){
for(int i=0;i<=arr.length-1;i++){
System.out.println(arr[i]);
}
}
//普通for嵌套普通for循环
...
//增强for嵌套增强for循环
...
Arrays中提供操作多维数组的方法:

static boolean deepEquals(Object[] a1, Object[] a2) 如果两个指定的数组彼此 深度相等 ,则返回 true 。 
static String deepToString(Object[] a) 返回指定数组的“深度内容”的字符串表示形式。 
double[][] arr1= new double[][] {{1.0,2.0},{3.0,4.0,5.0},{6.0}};
double[][] arr2= new double[][] {{1.0,2.0},{3.0,4.0,5.0},{6.0}};
System.out.println(Arrays.deepToString(arr1)); //[[1.0, 2.0], [3.0, 4.0, 5.0], [6.0]]
System.out.println(Arrays.deepEquals(arr1, arr2)

java13编程基础之数组深入的更多相关文章

  1. [.net 面向对象编程基础] (17) 数组与集合

    [.net 面向对象编程基础] (17) 数组与集合 学习了前面的C#三大特性,及接口,抽象类这些相对抽象的东西以后,是不是有点很累的感觉.具体的东西总是容易理解,因此我们在介绍前面抽象概念的时候,总 ...

  2. [.net 面向对象编程基础] (1) 开篇

    [.net 面向对象编程基础] (1)开篇 使用.net进行面向对象编程也有好长一段时间了,整天都忙于赶项目,完成项目任务之中.最近偶有闲暇,看了项目组中的同学写的代码,感慨颇深.感觉除了定义个类,就 ...

  3. Java编程基础——数组和二维数组

    Java编程基础——数组和二维数组 摘要:本文主要对数组和二维数组进行简要介绍. 数组 定义 数组可以理解成保存一组数的容器,而变量可以理解为保存一个数的容器. 数组是一种引用类型,用于保存一组相同类 ...

  4. Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式

    前言 啦啦啦~(博主每次开篇都要卖个萌,大家是不是都厌倦了呢~) 本篇博文希望帮助大家掌握 Broadcast 编程基础,实现动态注册 Broadcast 和静态注册 Broadcast 的方式以及学 ...

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

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

  6. [.net 面向对象编程基础] (3) 基础中的基础——数据类型

    [.net 面向对象编程基础] (3) 基础中的基础——数据类型 关于数据类型,这是基础中的基础. 基础..基础..基础.基本功必须要扎实. 首先,从使用电脑开始,再到编程,电脑要存储数据,就要按类型 ...

  7. [.net 面向对象编程基础] (4) 基础中的基础——数据类型转换

    [.net面向对象编程基础] (4)基础中的基础——数据类型转换 1.为什么要进行数据转换? 首先,为什么要进行数据转换,拿值类型例子说明一下, 比如:我们要把23角零钱,换成2.30元,就需要把整形 ...

  8. [.net 面向对象编程基础] (7) 基础中的基础——流程控制语句

    [.net 面向对象编程基础] (7) 基础中的基础——流程控制语句 本来没有这一节的内容,后来考虑到既然是一个系列文章,那么就尽可能写的详细一些,本节参考了网上朋友所写的例子,为的是让更多小伙伴学习 ...

  9. [.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)

    [.net 面向对象编程基础] (10) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态 ...

随机推荐

  1. Python中判断字符串是否为数字的三个方法isdecimal 、isdigit、isnumeric的差别

    isdecimal .isdigit.isnumeric这三个字符串方法都用于判断字符串是否为数字,为什么用三个方法呢?他们的差别是什么内? isdecimal:是否为十进制数字符,包括Unicode ...

  2. 【系统设计】WMS系统中 库存、盘点、移库、拆库功能的设计(库内管理)

    最近负责WMS系统 盘点 移库 两个功能模块的功能及数据库设计. 物流仓储系统的搭建,要基于仓库的实际情况,整理内部员工需求,再参考其他WMS系统,经过长时间的讨论和研究,最终转化为产品需求. 这里先 ...

  3. Get请求Test

    一.新建测试套 作为管理接口,可按功能分类,也可按业务逻辑分类,根目录下最多一级子目录.运行接口时,可按测试套为单位,整体运行. 二.选择请求类型,输入接口地址 根据接口文档中提供的接口请求类型及地址 ...

  4. python冒泡算法联系代码

    root@(none):~/python# python maopao.py[6, 11, 13, 22, 99]root@(none):~/python# cat maopao.py #!/usr/ ...

  5. 如何实现 token 加密(来自github每日一题)

    需要一个secret(随机数) 后端利用secret和加密算法(如:HMAC-SHA256)对payload(如账号密码)生成一个字符串(token),返回前端 前端每次request在header中 ...

  6. 【无聊乱搞】如何用 std::set 过 gamma

    一道毒瘤题 \(\gamma\) by DPair 题目描述 维护一个正整数集 \(S\),元素 \(\in\) 值域 \(U\),需要支持: \(\texttt{1 l r}\):\(S\gets ...

  7. P1654 OSU! 题解

    \(x\) 为该位置有 \(1\) 的期望. 统计两个值 : \(suma\) 和 \(sumb\). \(suma\) 表示连续 \(X\) 个 \(1\) , \(X\) 的平方的期望, \(su ...

  8. 题解-Quantifier Question

    Quantifier Question 有长度为 \(n\) 的序列 \(x\{n\}\),有 \(m\) 个条件 \((j_i,k_i)\).有 \(n\) 个待定的条件符 \(Q_i\in\{\f ...

  9. xlwt:python的写excel模块

    最近工作时碰到了将数据导出,生成一个excel表,对其中的部分数据进行统计,并给其中部分符合条件的数据添加对应的背景颜色的功能需求,于是乎,对Python中写excel的模块xlwt研究了一下,在工作 ...

  10. C++笔试题续

    第一部分:C++与C语言的差异(1-18)1.C 和 C++ 中 struct 有什么区别? Protection行为 能否定义函数C 无 否,但可以有函数指针C++ 有 可以,默认是public2. ...