JAVA学习——数组
---------------------- android培训、java培训、期待与您交流! ----------------------数组是用来存储同一类型数据的集合,她其实是一个容器。与其他容器相比她自动给包含其中的元素从0开始编号。
一、数组的内存结构
计算机中的内存分为“栈”和“堆”。“栈”中存储的是基本数据类型变量和变量的引用,当“栈”中的变量和引用超出自身的作用域时会自动被清理出“栈”。“堆”用于存放JAVA中所有的对象,当对象不再被使用时就会被“堆”认为是“垃圾”,产生的“垃圾”会被JAVA具有的垃圾回收机制所回收。
数组的定义格式:1、元素类型 [] =new 元素类型[元素个数];2、元素类型 [] = new 元素类型[]{元素,元素·····};例如:int [] arr = new int [5];该条语句的意思是指定义了一个容纳5个int 类型元素的数组,其中arr为数组名,它是一个数组类型的引用变量,它的值为对应定义的数组在“堆”中的首地址。由于“堆”中的元素具有默认值所以该条语句定义的数组所包含的所有元素默认值为int类型的默认值0。定义的数组在编译期间不分配内存空间,只有在运行期间才分配内存空间。
下面是我做的一个实例来说明上图
public class ArrayTest {
public static void main(String[] args){
int[] arr = new int[5];
int[] arr_1 = arr;
int[] arr_2 = new int[5];
System.out.println("arr:");
for (int i = 0; i < arr.length; i++) {
arr[i]=i;
}
printArray(arr);
System.out.println("arr_1:");
printArray(arr_1);
System.out.println("arr_2:");
printArray(arr_2);
}
public static void printArray(int []arr){
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i!=arr.length-1) {
System.out.print(arr[i]+",");
}else {
System.out.println(arr[i]+"]");
}
}
}
}
运行结果:
arr:
[0,1,2,3,4]
arr_1:
[0,1,2,3,4]
arr_2:
[0,0,0,0,0]
二、获取数组中最值
方法一:
int max=arr[0];
for(int i=0;i<arr.length;i++){
if(max<arr[i])
max=arr[i];
}
return max;
}
int getMin(int [] arr){
int min=arr[0];
for(int i=0;i<arr.length;i++){
if(min>arr[i])
min=arr[i];
}
Return min;
}
方法二:
int getMax(int [] arr){
int max=0;
for(int i=0;i<arr.length;i++){
if(arr[max]<arr[i])
max=i;
}
return arr [max];
}
int getMin(int [] arr){
int min=0;
for(int i=0;i<arr.length;i++){
if(arr[min]>arr[i])
min=i;
}
return arr [min];
}
三、数组的排序
1、 选择排序:其特点是经过一次循环比较,最值总是出现在排头。
public static void sort(int[] arr){
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length; j++) {
if (arr[i]<arr[j]) {
int temp = arr[i];
arr[i] =arr[j];
arr[j] = temp;
}
}
}
2、 冒泡排序
原理图
void sort_buble(int[] arr){
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-i-1; j++) {//减去x是是每次循环减少一个比较元素,-1为了避免越界
if (arr[j]>arr[j+1]) {
int temp = arr[j];
arr[j]= arr[j+1];
arr[j+1]= temp;
}
}
}
四、数组查找
折半查找程序段:折半查找的前提是数组有序
* 折半查找:
* 参数列表:arr:数组名;value:需要查找的值
* 返回值:-1代表没有找到对应的value;返回值>0代表查找到对应value并且返回值为在数组中的对应角标
*/
int halfsearch(int[]arr,int value){
int min,mid,max;
min= 0;
max= arr.length;
mid= (min+max)/2;
while (arr[mid]!=value) {
if (value>arr[mid]) {
min= mid+1;
}else if (value<arr[mid]) {
max= mid-1;
}
if (min>max) {
return -1;
}
mid= (min+max)/2;
}
return mid;
}
思考题:有一个有序数组,想要将一个元素插入到该数组,还要保证数组有序,如何获取该元素在数组中应该插入的位置?
/*
* 参数列表:arr:数组名;value:需要查找的值
* 返回值:-1代表没有找到对应的value;返回值>0代表查找到对应value并且返回值为在数组中的对应角标
*/
int halfsearch(int[]arr,int value){
int min,mid,max;
min= 0;
max= arr.length;
while (min<=max) {
mid = (min+max)/2;
if (value>arr[mid]) {
min= mid+1;
}else if (value<arr[mid]) {
max= mid-1;
}
else
return mid;
}
return min;
}
---------------------- android培训、java培训、期待与您交流! ----------------------