数组概述及特点
数组的定义:
数组是相同类型数据的有序集合。
数组的基本特点
1:其长度为确定的,数组一旦被创建,其大小便不可改变
2:其元素必须为相同类型。
3:数组中的元素可以是任何数据类型
4:数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的
创建数组和数组的初始化
声明数组的方法
type[] arr_name;(推荐使用这中方式)
type arr_name[];
例如://数组声明的几种方式 int arry[]; int[] arry1;
注意:
1:声明的时候并没有实例化任何对象,只有在实例化数组对象时,JVM才分配空间,这时才与长度有关。因此,声明数组时不能指定其长度(数组中元素的个数),例如:int a[5]; //非法
2:声明一个数组的时候并没有数组被真正的创建。
3:构造一个数组,必须指定长度。
构造数组的几种方式
1:type[] 变量名=newtype[数组中元素的个数];
int arry3[]=new int[4];
2:type 变量名[] =newtype[]{元素列表}
int arry4[]=new int[]{};
int arry5[]={};
int arry6[]={1,2};
数组的长度
Java中的每个数组都有一个名为length的属性,表示数组的长度。length属性是public final int的,即length是只读的。数组长度一旦确定,就不能改变大小。
范例代码
//length
System.out.println(array3.length);
for循环遍历数组
代码:
//for循环遍历数组
array2= new int[]{1, 2};
for (int i=0;i<array2.length;i++){
System.out.print(array2[i]+" ");
}
增强for循环遍历数组
代码:
//增强for循环遍历数组
for (int a:array2){
System.out.print(a+" ");
}
数组的比较
使用Arrays的equals方法
//使用Array.equals方法比较数组
array= new int[]{1, 2, 3};
System.out.println(Arrays.equals(array, array2));
数组的拷贝
//数组的拷贝,指定长度以及起始结束位置[0,3)
int[] a=Arrays.copyOfRange(array2,0,3);
System.out.println(Arrays.toString(a));
查找
二分法查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。二分查找法实质上是不断地将有序数据集进行对半分割,并检查每个分区的中间元素
public static int test(int[] array,int num){
int startIndex=0;
int endIndex=array.length-1;
int midIndex=(startIndex+endIndex)/2;
while (startIndex<endIndex){
if (num>array[midIndex]){
startIndex=midIndex+1;
midIndex=(startIndex+endIndex)/2;
System.out.println("起始位置右移"+"此时中间值为:"+midIndex);
}
if (num<array[midIndex]){
endIndex=midIndex-1;
midIndex=(startIndex+endIndex)/2;
System.out.println("起始位置左移"+"此时中间值为"+midIndex);
}
if (num == array[midIndex]){
num=array[midIndex];
startIndex=midIndex;
endIndex=midIndex;
System.out.println("结束时此时中间值为:"+midIndex);
}
}
return midIndex;
}
排序
冒泡排序
从位置0开始,当前位置数字和后面位置的数字进行比较如果前面的大于后面,数据交换将位置向后移动一位,重复第一个过程,直到最后一个重复刚才的过程
动图演示
public static void tset(int[] a){
int index=a.length-1;
for (int i=0;i<index;i++){
for (int j=index-i;j>0;j--){
for (int y=0;y<j;y++){
if (a[y]>a [y+1]){
int temp=a[y];
int temp1=a[y+1];
a[y]=temp1;
a[y+1]=temp;
}
}
}
}
}
选择排序
假设第一个数字就是最大数字,记录他的索引然后和后面的数字进行比较,如果后面的数字大于最大数字,重新记录新数字的索引直到最后一个数字,然后将最大数字索引与最后一个数字进行交换
动图演示
public static void test(int[] a){
for (int i=0;i<a.length-1;i++){
for (int j=0;j<a.length-i-1;j++){
if (a[j]>a[j+1]){
int temp=a[j];
int temp1=a[j+1];
a[j]=temp1;
}
}
}
}