java数组编译后_java 数组详解

数组

概念:数组是一个定长的容器,数组中存储的数据类型需要是一致的

数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。

数组的四种定义方式:

数据类型是数组中元素的数据类型

数组是有默认值的{0,0,0,0,0,0,0,0,0,0,}

int数据类型是数组中元素的数据类型

数组的数据类型是 int[]

元素 --> 数组中储存的值

数组的长度 --> 数组中的元素个数

//数据类型[] 数组名 = new 数据类型[数组中元素的个数]

int[] array = new int[10];

2.先声明数组,然后再进行赋值

//在类中,定义成员变量,方法传递

int[] array2;

array2= new int[10];

3.创建数组的同时,给定当前数组中储存元素的值

//数组的长度:后面{}中储存多少个值,数组就有多长

int[] array3 = new int[]{1,2,3,4}

4.第3的简化版本

int[] array4 = {1,2,3,4}

数组的概念

同一种类型数据的集合。其实数组就是一个容器。运算的时候有很多数据参与运算,那么首先需要做的是什么.不是如何运算而是如何保存这些数据以便于后期的运算,那么数组就是一种用于存储数据的方式,能存数据的地方我们称之为容器,容器里装的东西就是数组的元素, 数组可以装任意类型的数据,虽然可以装任意类型的数据,但是定义好的数组只能装一种元素, 也就是数组一旦定义,那么里边存储的数据类型也就确定了。

数组的内存分析

53ab9c3772ebfcc97938bfb59ad7b703.png

43707bd566224c957155609b19caa8ff.png

cb1e2030a548a0541aa79f80b7ef434f.png

数组声明后实际上是在栈内存中保存了此数组的名称,接下来便是要在堆内存中配置数组所需的内存,其中“元素的个数”(数组的长度)是告诉编译器,所声明的数组要存放多少个元素,而“new”则是命令编译器根据括号里的长度开辟空间。

二维数组:

Arrays的使用

遍历: toString()    将数组的元素以字符串的形式返回

排序: sort()        将数组按照升序排列

int[] arr = {23,64,2,37,43,67,1};

Arrays.sort(arr);//升序

for(int i=0;i

System.out.println(arr[i]);

}

查找: binarySearch()在指定数组中查找指定元素,返回元素的索引,如果没有找到返回(-插入点-1) 注意:使用查找的功能的时候,数组一定要先排序。

31ba129e9b81784afcb9b04b5bff9f80.png

二维数组:实质就是存储是一维数组。

数组定义:

数组类型[][] 数组名 = new 数组类型[一维数组的个数][每一个一维数组中元素的个数];

71ff577925144728800336a0b2794096.png

数组排序:

数组排序有很多中:冒泡 ,选择,插入,快速,堆等等

* 速度最快的就是 堆 排序

冒泡排序 ( 两两相比 )

是相邻的两个数组元素进行比较

若当前元素大于后面的元素,交换两个元素的位置

若当前元素不大于后面的元素,就不交换

比较所有相邻的元素,最终的到一个有序的结果

冒泡最大的特点就是会先找出最大的值,然后放到数组的最后一位

升序(从小到大),降序(从大小) --> 默认排序都是升序

只要经过一轮排序,肯定会有一个数放到正确的位置上

3,7,4,6,9,1 --> 存储到数组中是无序,通过冒泡排序,数组升序排列

3,4,6,7,1,9 -- > 9

3,4,6,1,7,9 --> 7,9

3,4,1,6,7,9 --> 6,7,9

3,1,4,6,7,9 --> 4,6,7,9

1,3,4,6,7,9 --> 1,3,4,6,7,9

