2.8.1数组的定义
概念:同一种类型数据的集合。其实数组就是一个容器。
数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
格式1:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例:int[] arr = new int[5];5代表5个元素,arr[0],指的是数组第一个角标
格式2:
元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};
2.8.2数组的内存分配及特点
![](https://img.haomeiwen.com/i3647865/fcc7c4f1ef521789.png)
Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈内存: 用于存储局部变量,当数据使用完,所占空间会自动释放。
堆内存:
- 数组和对象,通过new建立的实例都存放在堆内存中。
- 每一个实体都有内存地址值
- 实体中的变量都有默认初始化值
4.实体不在被使用,会在不确定的时间内被垃圾回收器回收
方法区,本地方法区,寄存器
2.8.3数组操作常见问题
int[] arr1 = new int[3];
System.out.println(arr1[0]);//输出为0,如果是boolean默认初始化为false
int[] arr1 = new int[3];
System.out.println(arr1[4]);//提示:ArrayIndexOutOfBoundsException: 4(数组角标越界)
int[] arr1 = new int[3];
arr1 = null;//数组无只想的
System.out.println(arr1[1]);//提示:NullPointerException空指针异常,当引用没有任何只想值为null的情况,该引用还在用于操作实体。
2.8.4数组常见操作
操作数组获取数组中的元素,通常会用到遍历(for 循环)。
数组中有一个属性可以直接获取元素个数length//使用方式:数组名称.length
int[] arr1 = new int[]{1,5,2,7};
System.out.println("length="+arr1.length);//获取数组元素个数
for(int x = 0;x<arr1.length;x++)
{
System.out.println("arr["+x+"]="+arr1[x]+";");//输出数组各元素
}
//定义一个功能,用于打印数组中的元素,元素间用逗号隔开
public static void ArrayPrint(int[] arr)
{
System.out.print("[");
for(int x = 0;x<arr.length;x++)
{
if(x<arr.length-1)
{
System.out.print(arr[x]+",");
}else
{
System.out.println(arr[x]+"]");
}
}
}
获取数组中的最大值
public static int getMax(int[] arr)
{
int max = 0;//初始化数组中任意一个角标
for(int x = 1;x<arr.length;x++)
{
if(arr[x]>arr[max])
max = x;
}
return arr[max];
}
public static int getMax_2(int[] arr)
{
int max = arr[0];
for(int x = 1;x<arr.length; x++)
{
if(arr[x]>max)
max=arr[x];
}
return max;
}
数组选中排序
public static void ArraySort(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])
{
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
}
//冒泡排序:就是相邻两个数之间的比较
public static void ArraySort(int[] arr)
{
for(int x = 0;x<arr.length-1;x++)
{
for(int y = 0;y<arr.length-x-1;y++)//-x:是让每一次比较的元素减少,-1是避免角标越界
{
if(arr[y]>arr[y+1])
{
int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;
}
}
}
}
数组的查找操作
public static void getIndex(int[] arr,int key)
{
for(int x = 0;x<arr.length;x++)
{
if(arr[x]==key)
return x;
}
return -1;
}
//定功能,获取key第一次出现在数组种的位置,如果返回-1,那么代表key在数组种不存在
折半查找可以提高,但是必须要保证该数组是有序的数组。
方法1:arr[mid] !=key
public static int halfSearch(int[] arr,int key)
{
int min,max,mid;
min = 0;
max = arr.length-1;
mid = (min+max)/2;
while(arr[mid] !=key)
{
if(key>arr[mid])
min = mid+1;
else if (key<arr[mid])
max = mid-1;
if(min>max)
return -1;
mid = (min+max)/2;
}
return mid;
}
方法2:min<=max
public static int halfSearch_2(int[] arr,int key)
{
int min=0,max = arr.length-1,mid;
while(min<=max)
{
mid = (max+min)/2;
if(key>arr[mid])
min = mid+1;
else if(key<arr[mid])
max = mid-1;
else
return mid;
}
return -1;
}
练习:有一个有序的数组,想要将一个元素插入到该数组中,还要保证数组是有序的。
通过折半形式查找在这个数组中的位置,如果存在就把这个数插入,如果不存在就返回数组最小角标的值
public static int halfSearch_2(int[] arr,int key)
{
int min=0,max = arr.length-1,mid;
while(min<=max)
{
mid = (max+min)/2;
if(key>arr[mid])
min = mid+1;
else if(key<arr[mid])
max = mid-1;
else
return mid;
}
return min;
}
进制转换:十进制转换成二进制
public static void toBin(int num)//直接输出所以返回值是void
{
StringBuffer sb = new StringBuffer();
while(num>0)
{
sb.append(num%2);
num = num/2;
}
System.out.println(sb.reverse());
}
十进制转成成十六进制
public static void toHex(int num)
{
StringBuffer sb = new StringBuffer();
for(int x = 0;x <8;x++)
{
int temp = num & 15;
if(temp>9)
{
sb.append((char)(temp-10+'A'));
}else{
sb.append(temp);
}
num = num >>>4;
}
System.out.println(sb.reverse());
}
十进制转16进制优化
public static void toHex(int num)
{
//查表发:将所有的元素临时存储起来,建立对应关系
char[] chs={'0','1','2','3',
'4','5','6','7',
'8','9','A','B',
'C','D','E','F'};
//定义一个临时容器
char[] arr = new char[8];//十六进制最多8个字符
int pos = arr.length;//定义一个操作数组的指针
while (num!=0)
{
int temp = num&15;
arr[--pos]=chs[temp];
num = num>>>4;
}
{
进制转换优化
public static void toBin(int num)
{
trans(num,1,1);
}
/*
十进制转八进制
*/
public static void toBa(int num)
{
trans(num,7,3);
}
/*
十进制转十六进制
*/
public static void toHex(int num)
{
trans(num,15,4);
}
public static void trans(int num,int base,int offset)
{
if(num==0)
{
System.out.println(0);
return;
}
char[] chs={'0','1','2','3',
'4','5','6','7',
'8','9','A','B',
'C','D','E','F'};
//定义一个临时容器
char[] arr = new char[32];
//定义一个指针
int pos = arr.length;
while (num!=0)
{
int temp = num & base;
arr[--pos]=chs[temp];
num = num>>>offset;
}
for(int x =pos;x<arr.length;x++)
{
System.out.print(arr[x]+",");
}
}
2.8.5数组中的数组
二维数组[][] 格式1:int[][] arr = new int[3][2];
1.定义了名称为arr的二维数组
2.二维数组中有3个一维数组
3.每一个一维数组中有2个元素
4.一维数组的名称分别为arr[0], arr[1], arr[2]
5.给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;
格式2:int[][] arr = new int[3][];
1.二维数组中有3个一维数组
2.每个一维数组都是默认初始化值null
3.可以对这个三个一维数组分别进行初始化 arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];
格式3:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};
1.定义一个名称为arr的二维数组
2.二维数组中的有三个一维数组
3.每一个一维数组中具体元素也都已初始化
a,第一个一维数组arr[0] = {3,8,2};
b,第二个一维数组arr[1] = {2,7};
c,第三个一维数组arr[2] = {9,0,1,6};
4.第三个一维数组的长度表示方式:arr[2].length; 。 注意特殊写法情况:int[] x,y[]; x是一维数组(int[] x)y是二维数组[int[]y[]]
练习:获取arr数组中所有元素的和。使用for的嵌套循环即可
int[][] arr = {{2,41,15,6},{1,81,7,16},{13,9,5,12}};
int sum = 0;
for(int x=0;x<arr.length;x++)
{
for(int y=0;y<arr[x].length;y++)
{
sum = sum + arr[x][y];
}
}
System.out.println("sum="+sum);
网友评论