数组

数组概述

1)数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
2)数组既可以存储基本数据类型,也可以存储引用数据类型。

数组的定义格式:
格式1:数据类型[] 数组名;
格式2:数据类型 数组名[];
注意:针对数组定义两种格式,推荐使用第一种格式。因为第一种的可读性更强。第二种可以早期的时候确实有很多人这样用。不过,现在这样用的人越来越少了。作为Java的粉丝C#(Java的模仿者)就不再支持第二种语法格式了。越来越多的语言可能会抛弃第二种格式。

数组的初始化方式:
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。

Java中的内存分配

  1. Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
    
    1. 栈 存储局部变量
    2. 堆 存储new出来的东西
    3. 方法区(面向对象部分讲)
    4. 本地方法区(和系统相关)
    5. 寄存器(给CPU使用)
    

静态初始化

格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
举例:
int[] arr = new int[]{1,2,3};
解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值,并且值分别是1,2,3。
其实这种写法还有一个简化的写法--->int[] arr = {1,2,3};

数组中常见的小问题:
1)数组索引越界
ArrayIndexOutOfBoundsException
访问到了数组中的不存在的索引时发生。
**出现的原因:**
访问了数组中不存在的角标值
**解决方案:**
更改角标在范围内即可!
2)空指针异常
NullPointerException
数组引用没有指向实体,却在操作实体中的元素时
**出现的原因:**
				代码结构不严谨(某个对象已经为null,还有使用这个对象调用方法或者访问元素...)
**解决方案:**
				只要 给对该对象进行非空判断
				如果该对象不为空,才能使用这个对象完成一些操作!

为什么要记住这些小问题?
因为写程序不仅仅是把代码写出来,还包括出现问题后要能够及时的把问题解决。而排错也应该是我们的基本功。所以,我们也应该记住一些常见的问题,以及出错原因和解决方案。

面试常见问题1:

数组中有没有length属性,字符串有没有length属性,集合中有没有?
答:数组中存在length属性。
字符串没有length属性--->String类中:length()
集合没有length属性--->集合中:size()

数组的应用——遍历

遍历:就是将元素的内容一一输出出来!

class ArrayTest{
	public static void main(String[] args){
		//定义一个数组,静态初始化
		int[] arr = {57,69,80,13,22} ;
		printArray2(arr) ;
	}
	//最终版代码:遍历数组
	public static void printArray2(int[] array){
		//拼接左中括号
		System.out.print("{") ;
		//遍历array数组
		for(int x = 0 ; x < array.length; x ++){//x角标
			//获取到每一个元素
			//判断:如果x取到最大索引值,---->取到最后一个元素了
			if(x==array.length-1){
				//最后一个元素,输出元素内容以及右中括号
				System.out.println(array[x]+"}") ;
			}else{
				//不是取到最大索引值,将中间的元素按照按照格式输出(元素+逗号+空格)
				System.out.print(array[x]+", ") ;
			}
		}
	}
}

数组中的冒泡排序法

两两比较,大的值往后放,第一次比完最大值就出现在最大索引处,依次比较,可以得到一个排好序的数组。
比较次数:数组长度-1—>length-1
代码如下:

class Test5{
	public static void main(String[] args){
				int[] arr={12,54,66,21,36};
				printArray(arr);
				maoPao(arr);
				printArray(arr);		
	}
	public static void printArray(int[] arr){
		System.out.print("[");
		for(int x=0;x<arr.length;x++){
			if(x==arr.length-1){
				System.out.println(arr[x]+"]");
			}else{
				System.out.print(arr[x]+", ");
			}
		}
	}
		public static void maoPao(int[] arr){
			for(int i=0;i<arr.length;i++){
				for(int j=0;j<arr.length-1-i;j++){
					if(arr[j]>arr[j+1]){
						int temp=arr[j];
						arr[j]=arr[j+1];
						arr[j+1]=temp;
					}
				}
			}
		}
}

二维数组

