一、Java程序运行机制
1、.java:称之为源文件或者源码文件,用于编写指定java代码
2、.class:字节码文件,用于计算机运行java程序
3、javac:编译指令,将指定的.java文件编译成指定的.class文件
4、java:运行命令,在jvm虚拟机上运行指定的.class文件
二、变量
1、格式:数据类型 变量=值;
2、特点
(1)随机性:变量存储位置不固定
(2)唯一性:变量的地址唯一,按照指定规则定义变量名,代替地址的记忆
(3)目前定义的变量称为局部变量,只针对某个代码块起作用,必须定义初始值
三、数据类型
分类
1、引用数据类型
String类、接口、数组------》默认值为null(空)
2、基本数据类型
(1)数值型
类型 | 作用 |
byte | 字节型整数,可以视作计算机中最小的存储单位[-128,127] |
short | 短整型,基本不用 |
int | 整数型,是java中默认的整数类型,默认值是0 |
long | 长整型,可以在值后边编写L或l,表示为long型 |
float | 单精度浮点型,值的后面必须定义F或f,表示当前数据是float类型数据 |
doubel | 双精度浮点型,是java中默认的浮点类型,默认值为0.0 |
(2)字符型:char,只能存储一个字符,值必须定义在''中,默认值为空格符号
(3)布尔型:boolean,只有两个值,true(真)/flase(假);主要用于逻辑判断,默认值为flase
3、转义字符
转义字符 | 作用 |
\t | 表示一个制表符,等价于Tab键 |
\n | 表示回车 |
\' | 表示单引号 |
\" | 表示双引号 |
\\ | 表示\ |
4、数据类型转换
(1)纵向不能转换,横向可以任意转换
byte
short--->>>int---->long---->float---->double
char
(2)ASCII值(字符与数值对照表)
字符 | ASCII值 |
A-Z | 65-90 |
a-z | 97-122 |
'0'-'9' | 48-57 |
(3)转换(强制类型转换)-----》将大的值赋值给小的数据类型 自转----》将小的赋值给大的数据类型
①格式:小的数据类型 变量名=(小的数据类型)大的值;
②不足:造成数据精确度降低
③没有四舍五入操作,直接将数值超过的部分分割掉
四、运算符
作用:使用Java中指定的运算符号,按照指定规则连接操作多个数据
1、分类
赋值运算符:+= -= *= /= =
算数运算符:+ - * / % ++ --
①+:当操作双方都是基本数据类型时(除了布尔型以外),则进行和的运算,当操作的变量有一个是String类型时,从String类型值开始进行拼接操作
②/:当两个操作数的数据类型相同时,结果还是这个数据类型,当两个不同数据类型相除时,结果一定是数据类型较大的那个类型
③%:取模(取余) 获取两个相除后的余数部分,余数结果的正负与被除数有关
④++:表示在原有值的基础上进行+1;再将结果赋值给当前变量,等效于+=1操作
简述++的运算规则:
当作为单条语句定义时,则++定义在变量前或者变量后,结果没有区别
当作为组合语句定义时,则++定义在变量前,先自身+1,再执行操作;++定义再变量后,先执行操作,操作完成后再自身+1
关系(比较)运算符:>、>=、<、<=、==、!= (结果为布尔类型且只适用于数值型和字符型的比较)
字符串类型的比较相等:equels,equalsIgnoreCase(不区分大小写)
逻辑运算符:&&、||、!
位运算符&(按位与)和逻辑与操作效果一致;|(按位或)和逻辑或操作效果一致。
面试题:简述逻辑与(&&)和按位与(&)的区别:
当前一个表达式能够判断整体表达式的结果时,逻辑与直运行当前;而按位与会执行所有;因此实际开发中推荐使用逻辑与,效率更高。
条件运算符(三元运算符):
(1)格式:(任意的关系表达式或逻辑表达式)?结果1:结果2
2、运算符优先级(由高到低)
(1)只要想要先计算,就将表达式放在()中
(2)!、++、--
(3)算数运算符:*、/、%、+、 -
(4)关系运算符:>、>=、<、<=、==、!=
(5)逻辑运算符:&& ||
(6)条件运算符:(任意表达式或逻辑表达式)?结果1:结果2
(7)赋值运算符:*=、/=、+=、-=、=
五、文本扫描器
1、导入操作:当亲定义的内容不存在当前类中时,需要外部导入
2、关键字:import 包名.类名;
3、包名.类名:专业上称之为全限定路径名
java.util --util表示Java中定义的工具包,Scanner是工具包中一个具体工具类
4、定义
int 变量名=scanner.nextInt();
double 变量名=scanner.nextDouble();
String 变量名=scanner.next();
六、流程控制语句
1、条件语句(if...else... ,switch)
(1)简述if...else...语句与条件运算符的应用场景
当根据关系表达式或逻辑表达式判断后,还需要进行其它代码操作时,推荐使用if...else...语句;如果直接显示结果,推荐使用条件运算符
(2)switch
switch(等值表达式){
case 等值结果1:
可执行操作代码1;
break;
case 等值结果2:
可执行操作代码2;
break;
....
default:
可执行代码n;
}
等值表达式支持5种类型:byte、short、char、int、String
(3)面试题(简述if...else、if语句与switch语句的异同点和应用场景)
①相同点
都是能够进行多个条件判断的语法结构,都支持使用}作为结束标志
②不同点
Ⅰ:if...else,if语句:条件为任意的关系表达式或逻辑表达式,既可以进行等值判断,也可以进行范围判断;判断结果类型一定是布尔类型
Ⅱ:switch语句:条件为等值表达式,只支持等值判断;判断结果的类型支持5种,即byte、short、int、String;其中switch还支持使用break作为结束标志
③应用场景
当判断条件为等值表达式,且值的结果类型是byte、short、char、int、String五种之一,且值的结果可能个数较少时,推荐使用switch语句,效率更高。
2、循环语句(while,do while,for)
初始化;
while(循环判断条件){
循环体;
循环增量;
}
初始化值;
do{
循环体;
循环增量;
}while(循环判断条件);
面试题1:简述while循环和do...while循环的区别
while循环先判断,再执行;do...while先执行一次,再判断
for(初始化值;循环判断条件;循环增量){
循环体;
}
面试题2:简述for循环和while循环的区别,以及应用场景
①区别
在相同条件下,for循环比while循环更节省内存空间
②场景
Ⅰ:已知循环次数(一般指循环初始值在给定的某个范围内)使用for
Ⅱ:未知循环次数使用while
3、结束语句(break,continue)
3.1 死循环
for(;;){
循环体;
}
for(初始化值;循环判断条件;){
循环体;
}
for(初始值;;循环增量){
循环体;
}
3.2 结束语句
①流程控制语句:break和continue
②结束方法:return
七、Java中的随机数操作
1、Math.random()
返回[0.0,1.0)内的任意一个无线不循环小数
2、Random类
3、面试题:简述Math.random()方法和Random类的优缺点
优缺点 | Math.random | Random |
优点 | 节省内存空间 | 可以直接生成整数型随机数,不需要进行强转影响精度 |
缺点 | 需要进行强制类型转换,影响精度 | 浪费空间内存 |
八、数组
(1)特点:存储一组相同数据类型的数据,一定程度上提高数据存储安全性
数组一旦创建,长度固定
(2)书写格式
①静态定义格式
//方式一
数据类型[] 数组名={值1,值2,...};
//方式二
数据类型 数组名[]=new 数据类型[]{值1,值2,...};
②动态定义格式
数据类型[] 数组名=new 数组名[(长度)];
(3)地址存储
引用数据类型(类类型和数组类型)在栈内存存储对象地址,类类型数据只能通过new关键字实现地址指向的转换,即栈内存指向堆内存;而数组类型既可以通过new关键字实现地址转换,也可以通过=实现地址转换
(4)如何存储
①数组在堆内存中以一个连续的柱状空间存储数据
②当数组地址由栈内存指向堆内存时,是指向数组在堆内存中第一个元素的地址值
③为了方便获取,JVM会维数组中的每一个元素自动分配一个索引值,默认从0开始
(5)数组长度
数组名.length //并不是调用的方法,而是属性,所以没有()
2、二维数组
(1)定义格式:
数据类型[][] 数组名={数组1,数组2,...};
(2)匿名操作(无需定义各数组,直接在{}中进行设置)
3、算法(最值、冒泡排序、二分查找)
(1)最值
//最值
int max=array[0];
for (int i = 1; i < array.length; i++) {
if(array[i]>max){
max=array[i];
}
}
System.out.println(max);
(2)冒泡排序
//冒泡排序
for (int i = 0; i < array.length-1; i++) { //一共比较array.length-1轮
for (int j = 0; j < array.length-i-1; j++) { //array.length-i-1,每轮比较多少次
if(array[j]>array[j+1]){
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
System.out.println(Arrays.toString(array));
(3)二分查找
//二分查找
Scanner scanner=new Scanner(System.in);
System.out.print("请输入你想要查找的数据:");
int num=scanner.nextInt();
int index=-1;
int begin=0;
int end=array.length-1;
while (end>=begin){
int middle=(begin+end)/2;
if(array[middle]==num){
index=middle;
break;
}else if(array[middle]>num){
end=middle-1;
}else if(array[middle]<num){
begin=middle+1;
}
}
System.out.println(index);
(4)备份
//备份--->copyOf(源数组,复制后的长度)
int[] array1=Arrays.copyOf(array, 9);
System.out.println("array1"+Arrays.toString(array1));
//默认从0开始复制,如果长度大于原来的,则其余位置维null,如果长度小于原来的,则只复制长度大小的数据
//备份2
int[] array2=new int[9];
System.arraycopy(array,1,array2,0,2);
System.out.println(Arrays.toString(array2));
System.arraycopy(原数组,开始复制位置,目标数组,开始被复制的位置,复制长度)
(5)方法
//排序方法-----》默认升序
Arrays.sort(array1);
System.out.println("array1"+Arrays.toString(array1));
九、方法
1、方法概念
1-1 方法定义
public static 返回值类型 方法名([参数列表]){
方法体(编写实现具体功能的代码);
[return 返回值;]
}
1-2 方法调用
-
- 变量名(或对象名).方法名([参数列表]) ----最常规的调用方式
- 类名.方法名([参数列表]) -----该方法必须使用static定义
- new 方法名([参数列表]) -----只能调用方法名与类名一致的方法,这样的方法java中称之为构造器
2、方法分类
2-1 按照定义返回值类型---(有返回值方法和无返回值方法)
2-2 按照是否传递参数-----(有参方法和无参方法)
(1)有参方法
①定参方法:参数个数固定,必须传递定义好个数的参数,否则报错
②可变参数方法:参数个数不固定,根据用户的实际需要完成传递
a:格式定义:
public static 返回值类型 方法名(数据类型... 参数名){
方法体;
}
(2)无参方法
采用数据类型void进行定义方法
3、基本数据类型和引用数据类型的参数传递区别
基本数据类型定义变量地址(数据地址)和值时是在栈内存,引用数据类型定义变量地址(数据地址)在栈内存,进行赋值时存储在堆内存
4、return关键字
需要返回结果的方法中进行调用
5、Java中方法重载
5-1 定义
当在指定类中需要根据参数的不同定义多个具有相同含义的方法时,此时构成方法重载
5-2 简述Java中如何构成方法重载
方法名一致 (也称签名一致)
与返回值类型和访问权限修饰符无关
参数列表不同(数据类型不同||参数个数不同||参数传递的顺序不同)