黑马程序员(Java)----基础语法(五)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

1.9 数组

1.9.1 数组的概念

概念:存储同一种数据类型的多个元素的容器。数组既可以存储基本数据类型,也可以存储引用数据类型

格式:

格式1:数据类型  []  数组名;

格式2:数据类型  数组名  [];

注意:这两种定义做完了,数组中是没有元素值的。如何对数组的元素进行初始化呢?

1.9.2 数组的初始化

数组初始化概述:Java中的数组必须先初始化,然后才能使用。所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。

数组的初始化方式:

动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。

静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。

示例:

class ArrayDemo3{
	public static void main(String [] args){
		//动态初始化:
		int[] arr = new int [3];//定义了一个数组长度为3的int类型数组。
		//静态初始化:
		int[] arr1 = new int[]{1,2,3};
	}
}

1.9.3数组的内存分配

int[] arr = new int[4];

内存分配图:

Java程序在运行时,需要在内存中分配空间。为了提高运算效率,又对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

内存的划分:

栈内存:用于存储局部变量,当变量所属的作用域一旦结束,所占空间会自动释放。

堆内存:数组和对象,通过new建立的实例都存放在堆内存中。每个实例都有地址值,实例中的变量都有默认初始化值,根据类型的不同而不同。整数类型是0,小数类型是0.0或0.0f,boolean类型是false,char类型是‘\u0000‘,引用类型是null。

方法区:(面向对象部分详细讲解)。

本地方法区:(系统相关)。

寄存器:(CPU使用)。

1.9.4 数组操作的练习

练习1:数组遍历,就是依次输出数组的每一个元素

class ArrayTest{
	public static void main(String[] args){
		int[] arr = new int[]{11,22,33,44,55};
		System.out.print("[");
		for(int i = 0;i <= arr.length-1;i++){
			if(i == arr.length-1){
				System.out.print(arr[i]+"]");
			}
			else{
				System.out.print(arr[i]+",");
			}
		}
	}
}

运行结果:

练习2:数组获取最值(获取数组中的最大值最小值)

思路:从数组中任意的找一个元素作为参照物(一般取第一个),默认它就是最大值。然后遍历其他的元素,依次获取和参照物进行比较,如果大就留下来,如果小,就离开。

class ArrayTest2{
	public static void main(String[] args){
		int[] arr = new int[]{1,34,55,66,23};
		int max = getMax(arr);
		System.out.println(max);
	}
	public static int getMax(int[] arr){
		int max = arr[0];
		for(int i = 1;i <= arr.length-1;i++){
			max = (max>arr[i])?max:arr[i];
		}
		return max;
	}
}

运行结果:

练习3:数组元素逆序 (就是把元素对调)

方法1:

class ArrayTest3{
	public static void main(String[] args){
		//定义一个数组,并进行静态初始化。
		int[] arr = new int[]{11,22,33,44,55};
		System.out.print("逆序前:");
		printArray(arr);
		System.out.println();
		System.out.print("逆序后:");
		reverse(arr);
		printArray(arr);
	}
	//逆序数组方法1:
	public static void reverse(int[] arr){
		for(int i = 0;i < arr.length/2;i++){
			int temp = arr[i];
			arr[i] = arr[arr.length-1-i];
			arr[arr.length-1-i] = temp;
		}
	}
	//遍历数组
	public static void printArray(int[] arr){
		System.out.print("[");
		for(int i = 0;i <= arr.length-1;i++){
			if(i == arr.length-1){
				System.out.print(arr[i]+"]");
			}
			else{
				System.out.print(arr[i]+",");
			}
		}
	}
}

运行结果:

方法2:

