数组:
同一类型数据的集合,即一种容器。
定义方式:
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();
- }
- }
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[]{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]; 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型
- //所以,在我们不知道,当前实体是什么类型的实体时,就可以直接当前该实体的名字
- }
- }
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]);
- }
- }
- }
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进制位
- }
- }
- }
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];
int a[] = new int[5];
所以定义二维数组 同一维数组
定义方式1: