1、 数组:
1) 定义:同一类型的多个连续数据的存储容器 --- 大小固定,下标从0—length-1
【数组的本质是栈中的一个引用指向堆内存中的连续存储数据的空间,所以数组名存储的是堆中数组的存储地址】
格式: a) 数据类型[] 数组名 = new 数据类型[长度];
b) 数据类型[] 数组名 = new 数据类型[ ]{1,2,3,4,5,9……};
c) 数据类型[] 数组名 = {1,2,3,4,5,6……};
//注:C方法是定义数组和初始化同时操作 ,而简化的写法
格式差别:a) 编译时期并不确定具体的元素,称之为动态初始化,初值为0,可拆分
b)c)编译时就确定了具体的元素,称之为静态初始化b)可拆分c)不可拆分
【注意】中括号放前放后有差别的,如果[ ]紧跟数据类型,数据之后定义的引用一定是一个数组类型。[ ]紧跟数组名。仅限于当前引用是个数组,而不影响其他的变量。建议放在数据类型后
1) 主要应用:这里做简单介绍
a) 获取数组元素:遍历
b) 获取数组长度:int[] arr = new int[10]; arr.length 的结果为10
c) 数组的遍历:1.转换为遍历下标,for(int i=0 ; i<arr.length ; i++){遍历}
2.增强for循环
for(int i:arr){ //增强for循环只能做打印,不能改变原来数组的值
System.out.println(i);
}
3. 在打印数组时,可以将数组转换为一个字符串进行输出,格式如下:
String str = Arrays.toString(); 将数组转化为字符串,但是在别忘了importjava.util.Arrays;
d) 获取最值(最大或最小):遍历获取就可以了,这里不做多说
e) 排序:
1.冒泡排序: 比较轮数:length-1 次数length-i
比较次数:(n-1)(n-i) = n^2 –(i+1)*n +i ;--->最高阶—>时间复杂度:O(n^2)
2.选择排序:比较次数:(n-1)(n-i) --à时间复杂度:O(n^2)
3.内置方法:Arrays.sort( 数组名 ); 从小到大排序 快排(O(logn))
f) 数组的反转:首尾交换 ---交换到数组长度的一般就可以了
g) 数组的查找:第一次找到的位置 二分法
int[]arr = {0,1,2,3,4,5,6,7,8,9,10};
System.out.println(Arrays.toString(arr));
int n = 10;
int max = arr.length-1;
int min = 0;
int mid = (max+min)/2;
while(arr[mid] != n){
if(arr[mid]>n){
min = mid+1;
}else if(arr[mid]<n){
max = mid-1;
}
if(min > max){ // have not found
mid = -1;
break;
}
mid = (max+min)/2;
}
System.out.println(mid);
h) 数组的复制以及扩容:
System.arraycopy();数组的复制
Arr = Arrays.copyOf(arr , arr.length+1); 多出来的位置补0,扩容后地址会变,本质就是复制为其他数组
2、内存:数组存储过程:
内存划分:栈、堆、方法区
1)栈内存:用于存储变量的,变量在定以后存入栈内存,而栈内存不会给变量自动赋值,变量用完后会立即从栈内存中释放(过河拆桥的特点)
2)堆内存:存储的是对象,堆内存会给每个对象中的每个位置一个默认值,不允许每个位置是无值状态。对象在使用完成后会在不定的某个时刻被回收。
byte、short、int-à0; long-à0L ; floatà0.0F ; double ->0.0
char-à”\u0000”(U16编码,2位) boolean-àfalse 引用类型 -ànull
数组名内存储的数据:
栈和堆区别:栈不会自动赋值,堆会,栈会立即回收,堆不会
3)数组的整体赋值,赋值的是地址,如果访问的元素下表越界,会出现异常
4)二维数组: 将一维数组看作元素,放入一个数组中
int[] [] arr = newint[3][]; 或者 int [] [] arr = new int [3][5];
或者int [][] arr ={{1,2,3},{4,5,6},{7,8,9}}; 大小为3的二维数组
增强for循环:
int[][]arr = {{1,2,3},{2,5,9}};
for(int[] i:arr){
for(int j:i){
System.out.println(j);
}
}