for(int i = 0 ; i < array.length - 1 ; i++){for(int j = 0 ; j < array.length -1 -i ; j++){if(array[j] > array[j + 1]){int tmp =array[j];

array[j]= array[j+1];

array[j+ 1] =tmp;

}

}

选择排序 ( 固定一位一次向后比 )

升序(从小到大),降序(从大小) --> 默认排序都是升序

固定一个元素,依次和后面的元素进行比较

若当前元素大于后面的元素,交换

若当前元素不大于后面的元素,不交换

每次比较完成们都会有一个数放到正确的位置上,小的那个数

3,7,4,6,9,1 --> 存储到数组中是无序,通过冒泡排序,数组升序排列

1,7,4,6,9,3 --> 1

1,3,7,6,9,4 --> 1,3

1,3,4,7,9,6 --> 1,3,4

1,3,4,6,9,7 --> 1,3,4,6

1,3,4,6,7,9 --> 1,3,4,6,7,9

for(int i = 0 ; i < array.length ; i++){for(int j = i+1 ; j < array.length ;j++){if(array[i] >array[j]){int tmp =array[i];

array[i]=array[j];

array[j]=tmp;

}

}

}

数组的复制

int[] a = {10,20,30,40,50};//数组的扩容(创建了新的数组并将源数组的数据复制过去了)

a = Arrays.copyOf(a,a.length+1); //for(int i=0;i

System.out.println(a[i]); //10 20 30 40 50 0

}

int[] a = {10,20,30,40,50};//a:源数组//a1:目标数组//6:目标数组的长度(多则补默认值,少则截取)

int[] a1 = Arrays.copyOf(a,6); //灵活性差

for(int i=0;i

System.out.println(a1[i]); //10 20 30 40 50 0

}

int[] a = {10,20,30,40,50};int[] a1 = new int[6]; //0,0,0,0,0,0//a:源数组//1:源数组的起始下标//a1:目标数组//0:目标数组的起始下标//4:要复制的元素个数

System.arraycopy(a,1,a1,0,4); //灵活性好

for(int i=0;i

System.out.println(a1[i]); //20 30 40 50 0 0

}

操作数组的工具类:Arrays

java.util.Arrays类包含了用来操作数组(比如排序和搜索)的各种方法,它提供的所有这些方法都是静态的。

Arrays拥有一组static方法:

public static int binarySearch(Object[] a, Object key)

用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。

public static boolean equals(long[] a, long[] a2)

如果两个指定的 long 型数组彼此相等,则返回 true。如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对都是相等的,则认为这两个数组是相等的。换句话说,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。

public static void fill(int[] a, int val)

将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。

public static void sort(Object[] a)

对指定对象数组根据其元素的自然顺序进行升序排列。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。

public classTest {public static voidmain(String[] args) {int array[] = { 2, 5, 8, 3, 1, 4, 9, 6, 7 }; //声明一个整型数组

System.out.println("Object的toString:"array.toString()); //Object的toString()方法

Arrays.sort(array); //数组排序

System.out.println("排序后的数组:" +Arrays.toString(array)) ;int point = Arrays.binarySearch(array, 3) ; //检索数据位置

System.out.println("元素‘3’的位置在:" +point) ;

Arrays.fill(array,6) ; //填充数组

System.out.print("数组填充:" +Arrays.toString(array)) ;

}

}

执行结果

Object的toString:[I@7852e922

排序后的数组: [1, 2, 3, 4, 5, 6, 7, 8, 9]

元素‘3’的位置在:2数组填充:[6, 6, 6, 6, 6, 6, 6, 6, 6]

数组的基本操作

线性查找(顺序查找)

从数组中的第一个元素开始,依次向后查找,直到找当前要查找的值

要么是找到了,要么就是没有找到

//顺序查找

for (int i = 0; i < array.length; i++) {if(n ==array[i]){return i; //需要范围找到的下标,系统API

}

}return -1; //返回一个负数

return i; //需要范围找到的下标,系统API

}

}return -1; //返回一个负数

折半查找(二分查找) 先排序

一定是一个有序的数组,通过待查找的数和数组中间索引值进行比较

大于: 待查找值大于中间索引值,就需要向数组的右半边进行查找

等于:待查找值等于中间索引值,就是找到了

小于:待查找值下于中间索引值,就需要向数组的左半边进行查找

//定义开始值

int beginIndex = 0;//定义结束值

int endIndex = array.length-1;//获取中间值

int middleIndex = (beginIndex+endIndex)/2;//进行比较 用中间值来比较要查找的值//第一种比较的次数应该是数组的长度//第二中死循环

while(true){//缩小范围

if(n >array[middleIndex]){//修改开始值

beginIndex = middleIndex+1;

}else if(n

endIndex = middleIndex -1;

}else{returnmiddleIndex;

}//无论是开始值还是结束中发生了改变//就要重新结算中间值

middleIndex = (beginIndex+endIndex)/2;//若出现了一种情况 开始 > 结束

if(beginIndex >endIndex){return -1;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值