一、基本概念
1.数组
- 数组:相同类型元素的集合,在内存中是一段连续的空间。
2.创建一个数组
- T[ ] 数组名=new T[N];
3.初始化一个数组
- 动态初始化
直接指定元素个数:int [ ] arr=new int[10];
- 静态初始化
在创建数组时不指定数组元素个数,而直接把内容指定
int[ ] arr=new int[ ]{1,2,3,4,5};
需要注意的是:
·静态初始化虽然没有指定元素个数,但是编译器会根据{ }里的东西确定长度;
·静态初始化可以省略new T[ ]
如果不确定内容时用动态初始化,确定了内容就得用静态初始化;
·没有初始化的数组中都有默认值,默认0,引用类型默认为null
4.使用一个数组
- 访问其元素:通过下标访问,但注意数组越界问题
- 遍历该数组:用数组对象.length获取数组长度,然后通过循环遍历。
二、引用类型
1.JVM的内存分布
- 程序计数器:保存下一条指令;
- 虚拟机栈:方法执行时创建的栈帧,存储包括:局部变量表、操作数栈、动态链接、返回地址等等。方法运行结束,栈帧销毁。
- 本地方法栈:存储Native方法的局部变量
- 堆:new创建的对象保存在了堆上。程序运行时创建,程序退出时销毁。
- 方法区:存储已被虚拟机加载的类信息、常量、静态变量,编译器编译后的代码等等。
2.引用类型变量
- 基本类型变量里存放的是对应的值,放在栈帧中
- 引用类型变量里存放的是对象所在空间的地址,放在堆中
3.NULL
空引用,不指向对象,无效的内存位置,不能进行任何读写操作哦
三、一些数组的操作
- 数组拷贝
public static void main(String[] args) {
//方法1--引用赋值给引用
int [] arr={1,2,3,4,5};
int [] newArr1=arr;
//System.out.println(Arrays.toString(newArr));
//方法2--copyOf
int [] newArr2=Arrays.copyOf(arr,arr.length);
System.out.println(Arrays.toString(newArr2));
//范围内拷贝
int [] newArr3=Arrays.copyOfRange(arr,1,3);
System.out.println(Arrays.toString(newArr3));
}
- 数组查找–二分查找
public static int binSearch(int[]arr,int num){
int left=0;
int right=arr.length-1;
while (left<right){
int mid=(left+right)/2;
if(num<mid){
right=mid-1;
}else if(num>mid){
left=mid+1;
}else
return mid;
}
return -1;
}
public static void main(String[] args) {
//二分查找
int[] arr={1,2,3,4,5,6,7,8,9,10};
System.out.println(binSearch(arr,4));
}
- 数组排序–冒泡排序
//冒泡排序
public static void Bubble(int []arr){
for (int i = 0; i < arr.length; i++) {
for (int j = 1; j < arr.length-i; j++) {
if(arr[j-1]>arr[j]){
int tmp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=tmp;
}
}
}
}
public static void main(String[] args) {
int []arr={2,4,1,5,7,0};
Bubble(arr);
System.out.println(Arrays.toString(arr));
}
Arrays.sort(arr);//也可以直接用Arrays内置方法
System.out.println(Arrays.toString(arr));