目录
大家好,我是躺在床上混子日的躺平哥,今天我们来学习java中的数组,希望给位大佬多多指教!
1.数组概述及定义
数组的概述:
数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
数组是一个最简单的数据结构。
数组的定义:
数组是相同类型数据的有序集合。
数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
其中,每一个数据称作为一个数组元数,每一个数组元数可以通过一个下表来访问他们!
2.数组声明创建
声明与创建:
首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:
变量类型 变量的名字 =变量的值
数组类型 比如:int[],是存储整数型的数组。
dateType[]arrayRefVar;//首选的方法
或dateType array RefVar[];//效果相同,但不是首选的方法
java语言使用new操作符来创建数组,语法如下:
dateType[]arrayRefVar =new dateType[arraySize];
数组的元素是通过索引访问的,数组索引从0开始。比如a[0],a[1],a[2],a[3],a[4],a[5] 这0,1,2,3,4,5,就是索引!
获取数组长度操作:
arrays.length
[下面我们来声明一个数组并创建一个数组,然后引用数组元素并求元素的和]
public static void main(String[] args) {
int[] nums;//1,声明一个数组
nums=new int[10];//2,创建一个数组
//3,给数组中元素赋值
nums[0]=1;
nums[1]=2;
nums[2]=3;
nums[3]=4;
nums[4]=5;
nums[5]=6;
nums[6]=7;
nums[7]=8;
nums[8]=9;
nums[9]=10;
System.out.println(nums[0]);
//4,计算所有元素的和
int sum =0;
for (int i=0;i<nums.length;i++)
{
sum =sum+nums[i];
}
System.out.println("总和为:"+sum);
}
运行结果为:
3数组创建的底层原理之三种初始化及内存分析:
1.静态初始化
(创建+赋值:即创建数组的时候就要给数据!)
(初始化时由程序猿显示指定每个数组元素的初始值,由系统决定数组的长度)
int[] a={1,2,3};
Man[] mans ={new Man(1,1),new Man(2,2)};
2.动态初始化
(包含默认初始化)
(动态初始化就是在初始化的时候指定数组长度(这时已经分配内存))
int [] a=new int[2]
a[0]=1;
a[1]=2;
括号里的内容也是动态初始化和静态初始化的区别!
3.数组的默认初始化
(默认赋值:int型默认值为0,string型默认值为null(空))
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
4.内存分析
下面的图比较容易理解
4.数组使用
在使用数组前要先掌握数组的四个基本特点
四个基本特点
1.其长度是确定的。数组一旦被创建,他的大小就是不可以改变的。
2.其元素必须是相同类型,不允许出现混合类型。
3.数组中的元素可以是任何数据类型,包括基本类型和引用类型。
4.数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量
数组本身就是对象,java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身就是在堆中的
数组边界
下标的合法区间:【0,length-1】,如果越界就会报错;
public static void main (String[] args){
int [] a=new int[2];
System.out.println(a[2]);
}
小结:
1.数组是相同数据类型(数组类型可以为任意类型)的有序集合。
2.数组也是对象。数组元素相当于对象的成员变量。
3.数组长度是确定的,不可变的。如果越界,则会报上方的红色语句!
数组的使用具体介绍
数组的一些基本使用:
普通的for循环(用的最多)
我们要从数组里取出一些数据或者下标进行操作时使用
public static void main(String[] args) {
int[] arrays ={1,2,3,4,5};
//打印全部的数组元素
for(int i=0;i< arrays.length;i++){
System.out.println(arrays[i]);
}
System.out.println("========");
//计算所有元素的和
int sum=0;
for(int i=0;i<arrays.length;i++){
sum+=arrays[i];
}
System.out.println("sum"+sum);
System.out.println("============");
//查找最大元素
int max=arrays[0];
for(int i=1;i< arrays.length;i++)
if(arrays[i]>max){
max=arrays[i];
}
System.out.println("max"+max);
}
进阶使用:
For-Each循环(即增强for循环)
一般用来打印一些结果时使用
public static void main(String[] args) {
int[]arrays ={1,2,3,4,5};
//JDK1.5,没有下标
for (int array : arrays) {
System.out.println(array);
}
}
数组作方法入参
就是咱们可以对数组进行操作
数组可以做参数传递给方法。
例如:
//打印数组元素
public static void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
数组作返回值
当我们想把数组修改一下,然后返回一个新的数组的时候使用!
return后的是返回值
//反转数组
public static int[] reverse(int[] arrays) {
int[] result = new int[arrays.length];
//反转操作
for (int i = 0, j = result.length - 1; i < arrays.length; i++, j--) {
result[j] = arrays[i];
}
return result;
}
记住就行,操作固定!
5.多维数组
多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一个一维数组.
二维数组
内存结构:
基本格式:
int a[][]=new int[2][5];
因为二维数组只有两个下标都知道才能定位具体位置!所以后面两个数!
两种初始化方法:
1: 动态初始化
数据类型 数组名 [ ][ ] = new 数据类型[m][n]
数据类型 [ ][ ] 数组名 = new 数据类型[m][n]
数据类型 [ ] 数组名 [ ] = new 数据类型[m][n]
举例:int [ ][ ] arr=new int [5][3]; 也可以理解为“5行3例”
2: 静态初始化
数据类型 [ ][ ] 数组名 = {{元素1,元素2....},{元素1,元素2....},{元素1,元素2....}.....};
举例:int [ ][ ] arr={{22,15,32,20,18},{12,21,25,19,33},{14,58,34,24,66},};
静态初始化可用于不规则二维数组的初始化
public static void main(String[]args){
int [][] arr=new int[][]{{4,5,6,8},{2,3},{1,6,9}};
System.out.println(arr.length);//输出行数
System.out.println(arr[0].length);//输出列数
}
二者区别跟一维数组的动态初始化和静态初始化相同,详见上方!
获取二维数组长度:
数组值arr[x][y]表示指定的是第x行第y列的值。
在使用二维数组对象时,注意length所代表的长度。
数组名后直接加上length(如arr.length),所指的是有几行(Row)。
指定索引后加上length(如arr[0].length),指的是该行所拥有的元素,也就是列(Column)数目。
6.Arrays类(关于数组的工具类)
想一下我们之前是不是学过scanner类,他是接收键盘输入的一个类,而Arrays类是操作数组的类。说白了java的学习就是在学习一个又一个的类!
由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从
而可以对数据对象进行一些基本的操作。
而且Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用!
而"不用"使用对象来调用(注意:是"不用" 而不是 "不能")
java.util.Arrays 类能方便地操作数组. 使用之前需要导包!
具有一下常用功能:
1.给数组赋值:通过 fifill 方法。
2.对数组排序:通过 sort 方法,按升序。
3.比较数组:通过 equals 方法比较数组中元素值是否相等。
4.查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。
1.打印数组
public class java1 {
public static void main(String[] args) {
int[] nums = new int[5];
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;
nums[3] = 4;
nums[4] = 5;
System.out.println(Arrays.toString(nums));
}
}
2.数组排序
public static void sort(int[] a) :对指定的 int 型数组按数字升序进行排序。
public class java1 {
public static void main(String[] args) {
int[] nums = new int[5];
nums[0] = 1;
nums[1] = 6;
nums[2] = 55;
nums[3] = 15;
nums[4] = 45;
System.out.println(Arrays.toString(nums));
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
}
}
3.二分查找
在数组中查找指定元素并返回其下标
注意:使用二分搜索法来搜索指定的数组,以获得指定的值。必须在进行此调用之前对数组进行排序(通过sort方法等)。如果没有对数组进行排序,则结果是不确定的。
如果数组包含多个带有指定值的元素,则无法保证找到的是哪一个。
Arrays.binarySearch(); //二分查找法找指定元素的索引值(下标):
数组一定是排好序的,否则会出错。找到元素,只会返回最后一个位置
int[] arr = {10,20,30,40,50};
System.out.println(Arrays.binarySearch(arr, 30));
//输出:2 (下标索引值从0开始)
int[] arr = {10,20,30,40,50};
System.out.println(Arrays.binarySearch(arr, 36));
//输出:-4 (找不到元素,返回-x,从-1开始数,如题,返回-4)
int []arr = {10,20,30,40,50};
System.out.println(Arrays.binarySearch(arr, 0,3,30));
//输出:2 (从0到3位(不包括)找30,找到了,在第2位,返回2)
int []arr = {10,20,30,40,50};
System.out.println(Arrays.binarySearch(arr, 0,3,40));
//输出:-4 (从0到3位(不包括)找40,找不到,从-1开始数,返回-4)
4.元素填充
Arrays.fill(); //填充数组
int[] arr = new int[5];//新建一个大小为5的数组
Arrays.fill(arr,4);//给所有值赋值4
String str = Arrays.toString(arr); // Arrays类的toString()方法能将数组中的内容全部打印出来
System.out.print(str);
//输出:[4, 4, 4, 4, 4]
int[] arr = new int[5];//新建一个大小为5的数组
Arrays.fill(arr, 2,4,6);//给第2位(0开始)到第4位(不包括)赋值6
String str = Arrays.toString(arr); // Arrays类的toString()方法能将数组中的内容全部打印出来
System.out.print(str);
//输出:[0, 0, 6, 6, 0]