JAVA学习第四课(数组)

来源:互联网 发布:企业建站cms哪个好 编辑:程序博客网 时间:2024/06/03 03:11
数组:

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

定义方式:

int[] atrr = new int[5];//int 型数组 数组名arr ,new动态开辟  int[5],数组大小为5,只能存放5个元素,

下标0-4


数组定义后在内存中的基本分布:

内存的划分:

1.寄存器 -> CPU

2.本地方法区,与所在系统相关

3.方法区

4.栈内存:
       存储的都是局部变量,且变量所属的作用域一旦结束,当前变量就会自动释放,所以
       栈内存更新速度很快,因为栈内变量的生命周期都很短(结束就释放)。
例如:局部代码块,其限定局部变量的生命周期,在某些大程序里,main函数不结束

其中的变量就不释放,所以引用局部代码块。

示例代码:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;  
  2.   
  3. public class Main   
  4. {  
  5.     public static void main(String[] args)  
  6.     {  
  7.         int[] arr = new int[6];  
  8.       
  9.         System.out.println(arr[1]);  
  10.       
  11.       
  12.         {//局部代码块,在{}中age有效,{}执行玩age自动释放  
  13.             int age = 3;  
  14.             System.out.println(age);  
  15.         }  
  16.       
  17.         System.out.println();  
  18.     }  
  19.   
  20. }  

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++。

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;  
  2.   
  3.   
  4. public class Main   
  5. {  
  6.     public static void main(String[] args)  
  7.     {  
  8.         int[] arr = new int[]{1,1,1,1,1,1};  
  9.       
  10.         System.out.println(arr[1]);  
  11.           
  12.         arr = null;//当引用型变量没有任何实体指向时,还引用该实体,就会引发异常  
  13.       
  14.         System.out.println(arr[2]);  
  15.       
  16.     }  
  17. }  

数组使用小练习:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;  
  2.   
  3.   
  4. public class Main   
  5. {  
  6.     public static void main(String[] args)  
  7.     {  
  8.         int[] arr = new int[5];  
  9.         int [] b = new int[5];  
  10.         arr[0] = 5;  
  11.         b[0] = 6;  
  12.         b[3] = 15;  
  13.           
  14.         System.out.println("arr[0] = "+arr[0]);  
  15.         System.out.println("arr[3] = "+arr[3]);  
  16.   
  17.         arr = b;//更改arr的指向  
  18.   
  19.         System.out.println("arr[0] = "+arr[0]);  
  20.         System.out.println("arr[3] = "+arr[3]);  
  21.         System.out.println("b[3] = "+b[3]);  
  22.         System.out.println("b[0] = "+b[0]);  
  23.   
  24.         b = null;//b无指向  
  25.   
  26.         System.out.println("arr[0] = "+arr[0]);  
  27.         System.out.println("arr[3] = "+arr[3]);  
  28.         //System.out.println("b[3] = "+b[3]);以视为垃圾  
  29.         //System.out.println("b[0] = "+b[0]);  
  30.     }  
  31. }  


使用数组容易遇见的小问题