class ArrayTest3{
	public static void main(String[] args){
		int[] arr = new int[]{11,22,33,44,55};
		printArray(arr);
		System.out.println();
		reverse(arr);
		printArray(arr);
	}
	public static void reverse(int[] arr){
		int start = 0;
		int end = arr.length-1;
		while(start<=end){
			int temp = arr[start];
			arr[start] = arr[end];
			arr[end] = temp;
			start++;
			end--;
		}
	}
	//遍历数组
	public static void printArray(int[] arr){
		System.out.print("[");
		for(int i=0;i<=arr.length-1;i++){
			if(i==arr.length-1){
				System.out.print(arr[i]+"]");
			}
			else{
				System.out.print(arr[i]+", ");
			}
		}
	}
}

运行结果:

1.9.5 数组操作的几个小问题

示例1:ArrayIndexOutOfBoundsException:数组索引越界异常

class ArrayDemo6{
	public static void main(String [] args){
		int[] arr = new int[]{1,2,3};
		System.out.println(arr[3]);
	}
}

运行结果:

示例2:

class ArrayDemo6{
	public static void main(String [] args){
		int[] arr = new int[]{1,2,3};
		arr = null;
		System.out.println(arr[0]);
	}
}

运行结果:

1.9.6 二维数组

格式1:数据类型[][] 数组名 = new 数据类型[m][n];

1、定义了名称为arr的二维数组。

2、二维数组中有m个一维数组。

3、每一个一维数组中有n个元素。

4、一维数组的名称分别为arr[0], arr[1], arr[2]……arr[m-1]。

5、给第一个一维数组第一个脚标位赋值为78写法是:arr[0][1] = 78;。

6、arr存储的是二维数组的初始地址,arr[0]、arr[1]、arr[2]存储的是一维数组的初始地址。

示例1:

class Array2Demo{
	public static void main(String[] args){
		int[][] arr = new int[3][2];
		//打印二维数组的初始地址
		System.out.println(arr);
		//印二位数组中的角标为0的一维数组的地址。
		System.out.println(arr[0]);
		//打印二维数组中的角标为0的一维数组的角标为0的元素
		System.out.println(arr[0][0]);
	}
}

运行结果:

格式2:int[][] arr = new int[3][];

二维数组中有3个一维数组,每个一维数组都是默认初始化值null,可以对这个三个一维数组分别进行初始化。

arr[0] = new int[3];

arr[1] = new int[1];

arr[1] = new int[1];

示例1:

class Array2Demo2{
	public static void main(String[] args){
		//定义数组
		int[][] arr = new int[3][];
		System.out.println(arr);
        <span style="white-space:pre">	</span>System.out.println(arr[0]);
       <span style="white-space:pre">		</span>System.out.println(arr[0][0]);
	}
}

运行结果:

格式3:

数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};

数据类型[][] 数组名 = {{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};

int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};

定义一个名称为arr的二维数组,二维数组中的有三个一维数组,每一个一维数组中具体元素也都已初始化。

第一个一维数组 arr[0] = {3,8,2};,第二个一维数组 arr[1] = {2,7};,第三个一维数组 arr[2] = {9,0,1,6};。

第三个一维数组的长度表示方式:arr[2].length;。

示例1:

class Array2Demo3{
	public static void main(String[] args){
		 int[][] arr = new int[][]{{3,8,2},{2},{9,4}};
		 System.out.println(arr);
		 System.out.println(arr[0]);
		 System.out.println(arr[1]);
		 System.out.println(arr[2]);

		 System.out.println(arr[0][1]);
		 System.out.println(arr[1][1]);
		 System.out.println(arr[2][1]);
	}
}

运行结果:

二维数组的练习1:遍历二维数组

class Array2Test{
	public static void main(String[] args){
		int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
		printArray2(arr);
	}
	public static void printArray2(int[][] arr){
		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();
		}
	}
}

运行结果:

二维数组练习2:公司年销售额求和

/*
公司年销售额求和
某公司按照季度和月份统计的数据如下:单位(万元)
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99

*/
class Array2Test2{
	public static void main(String[] args){
		int [][] arr = new int[][]{{22,66,44},{77,33,88},{25,45,65},{11,66,99}};
		int sum = getSum(arr);
		System.out.println(sum);

	}

