1、数组
(1)概念
*同一种类型数据的集合,其实数组就是一个容器。
(2)特点
*数组会自动对其内部的元素从0开始编号
(3)格式
*格式1
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
该格式用于还不明确数组的具体数据
示例:
**int[] arr = new int[6];
*格式2
元素类型[] 数组名 = new 元素类型[]{元素1,元素2,元素3...};
该格式用于数组已明确存储的数据
示例:
**int[] arr = new int[]{12,34,24,56,74,};
**int[] arr = {334,45,22,4,646,7};
注意:
该类型{}内已明确元素个数,故[]内不要再输入
(4)怎么用
用数组来存储一组同类型的数据,可以通过对其角标的操作使用数组元素。
数组元素是存储在堆中的,数组名仅仅只是指向数组的地址,在调用函数时,对数组的操作结果不需要返回值,因为在对数组操作时,其内部已经改变。
对数组最基本的动作就是存与取;其核心思想是对角标的操作
(5)什么时候要用数组
如果数据出现了对应关系,而且对应关系的一方是有序的数字编号。这些数字可作为角标使用,这时,就必须想到数组的使用。
对很多同类数据进行使用时,用数组要比较方便
数据只要一多,尽量使用数组
(6)数组自带测试长度的命令:length
示例:
int[] arr = new int[8];
arr.length 其值为8
(7)常见操作
*获取最值(最大值,最小值)
*排序(冒泡排序,选择排序)
冒泡排序,例:从大到小排序
public static void bubbleSort(int[] arr){
for (int x= arr.length-1;x>0 ; x--){
for (int y = 0;y<x ;y++ ){
if (arr[y]<arr[y+1]){
swap(arr,y,y+1);
}
}
}
return ;
}
选择排序,例:从小到大排序
public static void selectSort(int[] arr){
for (int x = 0;x<arr.length-1 ;x++ ){
for (int y = x+1;y<arr.length ;y++ ){
if (arr[x]>arr[y]){
swap(arr,x,y);
}
}
}
return ;
}
*折半查找(二分查找)
折半查找法
public static int halfFind(int[] arr,int key){
int min =0;
int max = arr.length-1;
int mid = (min + max)>>1;
while (arr[mid]!=key){
if (arr[mid] > key){
max = mid-1;
}else if (arr[mid] < key){
min = mid +1;
}
if (min>max){
return -1;
}
mid = (min + max)>>1;
}
return mid;
}
数组索引越界:
当访问到数组中不存在的角标,就会发生异常,错误:ArrayIndexOutOfBoundsException
当引用型变量没有任何实体指向时,还在用其操作实体。会发生的异常:NullPointerException
出现错误:[I@c0786 @号前面的'['指数组 'I'值int型
2、二维数组
(1)定义格式
两种:
格式一:int[][] arr = new int[3][2];
格式二:int[][] arr = new int[3][];
格式三:int[][] arr = {{3,6,7},{12,5},{1,4,6,3}};
应用:
数据多了用数组存,数组多了用数组存
二维数组图解:
3、内存的划分:
1、寄存器
2、本地方法区;
3、方法区
4、栈内存
存储的都是局部变量。
而且变量所属的作用域一旦结束,该变量就自动释放。
特点:先进放栈底,先进后出(例子:弹夹)
局部代码块。用于限定局部变量的生命周期
5、堆内存
存储的是数组和对象(其实数组就是对象)凡是new建立都在堆中。
特点:
1、每一个实体都有首地址值
2、堆内存中的每一个变量都有默认的初始化值,根据类型的不同而不同。
整数是0,小数0.0或者0.0f,boolean 是false ,char 是'u00000'
3、垃圾回收机制(C++和java区别,java有垃圾自动回收机制,C++得手动回收)
null能取消引用型数据的指向,但堆中数据仍存在。