一、数组
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
);
/*
^
运算符的特点
一个数
,
被另外一个数
, 异或两次, 该数本身不变
*/
从