	public static int getSum(int[][] arr){
		int sum = 0;
		for(int x=0;x<arr.length;x++){
			for(int y=0;y<arr[x].length;y++){
				sum+=arr[x][y];
			}
		}
		return sum;
	}
}

运行结果:

思考题:

1、看程序,写结果:

/*
	思考题1:看程序写结果,然后分析为什么是这个样子的。并画图讲解。最后总结Java中参数传递规律。
*/
class ArgsDemo {
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		System.out.println("a:"+a+",b:"+b); //a:10,b:20
		change(a,b);
		System.out.println("a:"+a+",b:"+b); //a:??,b:??

		int[] arr = {1,2,3,4,5};
		change(arr);
		System.out.println(arr[1]); //???
	}

	public static void change(int a,int b) {
		System.out.println("a:"+a+",b:"+b); //a:10,b:20
		a = b;	//a=20
		b = a + b; //b=40
		System.out.println("a:"+a+",b:"+b); //a:20,b:40
	}

	public static void change(int[] arr) { //arr={1,2,3,4,5};
		for(int x=0; x<arr.length; x++) {
			if(arr[x]%2==0) {
				arr[x]*=2;
			}
		}//int[] arr={1,4,3,8,5}
	}
}

运行结果:

为什么会出来这样的结果呢?在Java中,基本类型的形式参数的改变对实际参数没有影响。引用类型的形式参数的改变直接影响实际参数。

2、某个公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全,在传递过程中需要加密,加密规则如下:首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字,最后将第一位和最后一位数字交换。 请任意给定一个小于8位的整数,然后,把加密后的结果在控制台打印出来。

class JiaMiDemo{
	public static void main(String[] args){
		//定义一个不大于8位数据
		int number = 123456;
		//定义一个数组
		int[] arr = new int[8];
		//定义一个索引
		int index = 0;
		//把数据中每一位上的数据获取到后存储到数组中
		while(number>0){
			arr[index]=number%10;
			index++;
			number/=10;
		}
		//每位数字都加上5,再用和除以10的余数代替该数字
		for(int x = 0;x <index;x++){
			arr[x]+=5;
			arr[x]%=10;
		}
		//最后将第一位和最后一位数字交换
		int temp = arr[0];
		arr[0] = arr[index-1];
		arr[index-1] = arr[0];

		for(int x = 0;x<index;x++){
			System.out.print(arr[x]);
		}
	}
}

运行结果:

将上面的代码改进一下:把数据改进为键盘录入,把代码改进为方法实现。

import java.util.Scanner;
class JiaMiDemo2{
	public static void main(String[] args){
		//键盘录入
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个数据(小于8位):");
		int number = sc.nextInt();

		String result = jiaMi(number);
		System.out.println("加密后的结果:"+result);
	}
	/*
	写一个功能,把数据number实现加密。
	两个明确:
		返回值类型:String 做一个字符串的拼接
		参数列表:int number
	*/
	public static String jiaMi(int number){
		//定义数组
		int[] arr = new int[8];
		//定义索引
		int index = 0;
		//把number中的数据放到数组中
		while(number>0){
			arr[index]=number%10;
			index++;
			number/=10;
		}
		//把每个数据加5,对10取余数
		for(int x = 0;x < index;x++){
			arr[x]+=5;
			arr[x]%=10;
		}
		//交换第一位和最后一位的数据
		int temp = arr[0];
		arr[0] = arr[index-1];
		arr[index-1] = temp;
		//把数组的元素拼接成一个字符串返回
		//定义一个空内容字符串
		String s = "";
		for(int x = 0; x < index;x++){
			s+=arr[x];
		}
		return s;
	}
}		

运行结果:

经验证,正确。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 00:46:25

黑马程序员(Java)----基础语法(五)的相关文章

