数组
概念
同一种类型数据的集合.其实数组就是一个容器.
数组的好处
可以自动给数组中的元素从0开始编号,方便操作这些元素
格式1
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例: int[] arr = new int[5];
格式2
元素类型[] 数组名 = new 元素类型[]{元素,元素,....};
int[] arr = new int[]{3,5,1,7};
int[] arr = {4,5,1,6};
例子:
public class ArrayDemo {
public static void main(String[] args) {
//元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
int[] arr = new int[3];
//打印出来的都是0,因为只定义该数组的长度和个数(角标长度)并没有向具体角标中赋值
//打印出来的数据都是默认值0
System.out.println(arr[0]);
System.out.println(arr[1]);
//给数组第0个角标赋值
arr[0]=89;
//打印结果为89
System.out.println(arr[0]);
}
}
数组内存空间的划分
1.寄存器(CPU来处理不用管)
2.本地方法区(不详解由所在系统相关的)
3.方法区(后面章节会讲)
4.栈内存(重点)
5.堆内存(重点)
理解局部变量和全局变量区别
public class ArrayDemo2 {
static int a = 27; // 全局变量
static void test() {
boolean flag = false;// flag局部变量有效范围市整方法体
if (!flag) {
int a = 20;// 局部变量a必须进行初始化且只if块有效
System.out.println("a1=" + a);
}
}
public static void main(String[] args) {
int a = 23;// 局部变量a
test();
System.out.println("a3=" + a);
}
}
1.对于局部变量要先赋值后使用
2.局部变量局部有效,在定义着个变量的代码块就是在{}中有效
3.成员变量只在加载的时候初始化一次 局部变量每次调用方法的时候都会被初始化
4.成员变量存在堆中 局部变量存在栈中
栈内存
存储的都是局部变量
局部变量所属的作用域(方法)一旦调用结束,该变量就自动释放.
堆内存
存储是数组和对象(其实数组就是对象)凡是new出来的都放在堆中
如图:
下面这个是给引用数据类型进行设置为null,如果基本数据类型都是null,它也就指向null了,那堆中没有引用指向的数据就成为垃圾数据,由于java垃圾收集器不定时回收,就向办公室中有阿姨来不定时回收垃圾道理一样
特点:
1.每个实体都有首地址值
2.堆内存中的每一个变量都有默认初始化值,根据类型的不同而不同.整数是0,小数是0.0.或者0.0f.boolean false char '\u0000'
3.垃圾回收机制
堆栈内存分析
数组-第二种定义格式
元素类型[] 数组名 = new 元素类型[]{元素,元素,....};
int[] arr = new int[]{3,5,1,7};
int[] arr = {4,5,1,6};
public static void main(String[] args) {
/*格式一
* 第一种用法:
* 需要一个容器,但是不明确容器中的具体数据
* */
int[] arr=new int[3];
/**格式二
* 第二种用法:
* 需要一个容器,存储已知的具体数据.
* 元素类型[] 数组名 = new 元素类型[]{元素,元素,....};
int[] arr = new int[]{3,5,1,7};
int[] arr = {4,5,1,6};
*/
int[] arr1 = new int[]{1,2,3,4};
int[] arr2 = {1,2,3,4};
}
数组-常见操作-遍历
int[] arr1 = new int[]{1,2,3,4};
int[] arr2 = {1,2,3,4,5};
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
反向遍历
for (int i = arr2.length-1; i >=0; i--) {
System.out.println(arr2[i]);
}
获取数组中最大或最小的值
public static void main(String[] args) {
int[] arr = { 11, 33, 23, 6, 5, 88 };
System.out.println(getMaxNumber_2(arr));
}
//通过元素比较
public static int getMaxNumber(int[] arr){
int maxElement = arr[0];
for(int i = 0 ;i<arr.length;i++){
if(arr[i]>maxElement){
maxElement=arr[i];
}
}
return maxElement;
}
//通过角标比较
public static int getMaxNumber_2(int[] arr){
int maxElement = 0;
for(int i = 0 ;i<arr.length;i++){
if(arr[i]>arr[maxElement]){
arr[maxElement]=arr[i];
}
}
return arr[maxElement];
}
查询数组指定的值
//数组查询
public static void main(String[] args) {
int[] arr = { 11, 33, 23, 6, 5, 88 };
System.out.println(getMaxElement(arr,5));
}
//普通查询数组中指定的元素
public static int getMaxElement(int[] arr,int key){
for(int i = 0;i<arr.length;i++){
if(arr[i]==key){
return arr[i];
}
}
return -1;
}
二维数组
int[][] arr = new int[3][2];
System.out.println(arr);//打印二维数组 [[I@15db9742
System.out.println(arr[0]);//打印二维数组中角标为0的一维数组 [I@6d06d69c
System.out.println(arr[0][0]); //打印二维数组中角标为0的一维数组为0的值 0
int[][] arr2 = new int[3][];
System.out.println(arr2);//打印二维数组 [[I@15db9742
System.out.println(arr2[0]);//打印二维数组中角标为0的一维数组 null
System.out.println(arr2[0][0]); //打印二维数组中角标为0的一维数组为0的值java.lang.NullPointerException
int[] arr3 = new int[3];
System.out.println(arr3);
System.out.println(arr3[0]);
//二维数组
public static void main(String[] args) {
int[] arr1 = new int[3];
//System.out.println(arr13);
//System.out.println(arr1[0]);
int[][] arr2 = new int[3][2];
//System.out.println(arr2);//打印二维数组 [[I@15db9742
//System.out.println(arr2[0]);//打印二维数组中角标为0的一维数组 [I@6d06d69c
//System.out.println(arr2[0][0]); //打印二维数组中角标为0的一维数组为0的值 0
int[][] arr3 = new int[3][];
//System.out.println(arr3);//打印二维数组 [[I@15db9742
//System.out.println(arr3[0]);//打印二维数组中角标为0的一维数组 null
//System.out.println(arr3[0][0]); //打印二维数组中角标为0的一维数组为0的值java.lang.NullPointerException
int sum = 0;
int[][]arr4={{3,1,7},{9,3,6,7},{445,7,3,1,7}};
for(int x= 0;x<arr4.length;x++){
for (int i = 0; i < arr4[x].length; i++) {
sum+=arr4[x][i];
System.out.print(arr4[x][i]);
}
System.out.println( );
}
System.out.println(sum);
}