数组
一、数组初始化
- 静态初始化:初始化和赋值同时进行
int [] i;
i=new int[]{1,2,3,4};
- 动态初始化:初始化和赋值分开进行
String [] names=new String[5];
注意:数组元素是char型:默认初始值是0或者‘\u0000’,而不是‘0’
二、数组内存分析
- int[]=new int[]{1,2,3}; 先在堆中开辟3个int类型的空间默认值为0,然后依次赋值1,2,3,堆地址为0x34ab;arr存在栈中,地址为0x34ab;栈地址指向堆地址。
- String[]arr1=new String[4];先在堆中开辟4个String类型的空间默认值为null,堆地址为0x12ab;arr1在栈中地址为0x12ab,栈地址指向堆地址,完成创建;然后堆中第2个内存也就是下标为1的内存值由***null***改为***哈哈***,第3个内存也就是下标为2的内存值由***null***改为***呵呵***。(准确来说开始是放在常量池中,后面再深度学习)
- arr1=new String[3];堆中新开辟3个String类型的内存空间默认值为null,堆地址为0x6677;arr1栈地址改为0x6677,重新指向0x6677堆地址;堆地址为0x12ab的内存释放,等待回收。
三、二维数组
二维数组:一个数组的元素是数组
- 声明和初始化
//静态初始化
int[][]arr1=new int[][]{{1,2,3},{4,5},{6}}
//动态初始化
String[][] arr2=new String[3][2];一个长度为3的数组里面每个放了一个长度为2的数组
String[][] arr3=new String[3][];
System.out.println(arr2[1]);//地址值
System.out.println(arr2[1][1]);//null
System.out.println(arr3[1]);//null
System.out.println(arr3[1][1]);//空指针异常
四、案例
public void select(){
int [] nums=new int[]{1,36,33,2,30,-5,6,10,30};
//二分法查找前提是有序的数组
//冒泡排序
for(int i=0;i<nums.length-1;i++) {
for (int j = 0; j < nums.length-1-i; j++) {
if (nums[j] > nums[j + 1]) {
int temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
System.out.println(Arrays.toString(nums));
int tiger=10;
int head=0;//头索引
int end=nums.length-1;//尾索引
boolean flag=true;
while (head<=end){
int mid=(head+end)>>1;
if(tiger==nums[mid]){
System.out.println("找到元素,位置为:"+mid);
flag=false;
break;
}else if(nums[mid]>tiger){
end=mid-1;
}else {
head=mid+1;
}
}
if(flag){
System.out.println("没有找到");
}
}