黑马程序员——Java基础语法(一) --- 关键字、标识符、注释、常量和变量、运算符

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 本篇博文主要总结java的基础语法,主要的内容包括:关键字.标识符.注释.常量和变量.运算符几部分. 一.关键字 关键字是被Java语言赋予了特殊含义的单词.关键字中所有的字母都是小写. java中的关键字主要包括如下几部分: 1.用于定

黑马程序员——Java基础语法(二)---流程控制

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 本文主要介绍java基础语法中的流程控制,流程控制是我们写出灵活代码的基础.常见的流程控制主要有四类:判断结构.选择结构.循环结构.其他控制结构 一.判断结构 判断结构的标志是if语句,if语句主要有三种表现形式: 1.if(条件表达式) { 执行语句 } 注意: 1.如果if语句中只有一条语句,那么可以不写大括号.不过初学者一定要写括号,以免出错. 2.如果if语句没写大括号,if就只能控制

黑马程序员---java基础语法---关键字,常量,变量,运算符

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 第一讲:java语言基础 1.关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有字母都为小写 用于定义数据类型的关键字  class interface byte short int  long  float

黑马程序员——Java基础语法(三)---数组

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 本篇博文主要的内容是java语法的第三部分--数组,数组同一种类型数据的集合.其实,数组就是一个容器.数组可以自动给数组中的元素从0开始编号,方便操作这些元素. 一.数组的定义 数组的格式一:元素类型[] 数组名 = new 元素类型[元素个数或数组长度];如:int[] arr=new int[5]; 数组定义的格式二:元素类型[]数组名=new元素类型[]{元素,元素,……

黑马程序员——Java基础语法(一)

Java语言的基础组成  1. 关键字 关键字的概念:被Java赋予了特殊涵义的单词. 特点:体现上都是英文小写. Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间. 1. 用于定义数据类型的关键字 基本数据类型(四类八种): 整数类型:byte  short  int  long   浮点类型:float  double 字符类型:char                            布尔型:boolean byte:取值范围-2^

黑马程序员——Java基础语法---数组

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 一.概念         同一种类型数据的集合.简单的来说就是一容器,用来装东西的. 使用数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素. 二.一维数组的格式 格式1:元素类型 [ ]数组名 = new 元素类型 [元素

黑马程序员——Java基础语法---流程控制与函数

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! -------       程序控制流 一.程序流程控制 也称语句,主要有:判断结构.选择结构和循环结构. 1. 判断结构——if if语句的三种格式: a)  if(条件表达式) { 执行语句: } b)  if(条件表达式) { 执行语句: } el

黑马程序员---java基础语法--流程控制与函数

-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 一.程序流程控制 也称语句,主要有:判断结构.选择结构和循环结构. 1. 判断结构——if if语句的三种格式: a)  if(条件表达式) { 执行语句: } b)  if(条件表达式) { 执行语句: } else { 执行语句: } c)  if(条件表达式) { 执行语句: } else  if (条件表达式) { 执行语句 } …… else { 执行语句: } if

黑马程序员——Java基础语法(三) 函数

-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 函数 1. 定义:Java中,函数也叫方法,是具有特定功能的一段独立小程序. 2.格式 :修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2)  { 执行语句; return 返回值; } 返回值类型:函数运行后的结果的数据类型. 参数类型:形式参数的数据类型. 形式参数:是一个变量,用于存储调用函数时传给函数的实际参数. 实际参数:传递给形式参数的具体值.

黑马程序员——Java基础语法(二)语法结构

-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ Java 中的语法结构有四种 顺序结构:顾名思义,就是按照顺序执行语句 判断结构:if  switch 选择结构: 循环结构:for  while   do while 1. if 结构 if语句有三种结构. (1)if(条件表达式){执行语句;} (2)if(条件表达式){执行语句;} else{执行语句;} (3)if(条件表达式){执行语句;} else if(条件表达式