今天来学习数组,这是我个人学习中首次接触到的引用数据类型。
数组和之前学习过数据类型的不太一样,最大的区别就是,当我们定义一个变量,如int x=3;,这个x是在栈内在中开出一个空间,来存储x的值;当我们定义一个数组时,如int[] x=new int[5];, 这样会在栈内存中开辟一个名为x的空间,但其中的数据并不是之前定义的数组中的数据,而是一个“[I@c17164”这样的一个内存地址,用来指向在堆内存中建立的数组空间,与其中的数据相对应。
堆内存和栈内存的区别应该是在于
首先来学习下数组定义的方法
int[] arr= new int[2];
int arr[]= new int[2]; //[]中为数组的长度,这两种定义方法没有区别;
arr[0]=98; //[]中的数字代表数组中的角标,角标从0开始;
arr[1]=99;
int[]arr = {3,12,34,5,2,64,55,43,645,437,34,45};//{}中为数组中具体元素;
因为数组是在程序运行时才建立的,所以如果你操作数组时,访问到的数组角标不存在时,在编译时是不会报错的,只有在运行时才会出现报错,报错如下:
java.lang.ArrayIndexOutOfBoundsException: 3 后面的数字是错误的角标。
数组中有一个可以直接获取数组中元素个数的属性.length,如果你需要知道一个数组中的元素个数,只需要通过数组名.length来直接获取即可。
下面进行下数组中极常用到的遍历操作:
class ArrDemo1
{
public static void main(String[] args)
{
int[] arr = {3,5,32};
System.out.println("length="+arr.length);
for (int x=0;x<arr.length ;x++ )
{
System.out.println("arr["+x+"]"+"="+arr[x]+";");
}
}
}
上面的代码就是最基本的一个遍历操作,打印了数组中的所有元素。
遍历无非是之前循环语句的一个应用,接下来对于练习下遍历的实际应用。
定义一个功能,获取数组中的最大值(最小值).
class GetMax
{
//获取一个数组中的最大值并打印
public static void main(String[] args)
{
int[] arr={3,9,12,4,15};
System.out.println(getmin(arr));
}
public static int getmax(int[] arr)
{
int max=arr[0];
for (int x=1;x<arr.length ;x++ )
{
if (max<arr[x])
{
max=arr[x];
}
//以数组中的元素进行比较
}
return max;
}
public static int getmin(int [] arr)
{
int min=0;
for (int x=1;x<arr.length ;x++ )
{
if (arr[x]<arr[min])
{
min=x;
}
}
return arr[min];
//以角标位置来比较
}
}
上面分别用以数组中的元素和角标进行了最大值的和最小值的比较,区别不大。
下面进行下排序问题的练习。
定义一个功能,使一个无序数组按升序(降序)排列。
class ArrDemo0
{
public static void main(String[] args)
{
int[] arr={6,8,4,21,3,2,7};
printarr(arr);
selectsort1(arr);
printarr(arr);
selectsort2(arr);
printarr(arr);
}
//升序排列——选择排序
public static void selectsort1(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 selectsort2(int[] arr)
{for (int x=0;x<arr.length-1 ;x++ )
{
for (int y=0;y<arr.length-x-1 ;y++ )
{
if(arr[y]<arr[y+1])
{
int temp = arr[y];
arr[y]=arr[y+1];
arr[y+1]=temp;
}
}
}}
//打印数组
public static void printarr(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.print(arr[x]);
}
System.out.println("]");
}
}
从视频中可以知道,java中是有数组排序的功能的,需要在代码中写入import java.util.*;,然后在类中使用排序功能Arrays.sort(数组名);
§数组中的查找操作
class Arrtest
{
public static void main(String[] args)
{
int[] jhw={-8,5,0,4,17};
int index = getIndex(jhw,4);
System.out.println(index);
}
public static int getIndex(int [] arr,int key)
{
for (int x=0;x<arr.length ;x++ )
{
if (arr[x]==key)
return x;
}
return -1;
}
}
/*此段代码可以查找到对应数组中的角标,若数组中的多个元素与查找元素匹配,则只查找第一个匹配元素的角标*/
u 折半查找
class Arrtest2
{
public static void main(String [] args)
{
int[] arr={-3,7,12,21,43,51,55,64,99};
int index = HalfSearch(arr,43);
System.out.println(index);
}
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;
mid = (max+min)/2;
}
return mid;
}
}
/*这种查找方法通过不断折半判断来查找对应角标位置,这种方法需运用在有序数组中。*/