Java- 数组、方法/debug/、进制、二维数组

本文介绍了Java中的数组,包括数组的定义、动态初始化、元素访问和内存分配。详细讲解了如何通过索引访问数组元素,以及数组在栈内存和堆内存中的存储情况。此外,还展示了数组元素的求和、查找最大值、键盘录入和数组操作等实例。最后,涉及了方法的概念、调用过程、参数传递以及方法重载。
摘要由CSDN通过智能技术生成

一、数组

1.1 数组介绍

数组就是存储数据 长度固定的容器 ,存储多个数据的 数据类型要一致

1.2 数组的定义格式

int [] arr ;
double [] arr ;
char [] arr ;

1.3 数组的动态初始化

数组动态初始化就是只给定数组的长度,由系统给出默认初始化值

数据类型[] 数组名 = new 数据类型[数组长度];

int[] arr = new int[3];

注意 :
打印数组变量的时候 , 会打印出数组的内存地址
[I@10f87f48 :
@ : 分隔符
[ : 当前的空间是一个数组类型
I : 当前数组容器中所存储的数据类型
10f87f48 : 十六进制内存地址
0 1 2 3 4 5 6 7 8 9 a b c d e f

1.4 数组元素访问

1.4.1 什么是索引

每一个存储到数组的元素,都会自动的拥有一个编号,从 0 开始。
这个自动编号称为数组索引 (index) ,可以通过数组的索引访问到数组中的元素。

 

1.4.2访问数组元素格式

数组名[索引];

1.5 内存分配

1.5.1 内存概述

内存是计算机中的重要原件,临时存储区域,作用是运行程序。
我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。
必须放进内存中才能运行,运行完毕后会清空内存。
Java
虚拟机要运行程序,必须要对内存进行空间的分配和管理

1.5.2 java中的内存分配

目前我们只需要记住两个内存,分别是:栈内存和堆内存
方法区   存储可以运行的class文件。
堆内存  存储对象或者数组,new来创建的,都存储在堆内存。
方法栈   方法运行时使用的内存,比如main方法运行,进入方法栈中执行。
寄存器   给CPU 使用,和我们开发无关。
本地方法栈  JVM在使用操作系统功能的时候使用,和我们开发无关。

 

多个数组指向相同内存图

i
输出[11,22,33,44,55]
 */
int[] arr = {11,22,33,44,55};
printArray(arr);

public static void printArray(int[] arr){
    System.out.print("[");
    for (int i = 0; i < arr.length; i++) {
        if (i == arr.length-1){
            System.out.println(arr[i]+"]");
        }else {
            System.out.print(arr[i] + ",");

        }
    }

1.6 数组获取最大值

需求: 从数组中查找最大值
 int[] arr = {12,45,98,73,60};
实现步骤:
 1. 假设数组中的第一个元素为最大值
 2. 遍历数组, 获取每一个元素, 准备进行比较
 3. 如果比较的过程中, 出现了比max更大的, 让max记录更大的值
   4. 循环结束后, 打印最大值.
 */

int max = arr[0];
for (int i = 1; i < arr.length; i++) {
    if (arr[i]>max){
        max = arr[i];

    }
}
System.out.println(max);

1.7 数组元素求和

/*
需求:键盘录入 5 个整数,存储到数组中,并对数组求和
思路:
1. 创建键盘录入对象,准备键盘录入
2. 定义一个求和变量,准备记录累加后的结果
3. 动态初始化一个长度为 5 int 数组
储键盘录入的数值
4. 将键盘录入的数值存储到数组中
5. 遍历数组,取出每一个元素,并求和
6. 输出总和
*/

 

Scanner sc = new Scanner(System.in);
int [] arrc = new int[5];
int sum = 0;
for (int i = 0; i < arrc.length; i++) {
    System.out.println("请输入第"+(i+1)+"个整数");
    arrc[i] = sc.nextInt();
}
for (int i = 0; i < arrc.length; i++) {
    sum += arrc[i];
}
System.out.println("存储的数组为:" + arrc);
System.out.println("数组的累加和为:" + sum);

1.8 数组基本查找

需求: 已知一个数组 arr = {19, 28, 37, 46, 50}; 键盘录入一个数据,查找该数据在数组中的索引,并在控 制
台输出找到的索引值。
思考
1、定义一数组并且用静态初始化完成初始化
2、定义一个变量,存储需要查找的变量
3、定义一个-1的索引初始变量,假设没找到值索引都是-1
4.、循环变量数组并比较,如果录入的值存在数组中,则重新赋值给索引变量并结束循环
5、输出所以
int [] arrd = {19, 28, 37, 46, 50};
System.out.println("请输入您需要查找的值:");
int num = sc.nextInt();
int index = -1;
for (int i = 0; i < arrd.length; i++) {
    if(arrd[i] == num){

        index = i;
        break;
    }
}
System.out.println("您查找值得索引为:"+index);

 

1.9 评委打分

 /*
        需求:在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。 选手的最后得分为:去掉一个
         最高分和一个最低分后 的4个评委平均值 (不考虑小数部分)。
        */
思路:
1.定义一个数组,用动态初始化完成数组元素的初始化, 长度为 6
2. 键盘录入评委分数
3. 由于是 6 个评 委打分,所以,接收评委分数的操作,用循环 4.
求出数组最大值
5. 求出数组最小值
6. 求出数组总和
7. 按照计
算规则进行计算得到平均分
8.输出平均分
        int [] arre = new int[6];
        System.out.println(arre.length);
        for (int i = 0; i < arre.length; i++) {
            System.out.println("请输入第"+(i+1)+"评委分数");
            int score = sc.nextInt();
            if(score>=0 && score<=100){
                arre[i] = score;
            } else {
                System.out.println("您输入的分数有误,请重试");
                i--;
            }
        }
//        for (int i = 0; i < arre.length; i++) {
//            System.out.println("评委分数为"+arre[i]);
//
//        }
        sum = 0;
        int maxn   = arre[0];
        for (int i = 0; i < arre.length; i++) {
            if (arre[i]>maxn){
                maxn = arre[i];
            }

        }
        int min = arre[0];
        for (int i = 0; i < arre.length; i++) {
            if (arre[i]<min){
                min = arre[i];
            }
        }
        for (int i = 0; i < arre.length; i++) {
            sum +=  arre[i];

        }

        int avg = (sum - maxn - min)/4;
        System.out.println("最终得分为:"+avg);


    }
}

二、Debug

2.1 什么是Debug模式

是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序。

2.2 Debug介绍与操作流程

  • 如何加断点
    • 选择要设置断点的代码行,在行号的区域后面单击鼠标左键即可
  • 如何运行加了断点的程序
    • 在代码区域右键Debug执行
  • 看哪里
    • Debugger窗口
    • Console 窗口
  • 点哪里
    • Step Into (F7)这个箭头,也可以直接按F7
  • 如何删除断点
    • 选择要删除的断点,单击鼠标左键即可
    • 如果是多个断点,可以每一个再点击一次。也可以一次性全部删除

 

三、方法

3.1 方法的概念

方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集

注意:

方法必须先创建才可以使用, 该过程成为方法定义
方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程成为方法调用

 3.2 方法的调用过程

总结:
方法没有被调用的时候,都在 方法区中的字节码文件(.class)中存储。
每个方法在被调用执行的时候,都会 进入栈内存, 并且拥有自己独立的内存空间,方法内部代码调用 完毕之后,会从栈内存中弹栈消失。
如果 方法传递的引用数据类型数组 并进行了修改,因为是同一地址的堆内存,所以会发生改变,
如果 方法传递基本数据类型的变量 ,即便发生了改变只是针对自己栈帧空间,执行结束后就会被释放,所以不会发生改变。

/*
需求:判断一个数是奇数还是偶
 */

public static void method() {
    int num = 11;
    if (num % 2 == 0) {
        System.out.println("该数字为偶数");

    } else {
        System.out.println("该数字为奇数");

    }
}

 3.3 带参数方法的定义和调用

3.3.1 带参数方法定义和调用

定义格式:

参数:由数据类型和变量名组成 - 数据类型 变量名
参数范例: int a
注意:
方法定义时,参数中的 数据类型与变量名都不能缺少 ,缺少任意一个程序将报错
方法定义时,多个参数之间使用逗号 ( ) 分隔
方法调用时, 参数的数量与类型必须与方法定义中的设置相匹配, 否则程序将报错

3.3.2 形参和实参

1. 形参:方法定义中的参数
等同于变量定义格式,例如: int number
2. 实参:方法调用中的参数
等同于使用变量或常量,例如: 10 number
/*
需求:设计一个方法(print) 用于打印 n 到 m 之间所有的奇数
 */
public static void allJisum(int n,int m) {
    for (int i = n; i <= m; i++) {
        if (i % 2 == 1) {
            System.out.println(i);

 3.4 带返回值方法的定义和调用

3.4.1 带返回值方法定义和调用(掌握)

定义格式

public static 数据类型 方法名 ( 参数 ) {
        return 数据 ;
}
public static boolean isEvenNumber ( int number ) {
return true ;
}
public static int getMax ( int a , int b ) {
return 100 ;
}
注意: 方法定义时 return后面的返回值与方法定义上的数据类型要匹配 ,否则程序将报错
调用格式
方法名 ( 参数 ) ;
数据类型 变量名 = 方法名 ( 参数 ) ;
isEvenNumber ( 5 ) ;
boolean flag = isEvenNumber ( 5 );
方法的返回值通常会使用变量接收,否则该返回值将无意义
需求:设计一个方法可以获取两个数的较大值,数据来自于参数
 */
public static int getMax(int a, int b ){
    if (a < b ){
        return b;
    }else {
        return a;
    }
}

 3.5 方法的注意事项

3.5.1总结

格式:
public static 返回值类型 方法名 ( 参数 ) {
方法体 ;
return 数据 ;
}

解释:
  • public static 修饰符,目前先记住这个格式
  • 返回值类型 方法操作完毕之后返回的数据的数据类型
  • 如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return
  • 方法名 调用方法时候使用的标识
  • 参数 由数据类型和变量名组成,多个参数之间用逗号隔开
  • 方法体 完成功能的代码块
  • return 如果方法操作完毕,有数据返回,用于把数据返回给调用者
定义方法时,要做到两个明确
  • 明确返回值类型:主要是明确方法操作完毕之后是否有数据返回,如果没有,写void;如果有,写对应的数据类型
  • 明确参数:主要是明确参数的类型和数量

调用方法时的注意:
  • void类型的方法,直接调用即可
  • 非void类型的方法,推荐用变量接收调用

3.5.1注意项

方法不能嵌套定义
public class MethodDemo {
        public static void main ( String [] args ) {
}
        public static void methodOne () {
                public static void methodTwo() {
                // 这里会引发编译错误!!!
}
}
}
void表示无返回值,可以省略return,也可以单独的书写return,后面不加数据
return 语句下面,不能编写代码,因为永远执行不到,属于无效代码
public static void allJisum(int n,int m) {
    if (n>m){
        System.out.println("输入数据有误请检查");
        return;
    }
    for (int i = n; i <= m; i++) {
        if (i % 2 == 1) {
            System.out.println(i);

一般我们在方法最开始的时候,有个间断性判断,如果数据有问题给个提示,直接将方法弹出来,正确的逻辑就不会执行

 

 3.6 方法重载

方法重载概念 
同一类中,方法名相同,参数不同的方法
参数不同:个数不同、类型不同、顺序不同。

 3.7 方法的参数传递

3.7.1 方法参数传递基本类型(理解)

结论:
基本数据类型的参数,形式参数的改变,不影响实际参数
结论依据:
每个方法在栈内存中,都会有独立的栈空间,方法运行结束后就会弹栈消失

3.7.2 方法参数传递引用类型
结论:
对于引用类型的参数,形式参数的改变,影响实际参数的值
结论依据:
引用数据类型的传参,传入的是地址值,内存中会造成两个引用指向同一个内存的效果,所以即使 方法弹栈 ,堆内存中的数据也已经是改变后的结果。
/*
需求:设计一个方法,该方法能够同时获取数组的最大值,和最小值
注意: return语句, 只能带回一个结果.
*/

public static int[] getMaxandMin (int[] arr){
    int max = arr[0];
    int min = arr[0];
    for (int i = 1; i < arr.length; i++) {
        if (arr[i] > max){
            max = arr[i];
        }
    }

    for (int i = 1; i < arr.length; i++) {
        if (arr[i] < min){
            min = arr[i];
        }
    }
    int[] arra = {max,min};
    return arra;

四、进制

4.1 进制的书写

/*

十进制: Java 中,数值默认都是 10 进制,不需要加任何修饰。
二进制:数值前面以 0b 开头, b 大小写都可以。
八进制:数值前面以 0 开头。
十六进制:数值前面以 0x 开头, x 大小写都可以。
注意 : 书写的时候, 虽然加入了进制的标识, 但打印在控制台展示的都是十进制数据.
*/

4.2 任意进制到十进制的转换

 

4.3 十进制到任意进制的转换

4.3.1 : 十进制到二进制的转换
公式:除基取余使用源数据,不断的除以基数(几进制,基数就是几)得到余数,直到商为 0 ,再将余数倒着拼起来即可。

 

 

结论:十进制到任意进制的转换
公式:除基取余使用源数据,不断的除以基数(几进制,基数就是几)得到余数,直到商为 0 ,再将余数倒着 拼起来即可

4.4快速进制转换法

8421码:

又称BCD码,每一位二进制值的1都是代表一个固定数值,把每一位的1代表的十进制数加起来得到的结果就是它所代表的 十进制数。

 

4.5 原码反码补码

 

 前言 : 计算机中的数据,都是以二进制补码的形式在运算,而补码则是通过反码和原码推算出来的

原码 :(可直观看出数据大小)

就是二进制定点表示法,即最高位为符号位,【0】表示正,【 1 】表示负,其余位表示数值的大小。 通过一个字节表示+7 -7 ,代码: byte b1 = 7; byte b2 = -7; 一个字节等于 8 个比特位,也就 8 个二进制位
0(符号位 ) 0000111
1(符号位 ) 0000111

反码 : 正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码 : (数据以该状态进行运算)正数的补码与其原码相同;负数的补码是在其反码的末位加1 

 

 

4.6 位运算-基本位运算符

位运算概述 : 位运算符指的是二进制位的运算,先将十进制数转成二进制后再进行运算。在二进制位运算中, 1 表 示true 0 表示 false

public static void main ( String [] args ) {
System . out . println ( 6 & 2 );

运算逻辑:
& 位与 : false false, 0 0
00000000 00000000 00000000 00000110     // 6 的二进制
00000000 00000000 00000000 00000010    // 2的二进制
-----------------------------------------
00000000 00000000 00000000 00000010   //    结果 : 2

 

 

System.out.println(~6);

运算逻辑:
~ 取反 : 全部取反 , 0 1, 1 0 ( 也包括符号位 )
00000000 00000000 00000000 00000110 // 6 的二进制补码
~ 11111111 11111111 11111111 11111001
                                                                        - 1 // -1求反码
------------------------------------
11111111 11111111 11111111 11111000 // 反码推原码
10000000 00000000 00000000 00000111 // -7

 

位运算符介绍 :

System . out . println ( 12 << 1 ); // 24
System . out . println ( 12 << 2 ); // 48

运算原理:

<< 有符号左移运算, 二进制位向左移动, 左边符号位丢弃, 右边补齐0
运算  : 向左移动几位, 就是乘以2的几次幂
12 << 2
(0)0000000 00000000 00000000 000011000 // 12 的二进制
>> 有符号右移运算, 二进制位向右移动, 使用符号位进行补位
        运算规律: 向右移动几位, 就是除以2的几次幂
000000000 00000000 00000000 0000001(1) // 3 的二进制
>>> 无符号右移运算符 , 无论符号位是 0 还是 1 ,都补 0    用的非常少
010000000 00000000 00000000 00000110 // -6 的二进制
System . out . println ( 10 ^ 5 ^ 10 );
/*
^ 运算符的特点
一个数 , 被另外一个数 , 异或两次, 该数本身不变
*/

从     

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值