JAVA学习第四课(数组)

来源:互联网 发布:游戏鼠标 知乎 编辑:程序博客网 时间:2024/06/05 18:56
数组:

同一类型数据的集合,即一种容器。

定义方式:

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();}



二维数组的使用场景:


只有一点,视情况而定,有明显的层次感数据问题,比如销售员不同月份的销售额

1 0