数组
数组:
数组就是一个具有相同数据类型的数据的集合。
int[] arr (推荐)
int arr[]
这两种都是可以的
初始化数组的3种方式:
double[] arr1={10.1,20.2,56.5}; 长度为3
double[] arr2=new double[]{10.1,20.2,56.5};
这两种是静态初始化,需要你手动去赋初值
double[] arr3=new double[10]; 创建了长度为10的数组(java会自动赋初值0)
这种是动态初始化,他是java虚拟机自动赋初值的。
数组的存储问题:
数组属于对象类型,是存放在堆内存中的。
对于基本类型的数组,它会在栈中创建一个变量,这个变量指向的是堆中的对象的地址,在堆中创建一个对象(即分配一个连续的内存),这个对象里存放的是数组的元素,元素里存放的是对应元素上的值。
对于引用类型数组,数组中的元素存放的是引用,他指向另一块内存,其实他的数组元素就是一个引用类型的变量。(二维数组就是这样的)
问题:引用变量什么时候就只是栈中的变量,什么时候又是实际的java对象呢?
答:引用变量的值其实就是对象的地址,因为java是不允许程序员来直接访问堆内存的,
所以当你通过引用变量来访问java对象的方法和属性时,那么此时这个引用变量就
会由他所引用的对象来代替。
关于数组有一系类的算法:
一系列的排序:
快速排序 希尔排序 堆排序....
查找:
二分查找:前提是你要查找的数据所在的数组 必须是一个有序的
package com.guigu.test; import java.util.Scanner; public class Test3 { public static boolean find(int num,int[] arr){//能找到就返回true 不能找到就返回false int left=0;//第一的索引 int right=arr.length-1;//最后的索引 int mid=0;//定义一个mid来接收中间的值 while(left<=right){ mid=(right-left)/2+left; if(arr[mid]==num){ System.out.println("100在数组的索引为"+mid); return true; }else if(arr[mid]>num){//说明要找的数在左边 right=mid-1; }else if(arr[mid]<num){//说明要找的数在右边 left=mid+1; } } return false; } public static void main(String[] args) { int[] arr={0,8,9,20,30,50,70,80,100,120}; System.out.print("输入要查找的数:"); Scanner sc=new Scanner(System.in); int num=sc.nextInt(); boolean result=find(num, arr); if(result){ find(num, arr); }else{ System.out.println("你输入的数不存在"); } } }