JAVA学习第四课(数组)

数组:

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

定义方式:

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值