[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;  
  2.   
  3.   
  4. public class Main   
  5. {  
  6.     public static void main(String[] args)  
  7.     {  
  8.         int[] arr = new int[5];  
  9.         int [] b = new int[5];  
  10.           
  11.         System.out.println(arr);//[I@15db9742,15db9742是arr存储的哈希值,[->数组,I -> int型  
  12.   
  13.         //所以,在我们不知道,当前实体是什么类型的实体时,就可以直接当前该实体的名字  
  14.           
  15.     }  
  16. }  


数组的另一种定义方式:

格式2:已知数组元素,只是需要一个容器来存储


[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public class Main   
  2. {  
  3.     public static void main(String[] args)  
  4.     {  
  5.         int[] arr = new int[5];  
  6.           
  7.     //  int[] b = new int[]{1,2,3,4,5};同下  
  8.           
  9.         int b[] = {1,2,1,3,4,7,8,9,4,1,2,5,6,7,4,5,1,2,3,6};//同上  
  10.         int len = b.length;  
  11.         for(int i = 0;i<len;i++)  
  12.         {  
  13.             System.out.println("b["+i+"]= "+b[i]);  
  14.         }  
  15.     }  
  16. }  


数组练习:

进制转换

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import java.awt.print.Printable;  
  2. import java.util.Arrays;  
  3. import java.util.Scanner;  
  4.   
  5. import javax.swing.text.DefaultEditorKit.InsertBreakAction;  
  6.   
  7. import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;  
  8.   
  9. /* 需求:  
  10.  * 获取一个整数的X进制的表现形式  
  11.  * */  
  12. public class Main   
  13. {  
  14.     public static void main(String[] args)  
  15.     {  
  16.         Scanner cin = new Scanner(System.in);  
  17.         int num = cin.nextInt();  
  18.           
  19.         int ary[] = new int[8];  
  20.         getx(num,ary,15,4);//16进制  
  21.         System.out.println("16进制表现形式如下:");  
  22.         print(ary);  
  23.           
  24.         int bry[] = new int[12];  
  25.         int num1 = cin.nextInt();  
  26.         getx(num1,bry,7,3);//8进制  
  27.         System.out.println("8进制表现形式如下:");  
  28.         print8(bry);  
  29.           
  30.           
  31.         System.out.println("6的2进制表现形式如下:");  
  32.         System.out.println(Integer.toBinaryString(6));  
  33.         System.out.println("-6的2进制表现形式如下:");  
  34.         System.out.println(Integer.toBinaryString(-6));  
  35.       
  36.         cin.close();  
  37.     }  
  38.     public static void print(int[] ary)  
  39.     {  
  40.         int i;  
  41.         for(i = 7;i>=0;i--)  
  42.         {  
  43.             if(ary[i]!=0)  
  44.                 break;  
  45.         }  
  46.         for(int j = i;j>=0;j--)  
  47.         {  
  48.             if(ary[j]>9)  
  49.             switch (ary[j])   
  50.             {  
  51.             case 10:System.out.print("A");  
  52.                 break;  
  53.             case 11:System.out.print("B");  
  54.             break;  
  55.             case 12:System.out.print("C");  
  56.             break;  
  57.             case 13:System.out.print("D");  
  58.             break;  
  59.             case 14:System.out.print("E");  
  60.             break;  
  61.             case 15:System.out.print("F");  
  62.             break;  
  63.             default:  
  64.                 break;  
  65.             }  
  66.             else {  
  67.                 System.out.print(ary[j]);;  
  68.             }  
  69.               
  70.         }  
  71.         System.out.println();  
  72.     }  
  73.     public static void print8(int bry[])  
  74.     {  
  75.         int i;  
  76.         for(i = 10;i>=0;i--)  
  77.         {  
  78.             if(bry[i]!=0)  
  79.                 break;  
  80.         }  
  81.         for(int j = i;j>=0;j--)  
  82.         {  
  83.             System.out.print(bry[j]);  
  84.         }  
  85.         System.out.println();  
  86.     }  
  87.      public static void getx(int num,int ary[],int mod,int wz)  
  88.     {  
  89.         int l = 0;  
  90.       
  91.         for(int i = 0;i<8;i++)  
  92.         {  
  93.             int t = num & mod;//16进制的最大值  
  94.             ary[l++] = t;  
  95.             num = num >>> wz;//4个二进制位表示一个16进制位  
  96.         }  
  97.     }  
  98. }  

进制转换示意图


二维数组:


定义一维数组:
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. int a[] = new int[5];  

所以定义二维数组 同一维数组

定义方式1:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. int arr[][] = new int[3][2];//数组初始null,元素的初始值都是0  

这个二维数组,这个二维数组中有3个一维数组,每个一维数组有2个元素

定义方式2:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. int arr[][] = new int[4][];  
  2.   
  3.   
  4. arr[0] = new int[5];  
  5. arr[1] = new int[3];  
  6. arr[2] = new int[8];  
  7. arr[2] = new int[1];  



这个二维数组,有4个一维数组,数组[0] 中有5个元素,数组[1] 中有3个元素.....


打印二维数组中的下标为1的一维数组的下标为1的元素:System.out.print(arr[1][1]);

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. System.out.print(arr);//[[I@15db9742:@左边是数组的类型,右边是实体在内存中存储的哈希值  
  2.   
  3.   
  4. int len = arr.length;一维数组的个数  
  5.           
  6. int len1 = arr[0].length;一维数组元素的个数  


[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. int arr[][] = {{1,1},{1,2,3},{6,5,4,7,8,2}};  
  2. for(int i = 0;i<arr.length;i++)  
  3. {  
  4.     for(int j = 0;j<arr[i].length;j++)  
  5.     {  
  6.         System.out.print(arr[i][j]+" ");  
  7.     }  
  8.     System.out.println();  
  9. }  



二维数组的使用场景:


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