二维数组:
			其实就是一个元素为一维数组的数组	
	定义格式:
	数据类型[] 数组名称[] ;
	数据类型[][] 数组名称 ;
	动态初始化:
		**二维数组的格式1:**
			数据类型[][] 数组名称 = new 数据类型[m][n] ;
		举例:
			 **int[][] arr = new int[3][2] ;**
		=号左边:
			int:当前数组存储的是int类型的元素
			[][]:定义的是一个二维数组
			arr :数组对象名称
		=号右边:
			new :在堆内存中创建该数组的对象(产生堆内存空间地址)
			int:当前数组存储的是int类型的元素

		[3]: 当前定义的这个二维数组中有3个一维数组
		[2]: 每一个一维数组中有2个长度
注意:
		在一些笔试题:定义变量 进行初始化
			int x, y ;  x 和y是两个int类型的变量
			int x [],y[] ;x和y都是int类型的数组
			int x[][],y[] ; x是一个二维数组,y是一个一维数组

**

二维数组的格式2:**
	指定了一维数组的个数,一维数组的长度需要动态给定
	数据类型[][] 数组名称 = new 数据类型[m][] ;
	举例:
		int[][] arr = new int[3][] ;
	**二维数组的格式3:**
		就是静态初始化
		数据类型[][] 数组名称 =
				new 数据类型[][]{{元素1,元素2,元素3..},{元素1,元素2,元素3,...},{,}};
		简写格式:
	数据类型 [][] 数组名称 = {{元素1,元素2,元素3..},{元素1,元素2,元素3,...},{,}};
		举例:
			int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9}} ;
			--->简写格式       int[][] arr = {{1,2,3},{4,5,6},{7,8,9}} ;

二维数组的遍历:

/*
	二维数组的遍历
	
	外层循环:其实是一维数组的个数(arr.length)
	内层循环:其实每一个一维数组的长度(arr[x].length)
	
	最终让你以:{{1,2,3},{4,5},{6}}按照这个格式
	
*/
	
	   

class Array2Test{
	public static void main(String[] args){
		
		//定义一个二维数组,静态初始化:
		int[][] arr = {{1,2,3},{4,5},{6}};  
	
		//调用遍历的功能
		printArray2(arr) ;
	}
	/*
		两个明确
			1)明确返回值类型:void
			2)明确参数类型以及参数个数
				1个参数 int类型二维数组
					
	*/
	public static void printArray2(int[][] arr){
		//输出以下左大括号
		System.out.print("{");
		//遍历
		for(int x = 0 ; x < arr.length; x++){//外层循环是一维数组的个数
			//先输出左大括号
			System.out.print("{");
			//遍历一维数组的元素
			for(int y = 0 ; y < arr[x].length ; y++){
				//判断
				//如果是二维数组的最后一个元素
				if(x == arr.length-1){
					//输出元素值以及后面的}
					System.out.print(arr[x][y]+"}") ;
					
					//如果当前元素取到的一维数组的最后一个元素
				}else if(y == arr[x].length-1){
					//输出元素内容以及}以及,
					System.out.print(arr[x][y]+"}"+",") ;
				}else{
					System.out.print(arr[x][y]+",") ;
				}
			}
			
		}
		//输出整个右}
		System.out.print("}");
	}
}

二维数组案例杨辉三角打印

/*
     1
    1 1
   1 2 1
  1 3 3 1 
 1 4 6 4 1 
1 5 10 10 5 1		*/
import java.util.Scanner;
class YH{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个数:");
		int rows = sc.nextInt();
		int[][] yh = new int [rows][];
		for( int i = 0 ; i < rows ; i++ )
		{
			yh[i] = new int[i+1];
		}
		for( int i = 0 ; i < yh.length ; i++)
		{
			yh[i][0]=1;
			yh[i][i]=1;
		}
		//计算
		for(int i = 2 ; i < yh.length; i++ ){
			for( int j = 1 ; j < i ; j++ )
			{
				//当前位置的值 = 上一行的同列 + 上一行的前一个列
				yh[i][j] = yh[i-1][j-1]+yh[i-1][j];
			}
		}
		
		
		for( int i = 0 ; i < yh.length ; i++  ){
			//标准杨辉三角格式打印,如需直角三角形则删除该for循环代码块
			for (int j = rows - 1 ; j > i ; j --){
				System.out.print("\t");
			}
				
			for(int j = 0 ; j < yh[i].length ; j ++)
			{
				System.out.print("\t"+yh[i][j]+"\t");
			}
			System.out.println();
		}
		
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值