数组练习、内存、方法介绍
一.数组的练习
package com.code.day05;
import java.util.Random;
import java.util.Scanner;
public class Day05Array {
public static void main(String[] args) {
/**
* 获取数组最大值
* 步骤:
* 1.定义一个变量max,用于接收两个元素之间的较大值
* 2.遍历数组,将每一个元素获取出来
* 3.判断,如果max<遍历出来的元素,证明遍历出来的元素大
* 4.将大的重新赋值给max
* 5.输出max
*/
int max = 0;
int[] array1 = {54, 3, 4, 6, 7, 5, 54, 7, 8};
for(int i = 0; i < array1.length; i++){
if(max < array1[i]){
max=array1[i];
}
}
System.out.println(max);
/**
* 随机产生10个[0,100]之间整数,统计既是3又是5,但不是7的倍数的个数
* 步骤:
* 1.创建Random对象
* 2.创建一个数组,保存10个随机数
* 3.循环随机10个整数,放到数组中保存起来
* 4.定义一个count,表示出现个数
* 5.遍历数组,将每一个元素获取出来,根据条件判断,如果符合条件count++
* 6.输出count
*/
Random random = new Random();
int[] array2 = new int[10];
for(int i = 0; i < array2.length; i++){
array2[i] = random.nextInt();
}
int count = 0;
for(int j =0;j<array2.length;j++){
if(array2[j]%3==0 && array2[j]%5==0 && array2[j]%7!=0){
count++;
}
}
System.out.println( count);
/**
* 用一个数组存储本组学员的姓名,从键盘输入,并遍历显示
*/
String[] array3 = new String[5];
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学员姓名:");
for(int i = 0; i < array3.length; i++){
array3[i] = scanner.next();
}
for(int i = 0; i < array3.length; i++){
System.out.println(array3[i]);
}
}
}
二、内存
1.内存概述:就是运行内存,说的直白点就是(内存条),在java的世界里,将内存分为了5块,每一块都有自己的作用
2.内存的作用:运行应用程序的地方
3.java中内存五大区域:
(1)栈(Stack):
所有的方法都会在栈内存中运行,以及方法中的变量
(2)堆(Heap):
所有引用类型的数据,而且每new一次,都会在堆内存中占用一片空间,堆内存会为每个空间自动分配一个地址值
而且堆内存中的数据是有默认值的:
整数: 0
小数: 0.0
字符: ‘\u0000’
布尔: false
引用: null
(3)方法区(Method Area):
是所有代码运行之前的"预备区",代码在运行前都要先被加载到内存中(方法区)
(4)本地方法栈(Native Method Stack):
专门运行带native关键字的方法(带native的方法叫做本地方法)
本地方法可以理解为是对java实现不了的功能进行功能上的扩充
(5)寄存器(pc register):和cpu有关
三、复杂数组操作
public class Day05ComplexArray {
public static void main(String[] args) {
/**
* 数组扩容
*
* 数组扩容需要创建新数组,然后吧老数组的元素复制到新数组中,然后将新数组的地址值赋值给老数组
*/
int[] arr1 = {1,2,3};
//创建新数组
int[] arr2 = new int[6];
//将arr1中的元素放到arr2数组中
for (int i = 0; i< arr1.length; i++) {
arr2[i] = arr1[i];
}
//将arr2的地址值赋值给arr1
arr1 = arr2; //扩容成为6个元素的数组
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
/**
* 数组合并
*/
int[] arr3 = {1,2,3};
int[] arr4 = {4,5,6};
int[] arr5 = new int[arr3.length + arr4.length];
for (int i = 0; i < arr3.length; i++){
arr5[i] = arr3[i];
}
for(int j =0 ;j< arr4.length; j++){
arr5[arr3.length + j] = arr4[j];
}
for (int f=0 ; f< arr5.length; f++){
System.out.println(arr5[f]);
}
}
}
四、二维数组
1、二维数组介绍
1.概述:数组中嵌套多个一维数组
2.格式:
(1)动态初始化:
数据类型[][] 数组名 = new 数据类型[m][n]
数据类型 数组名[][] = new 数据类型[m][n]
数据类型[] 数组名[] = new 数据类型[m][n]
m:代表的是二维数组的长度 二维数组中有多少个一维数组
n:代表的是每一个一维数组的长度 一维数组中最多能存多少个数据
注意:数据类型[][] 数组名 = new 数据类型[m][] 代表的是二维数组中的一维数组没有创建出来
(2)静态初始化:
数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2…},{元素1,元素2…}…}
数据类型 数组名[][] = new 数据类型[][]{{元素1,元素2…},{元素1,元素2…}…}
数据类型[] 数组名[] = new 数据类型[][]{{元素1,元素2…},{元素1,元素2…}…}
(3)简化静态初始化:
数据类型[][] 数组名 = {{元素1,元素2…},{元素1,元素2…}…}
2、二维数组方法介绍
(1)获取二维数组长度
int[][] array1 = new int[][] {{1,2,3},{4,5,6},{7,8,9}};
System.out.println(array1.length);
(2)获取二维数组元素
String[][] array2 ={{"乔峰","虚竹","段誉"},{"张无忌","灭绝","周芷若"},{"郭靖","黄蓉"}};
System.out.println(array2[1][1]);
System.out.println(array2[2][0]);
System.out.println(array2[0][2]);
(3)二维数组中存储元素
String[][] array3 = new String[3][3];
array3[0][0] = "乔峰";
array3[0][1] = "虚竹";
array3[0][2] = "段誉";
array3[1][0] = "张无忌";
array3[1][1] = "灭绝";
array3[1][2] = "周芷若";
array3[2][0] = "郭靖";
array3[2][1] = "黄蓉";
array3[2][2] = "小龙女";
System.out.println(array3[1][1]);
System.out.println(array3[2][0]);
System.out.println(array3[0][2]);
System.out.println(array3[1][2]);
System.out.println(array3[2][2]);
System.out.println(array3[2][1]);
System.out.println(array3[0][0]);
System.out.println(array3[0][1]);
System.out.println(array3[1][0]);
System.out.println(array3[1][1]);
(4)二维数组的遍历
int[][] arr = new int[3][3];
arr[0][0] = 10;
arr[0][1] = 20;
arr[0][2] = 30;
arr[1][0] = 100;
arr[1][1] = 200;
arr[1][2] = 300;
arr[2][0] = 1000;
arr[2][1] = 2000;
arr[2][2] = 3000;
for(int i = 0 ; i<arr.length;i++){
for (int j =0 ; j<arr[i].length;j++){
System.out.println(arr[i][j]);
}
}
五、方法
1、方法概述
1.概述:拥有功能性代码的代码块
将来开发,一个按钮(功能)就应该对应一个方法,点击这个按钮(执行了这个功能)就会执行对应的方法
2.通用定义格式:
修饰符 返回值类型 方法名(参数){
方法体
return 结果
}
3.在通用格式基础上细分:
a.无参无返回值方法
b.有参无返回值方法
c.无参有返回值方法
d.有参有返回值方法
2、无参无返回值方法
1.格式:
public static void 方法名(){
方法体
}
在其他方法中:方法名() 想要让方法执行起来,就需要在main方法中调用该方法
2.注意:
(1)void和return 结果不能共存,void代表没有返回值,return 结果代表有返回值
(2)方法不调用不执行,main方法是jvm自动调用的
(3)方法的执行顺序只和调用顺序有关系->先调用谁,谁先执行
(4)方法之间是平级关系,不能互相嵌套
3.代码示例:
public class Day05Method {
public static void main(String[] args) {
add();
sub();
}
public static void sub(){
int a = 10;
int b = 20;
System.out.println(a-b);
}
public static void add(){
int a = 10;
int b = 20;
System.out.println(a+b);
}
}
3、有参数无返回值的方法定义和执行流程
1.格式:
public static void 方法名(参数){
方法体
}
2.调用:
方法名(具体的值)
3.代码示例:
public static void main(String[] args) {
add();
sub();
print(10,20);
}
public static void print(int a,int b){
System.out.println(a+b);
}
4、无参数有返回值定义以及执行流程
1.格式:
public static 返回值类型 方法名(){
方法体
return 结果
}
2.调用:
a.打印调用: sout(方法名()) 不推荐
b.赋值调用:
数据类型 变量名 = 方法名() 推荐
3.代码示例:
int result = add2();
System.out.println(result);
public static int add2(){
int a=10;
int b=20;
return a+b;
}
5、有参数有返回值定义以及执行流程
1.格式:
public static 返回值类型 方法名(参数){
方法体
return结果
}
2.调用:
a.打印调用: sout(方法名(具体的值)); 不推荐
b.赋值调用:
数据类型 变量名 = 方法名(具体的值); 推荐
3.示例代码:
int results = add3(20,20);
System.out.println(result);
System.out.println(results);
public static int add3(int a,int b){
return a+b;
}
6、实参和形参的区别
1.形式参数(形参):在[定义方法]的时候,只是形式上定义了两个参数,此时并没有给参数赋值
2.实际参数(实参):在[调用方法]的时候,给形参赋予了具体的值,实际的值