1.1 数组的定义:
方式一:
- 格式:数组存储的数据类型【】数组名字=new 数组存储的数据类型【长度】;
- 数组存储的数据类型:创建的数组容器可以存储什么数据类型。
- 【】:表示数组。
- 数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组。
- new:关键字。
- 数组存储的数据类型:创建的数组容器可以存储什么数据类型。
- 【长度】:数组的长度,表示数组容器中可以存储多少个元素。
- 注意:数组有定长的特性,长度一旦指定,不可更改。
- 例如:int [] arr=new int[5];
方式二:
- 格式:数据类型 【】 数组名=new 数据类型【】{元素1,元素2,元素3...};
- 注意:给定了具体的元素就不能给定长度。
- 例如:int [] arr=new int{23,4,54,324,2};
方式三:
- 格式:数据类型 【】 数组名={元素1,元素2,元素3...};
- 例如:int [] arr={12,34,5446,5,45};
1.2 数组的访问:
- 直接输出数组名,显示的是数组的地址,如下面示例代码中[I@50cbc42f
- 索引:每一个存储到数组的元素,都会自动拥有一个编号,从0开始,这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。
- 通过索引访问数组中的元素:
- 数组名【索引】,获取出数组中的元素
- 数组名【索引】=数组,为数组中的元素赋值。
- 定义一个空数组,动态初始化创建的数组,java会有默认值
int[]的默认值是0,double[]默认值是0.0,boolean[]的默认值是false
int [] arr2=new int[4];
System.out.println(arr2[0]);//0
double[] arr3=new double[4];
System.out.println(arr3[0]);//0.0
boolean[] arr4=new boolean[4];
System.out.println(arr4[0]);//false- 数组的长度属性:每个数组都具有长度,而且是固定的,获取数组的长度格式:数组名.length,数组的最大索引值为:数组名.length-1
public class ArrayDemo {
public static void main(String[] args) {
//定义数组
int [] arr = {10,20,30,40};
//直接输出数组
System.out.println(arr);//[I@50cbc42f
//通过索引获取数组元素
System.out.println(arr[0]);//10
System.out.println(arr[1]);//20
System.out.println(arr[2]);//30
System.out.println(arr[3]);//40
System.out.println("------------");
//通过索引修改数组元素
arr[2]=100;
System.out.println(arr[0]);//10
System.out.println(arr[1]);//20
System.out.println(arr[2]);//100
System.out.println(arr[3]);//40
System.out.println("--------------");
/*
定义一个空数组,动态初始化创建的数组,java会有默认值
int[]的默认值是0,double[]默认值是0.0,boolean[]的默认值是false
*/
int [] arr2=new int[4];
System.out.println(arr2[0]);//0
double[] arr3=new double[4];
System.out.println(arr3[0]);//0.0
boolean[] arr4=new boolean[4];
System.out.println(arr4[0]);//false
}
}
2.1 数组原理内存图-内存概述:
- 内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。
- java虚拟机要运行程序,必须要对内存进行空间分配和管理。
2.2 java 虚拟机的内存划分:
- JVM的内存划分
- 方法栈:方法运行时 使用的内存,比如main方法运行,进入方法栈中执行。(即方法进栈执行)
- 堆内存:存储对象或者数组,new来创建的,都存储在堆内存。(看到new就想到存储在堆内存中)
- 方法区:存储可以运行的class文件。
- 本地方法栈:JVM在使用操作系统功能的时候使用,和我们开发无关。
- 寄存器:给CPU使用,和我们开发无关。
3.1 数组作为方法参数
- 数组作为方法参数传递,传递的参数是数组内存的地址值。
public class ArrayDemo01 {
public static void main(String[] args) {
int [] arr=new int[]{11,22,33,44,55};
System.out.println("arr="+arr);//arr=[I@58ceff1
printArray(arr);//arr=[I@58ceff1传递的是地址值
}
/*
定义方法,用于打印int类型数组中的内容
返回值类型:打印完了就可以了,不需要返回值,void
参数列表:打印哪个数组不确定,作为参数列表
输出作为参数,实际传递的是地址值
*/
public static void printArray(int[] a){
System.out.println("a="+a);//a=[I@58ceff1
//遍历数组
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
}
3.2 数组作为方法返回值
- 数组作为方法的返回值,返回的是数组的内存地址
public class ArrayDemo02 {
public static void main(String[] args) {
int[] a=getArray();
System.out.println("a="+a);//a=[I@58ceff1
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
/*
数组可以作为返回值类型
*/
public static int[] getArray(){
int[] arr=new int[]{11,22,33,44,55};
System.out.println("arr="+arr);//arr=[I@58ceff1
return arr;
}
}
- 打印一副扑克
/*
打印一副扑克牌
代码实现,效果如图所示:
黑桃A 黑桃2 黑桃3 黑桃4 黑桃5 黑桃6 黑桃7 黑桃8 黑桃9 黑桃10 黑桃J 黑桃Q 黑桃K
红桃A
梅花A
方片A
使用两个字符串组,分别保存花色和点数
*/
public class Demo09 {
public static void main(String[] args) {
//定义字符串数组,保存花色和点数
String [] hs={"黑桃","红桃","梅花","方片"};
//定义数组存放点数
String [] ds={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
//外循环遍历花色数组
for (int hsIndex = 0; hsIndex < hs.length; hsIndex++) {
//内循环遍历点数
for (int dsIndex = 0; dsIndex < ds.length; dsIndex++) {
System.out.print(hs[hsIndex]+ds[dsIndex]+" ");
}
System.out.println();
}
}
}
- 定义方法比较两个数组是否完全一致
/*
定义equals方法,比较2个数组内容是否完全一致。
代码实现,效果如图所示:
[1,2,3,4,3,2,1]
[1,2,3,4,3,2,1]
是否一致:true
开发提示:
长度一致,内容一致,就认为是完全一致。
*/
public class Demo07 {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3, 4, 3, 2, 1};
int[] arr2 = {1, 2, 3, 4, 3, 2, 1};
System.out.println("是否一致:"+equal(arr1,arr2));
}
/*
返回值类型:boolean
参数列表:int [] arr1,int [] arr2
*/
//定义equals方法,参数列表为:(int[]?arr1,?int[]?arr2),?
// 返回值类型为:boolean,equals方法 的功能是比较arr1数组和arr2数组内容是否一致.
public static boolean equal(int[] arr1, int[] arr2) {
//在equals方法中判断arr1和arr2的长度是否相等,如果不相等返回false
if (arr1.length != arr2.length) {
return false;
}
//在equals方法中遍历arr1数组,判断arr1和arr2的每个元素是否相等.如果不相等返回false
for (int i = 0; i < arr1.length; i++) {
if(arr1[i] != arr2[i]){
return false;
}
}
return true;
}
}
- 评委给选手打分求平均值
/*
有一个编程比赛,有5个评委给选手打分,取消最高分和最低分后的平均分就是这个选手的最后得分,这个评委的评分为:
{99,100,98,97,96};
分析:
1.5个评委的评分使用数组保存起来,方便操作。
2.找到最高分,找到最低分
3.计算总分
4.有效总分=总分-最高分-最低分
5.计算平均分=有效总分/人数
*/
public class Test0403 {
public static void main(String[] args) {
int [] arr={99,100,97,96};
int max=arr[0];
int min=arr[0];
for (int i = 0; i < arr.length; i++) {
if(arr[i]>max){
max = arr[i];
}else if(arr[i]<min){
min=arr[i];
}
}
System.out.println("max="+max);
System.out.println("min="+min);
int sum=0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
System.out.println("sum="+sum);
int sum1=sum-max-min;
int avg=sum1/(arr.length-2);
System.out.println("平均值是:"+avg);
}
}
- 数组反转
/*
数组反转:数组中的元素颠倒顺序,例如原始数组为1,2,3,4,5,反转后的数组为5,4,3,2,1
实现思想:数组最远端的元素互换位置。
实现反转,就需要将数组最远端元素位置交换
定义两个变量,保存数组的最小索引和最大索引
两个索引上的元素交换位置
最小索引++,最大索引--,再次交换位置
最小索引超过了最大索引,数组反转操作结束
*/
public class Prepare09 {
public static void main(String[] args) {
//定义变量记录小索引:start=0
//定义变量记录大索引:end=arr.length-1
//循环终止条件:start<end才需要交换位置
int []arr={11,22,33,44,55};
for(int start=0,end=arr.length-1;start<end;start++,end--){
//循环交换位置,利用第三方变量
int temp=arr[start];
arr[start]=arr[end];
arr[end]=temp;
}
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}