同一类型数据的集合,即一种容器。
定义方式:
int[] atrr = new int[5];//int 型数组 数组名arr ,new动态开辟 int[5],数组大小为5,只能存放5个元素,
下标0-4
内存的划分:
1.寄存器 -> CPU
2.本地方法区,与所在系统相关
3.方法区
4.栈内存:
存储的都是局部变量,且变量所属的作用域一旦结束,当前变量就会自动释放,所以
栈内存更新速度很快,因为栈内变量的生命周期都很短(结束就释放)。
例如:局部代码块,其限定局部变量的生命周期,在某些大程序里,main函数不结束
其中的变量就不释放,所以引用局部代码块。
示例代码:
- import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;
- public class Main
- {
- public static void main(String[] args)
- {
- int[] arr = new int[6];
- System.out.println(arr[1]);
- {//局部代码块,在{}中age有效,{}执行玩age自动释放
- int age = 3;
- System.out.println(age);
- }
- System.out.println();
- }
- }
5.堆内存:、
堆中存储的是对象(数组),凡是new建立的都在堆中,堆不会随时释放,堆中存储实体,实体中装载数据,数据中一个损坏,其他的数据依然可以用。而栈一个数据损坏,其他的都不使用
特点:
1.堆中每一个实体都有首地址值。
2.堆内存中每一个局部变量都有默认的初始化值,根据类型的不同,初始化值也不同,例如:int型是0,float 是0.0f\0.0,boolean 是false,char 比较特殊 '\u0000',\u 转义,unicode
3.释放方式:垃圾回收机制
如图: x = y;
null:
当不想使用arr实体时,arr是数组,若想让arr不做任何实体指向,arr = null,但是堆不会释放arr的地址,
将其视作垃圾。堆里面的垃圾是在不定时自动回收垃圾,故java在内存管理方面优于C++。
- import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;
- public class Main
- {
- public static void main(String[] args)
- {
- int[] arr = new int[]{1,1,1,1,1,1};
- System.out.println(arr[1]);
- arr = null;//当引用型变量没有任何实体指向时,还引用该实体,就会引发异常
- System.out.println(arr[2]);
- }
- }
数组使用小练习:
- import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;
- public class Main
- {
- public static void main(String[] args)
- {
- int[] arr = new int[5];
- int [] b = new int[5];
- arr[0] = 5;
- b[0] = 6;
- b[3] = 15;
- System.out.println("arr[0] = "+arr[0]);
- System.out.println("arr[3] = "+arr[3]);
- arr = b;//更改arr的指向
- System.out.println("arr[0] = "+arr[0]);
- System.out.println("arr[3] = "+arr[3]);
- System.out.println("b[3] = "+b[3]);
- System.out.println("b[0] = "+b[0]);
- b = null;//b无指向
- System.out.println("arr[0] = "+arr[0]);
- System.out.println("arr[3] = "+arr[3]);
- //System.out.println("b[3] = "+b[3]);以视为垃圾
- //System.out.println("b[0] = "+b[0]);
- }
- }
- import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;
- public class Main
- {
- public static void main(String[] args)
- {
- int[] arr = new int[5];
- int [] b = new int[5];
- System.out.println(arr);//[I@15db9742,15db9742是arr存储的哈希值,[->数组,I -> int型
- //所以,在我们不知道,当前实体是什么类型的实体时,就可以直接当前该实体的名字
- }
- }
数组的另一种定义方式:
格式2:已知数组元素,只是需要一个容器来存储
- public class Main
- {
- public static void main(String[] args)
- {
- int[] arr = new int[5];
- // int[] b = new int[]{1,2,3,4,5};同下
- int b[] = {1,2,1,3,4,7,8,9,4,1,2,5,6,7,4,5,1,2,3,6};//同上
- int len = b.length;
- for(int i = 0;i<len;i++)
- {
- System.out.println("b["+i+"]= "+b[i]);
- }
- }
- }
数组练习:
进制转换
- import java.awt.print.Printable;
- import java.util.Arrays;
- import java.util.Scanner;
- import javax.swing.text.DefaultEditorKit.InsertBreakAction;
- import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;
- /* 需求:
- * 获取一个整数的X进制的表现形式
- * */
- public class Main
- {
- public static void main(String[] args)
- {
- Scanner cin = new Scanner(System.in);
- int num = cin.nextInt();
- int ary[] = new int[8];
- getx(num,ary,15,4);//16进制
- System.out.println("16进制表现形式如下:");
- print(ary);
- int bry[] = new int[12];
- int num1 = cin.nextInt();
- getx(num1,bry,7,3);//8进制
- System.out.println("8进制表现形式如下:");
- print8(bry);
- System.out.println("6的2进制表现形式如下:");
- System.out.println(Integer.toBinaryString(6));
- System.out.println("-6的2进制表现形式如下:");
- System.out.println(Integer.toBinaryString(-6));
- cin.close();
- }
- public static void print(int[] ary)
- {
- int i;
- for(i = 7;i>=0;i--)
- {
- if(ary[i]!=0)
- break;
- }
- for(int j = i;j>=0;j--)
- {
- if(ary[j]>9)
- switch (ary[j])
- {
- case 10:System.out.print("A");
- break;
- case 11:System.out.print("B");
- break;
- case 12:System.out.print("C");
- break;
- case 13:System.out.print("D");
- break;
- case 14:System.out.print("E");
- break;
- case 15:System.out.print("F");
- break;
- default:
- break;
- }
- else {
- System.out.print(ary[j]);;
- }
- }
- System.out.println();
- }
- public static void print8(int bry[])
- {
- int i;
- for(i = 10;i>=0;i--)
- {
- if(bry[i]!=0)
- break;
- }
- for(int j = i;j>=0;j--)
- {
- System.out.print(bry[j]);
- }
- System.out.println();
- }
- public static void getx(int num,int ary[],int mod,int wz)
- {
- int l = 0;
- for(int i = 0;i<8;i++)
- {
- int t = num & mod;//16进制的最大值
- ary[l++] = t;
- num = num >>> wz;//4个二进制位表示一个16进制位
- }
- }
- }
进制转换示意图
定义一维数组:
- int a[] = new int[5];
所以定义二维数组 同一维数组
定义方式1:
- int arr[][] = new int[3][2];//数组初始null,元素的初始值都是0
这个二维数组,这个二维数组中有3个一维数组,每个一维数组有2个元素
定义方式2:
- int arr[][] = new int[4][];
- arr[0] = new int[5];
- arr[1] = new int[3];
- arr[2] = new int[8];
- arr[2] = new int[1];
这个二维数组,有4个一维数组,数组[0] 中有5个元素,数组[1] 中有3个元素.....
打印二维数组中的下标为1的一维数组的下标为1的元素:System.out.print(arr[1][1]);
- System.out.print(arr);//[[I@15db9742:@左边是数组的类型,右边是实体在内存中存储的哈希值
- int len = arr.length;一维数组的个数
- int len1 = arr[0].length;一维数组元素的个数
- int arr[][] = {{1,1},{1,2,3},{6,5,4,7,8,2}};
- for(int i = 0;i<arr.length;i++)
- {
- for(int j = 0;j<arr[i].length;j++)
- {
- System.out.print(arr[i][j]+" ");
- }
- System.out.println();
- }
二维数组的使用场景:
只有一点,视情况而定,有明显的层次感数据问题,比如销售员不同月份的销售额