一、概念
同一种类型数据的集合。简单的来说就是一容器,用来装东西的。
使用数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
内存结构中的五个空间: 栈内存,堆内存,方法区,本地方法区,寄存器
栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放
堆内存:数组和对象,通过new建立的实例(实体)都存放在堆内存中
每一个实体都有内存地址值
实体中的变量都有默认初始化值
实体不在被使用,会在不确定的时间内被垃圾回收器回收
各个区的处理方法不同
二、一维数组的格式
数组是一种单独的数据类型! 属于 引用类型!
格式1:
int [] arr = new int [3];
int arr[] = new int[3];
格式2:
如: int [] arr = new int []{1,2,3,4,5};
简写的静态初始化格式 int [] arr = {1,2,3,4,5};
其中:new是用来在堆内存中产生一个容器实体。
三、数组操作常见问题
(1)、数组脚标越界异常(ArrayIndexOutOfBoundsException)。
int[] arr = new int[5];
System.out.println(arr[8]);
访问到了数组中的不存在的脚标时发生。
(2)、空指针异常(NullPointerException)。
int[] arr = null;
System.out.println(arr[0]);
arr引用没有指向实体,却在操作实体中的元素时。
遍历数组
int[] arr=new int[3];
for(int x=0; x<3; x++)
{
System.out.printIn(arr[x]);
}
练习题:1) 给定一个数组,获取数组中的最大值,以及最小值
练习题2)两种数组排序方法:选择排序和冒泡排序
先看一下思路:
/**
要求:分别使用选择排序和冒泡排序对一个数组进行排序并打印
*/
class Sort
{
public static void main(String[] args)
{
int[] arr1= {9,8,7,4,56,3,2,44};
int[] arr2= {9,8,7,4,56,3,2,44};
swap1(arr1[0],arr1[1]);
//selectSort(arr1); //调用排序方法
//bubbleSort(arr2); //调用冒泡排序方法
for(int x = 0;x < arr1.length;x++)
{
// System.out.print(arr1[x]+",");
}
System.out.print("\n");
for(int x = 0;x < arr2.length;x++)
{
System.out.print(arr2[x]+",");
}
}
/*
选择排序
1、先用0角标上的元素依次与其他元素进行比较,将较小值元素存放到0角标。
2、然后再拿1角标上的元素依次进行比较,以此类推。
*/
public static void selectSort(int[] arr)
{
//外循环遍历数组
for (int x=0;x<arr.length-1;x++)
{
//内循环比较大小
for (int y=x+1;y<arr.length;y++)
{
//如果后一个元素比拿去比较的元素大,就交换两元素位置
if(arr[x]>arr[y])
{
//arr[x]=arr[y];
//arr[y]=temp;
swap(arr,x,y);
}
}
}
}
/*
冒泡排序
1、先从头角标相邻两个元素之间进行比较,将较大值存放在后一个元素中,然后再与后一个元素的进行比较,直至最大值存放到最后一个元素中。
2、再重复1操作,每次计较次数减一,一圈比完后存放的较大元素不再参与比较。
*/
public static void bubbleSort(int[] arr)
{
System.out.print("swap1");
for (int x=0;x<arr.length-1;x++)
{
for (int y=0;y<arr.length-1-x;y++)//-x:让没每一次比较的元素减少。-1:避免角标越界。
{
if(arr[y]>arr[y+1])
//swap(arr,y,y+1);
swap1(arr[y],arr[y+1]);
}
}
}
//互换方法
public static void swap(int[] arr,int x,int y)
{
int temp;
temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
public static void swap1(int x,int y)
{
// int temp;
int temp=x;
x=y;
y=temp;
System.out.print("x="+x+";"+"y="+y);
}
}
注意: 选择排序:是从左往右,从小往大排
冒泡排序:是从右往左,小大往小排
练习题:十进制转二进制 及十进制转十六进制
class hex
{
public static void main(String[] args)
{
//十进制转换为二进制
int num=10;
StringBuffer sbBin = new StringBuffer();
StringBuffer sbHex = new StringBuffer();
while(num>0)
{
sbBin.append(num%2);
num=num/2;
}
System.out.println(sbBin.reverse());
//System.out.printIn(sbBin.reverse());
//十进制转换为十六进制
num=60;dd
for(int x=0;x<8;x++)
{
int temp=num&15;
if(temp>9)
sbHex.append((char)(temp-10+'a'));
else
sbHex.append(temp);
num=num>>>4;
}
System.out.println(sbHex.reverse());
}
}
练习题: 用查表法将十进制转换成十六进制和二进制!
四、数组中的数组(多维数组)
格式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][];
注:此种格式中每一个一维数组都是默认初始化值null。int[][] arr= new int[3][] 中arr[0],arr[1],arr[2]的值都null
当int arr[0]=new int[3] ; 时 arr[0]保存的是 int[3]的内存地址,如上图所示
格式3:int[ ][ ] arr = {{3,8,2},{2,7},{9,0,1,6}};//每一个一维数组中具体元素都初始化了。
注:一种特殊定义写法:int[ ]x,y[ ]; x是一维数组,y是二维数组。
一维数组的定义方式: int[ ] x; int x[ ];
二维数组的定义方式: int[ ][ ] y; int y[ ][ ]; int[ ] y[ ];