Java入门(六)——数组
目录
语法格式
int[] a;
double b={10.0,20.0}; //静态初始化一堆数组
String[] s=new String[6]; //动态初始化一堆数据,静态初始化数组长度
int[] a[]; //(二维数组)
int[][] a={{1,2},{1}.{1,2,3}};
new int[]{1,2,3,4} //直接传递一个静态数组
- 引用数据类型,父类object
- 数组是一个数据的集合,可以存储“基本数据类型”或者“引用数据类型”
- 数组对象是堆内存当中,若是存储“java对象”,实际是对象的引用
- 数组一旦建立,长度不可变,类型固定统一,元素内存地址连续,占用空间大小一样
- 可分为一维数组、二维数组、多维数组
- 自带length属性,获取数组中的长度
- 优点:查找、查询、检索某个下标上的元素时效率极高
* 缺点:
- 在数组上随机删除或者增加元素,效率低,会涉及后面元素统一向前或者向后位移的操作
- 不能存储大数据,因为难以在内存空间上找到一块特别大的连续的内存空间
- 可以使用多态,eg:Animal an={new Cat(),new Bird()}
- 扩容:将内容拷贝到另一个新建的大数组中,对象的拷贝实际是对象地址的拷贝
数组常见算法
(这里涉及到太多知识点吗,没有展开细致讲)
* 冒泡算法:
- 冒泡排序算法(从第一个开始比较,从小到大依次排列)
- 选择排序算法(先找出最小的,比较前一位的值,从小到大依次排列)
* 查找算法:
- 二分法查找(在已排列好的数组中,将数据对半分,直到找到想要找到的值为中间值)
- 算法在java中已经分装好了,只要调用方法就可以(java.util.Arrays)【静态方法,直接使用类名调用】
范例代码
import java.util.Arrays;
import java.util.Scanner;
public class Array {
public static void main(String[] args) {
//“String[] args”:JVM调用main方法的时候,会直接传一个String数组,默认长度为0
//这个数组是为了留给用户在控制台上输入参数,通过空格的方式进行分离,自动放在“String[] args”
arrPrint();
arrAlogorithm();
int i=arrAlogorithm2();
System.out.println("位置在:"+i);
}
public static void arrPrint() {
int i=10;
System.out.println("基本数据类型i:"+i);
int[] a= {1,2,3,4,5,6,7,8,9,0};
System.out.println("\n引用数据类型--数组:");
for(int l=0;l<a.length;l++) {
int num=l+1;
System.out.println("第"+num+"个数据:"+a[l]);
}
Num[] n= {new Num(),new Num(),new Num()};
System.out.println("\njava对象:");
for(int l=0;l<n.length;l++) {
System.out.println("数组地址"+n[l]);//对象的引用地址
n[l].print();
}
int[] s=new int[20];
System.out.println("\n数组拷贝:");
System.arraycopy(a, 0, s, 0, a.length);//拷贝:拷贝对象,起始位置,拷贝目标,起始地址,拷贝长度
System.arraycopy(a, 0, s, 10, a.length);
for(int l=0;l<s.length;l++) {
int num=l+1;
System.out.println("第"+num+"个数据:"+s[l]);
}
}
public static void arrAlogorithm() {
int[] arr1= {3,1,5,8,7,6,0};
//冒泡排序
for(int i=arr1.length-1;i>0;i--) {//7条数据,外循环6次
for(int j=0;j<i;j++) {//数据依次比较,之前比较的结果不再参与比较
if(arr1[j]>arr1[j+1]) {//比较,对换
int temp;
temp =arr1[j];
arr1[j]=arr1[j+1];
arr1[j+1]=temp;
}
}
}
p("冒泡排序",arr1);
int[] arr2= {3,1,5,8,7,6,0};
//选择排序
for(int i=0;i<arr2.length-1;i++) {//7条数据,外循环6次
int min=i;//假设最小值是数组第一个值
for(int j=i+1;j<arr2.length;j++) {//对除第一个的值进行比较
if(arr2[j]<arr2[min]) {//比较,最小值判断更改
min=j;
}
}
if(min!=i) {//若最小值更改,则进行对换
int temp;
temp=arr2[min];
arr2[min]=arr2[i];
arr2[i]=temp;
}
}
p("选择排序",arr2);
}
public static int arrAlogorithm2() {
//二分法
int[] arr= {1,2,3,4,5,6,7,8,9};
Scanner a=new Scanner(System.in);
System.out.println("请输入要寻找的数值:");
int dest=a.nextInt();
int begin=0;//开始下标
int end=arr.length-1;//结束下标
while(begin<=end) {//如果开始下标始终小于结束下标,循环继续
int mid=(begin+end)/2;//对半
if(arr[mid]==dest) {//如果寻找的值在中间,直接输出结果
return mid;
}
else if(arr[mid]<dest) {//如果中间值小于目标值,向后半段继续对半寻找
begin=mid+1;
}
else{//如果中间值大于目标值,向前半段继续对半寻找
end=mid-1;
}
}
return -1;
}
public static void p(String name,int[] arr) {
System.out.println(name+":");
for(int l=0;l<arr.length;l++) {
System.out.print(arr[l]+" ");
}
System.out.println("\n");
}
}
class Num{
static int i=10;
public static void print() {
System.out.println("这里是对象"+i);
}
}