1. Java跨平台原理
概述 | 说明 |
---|---|
总 | Java最大的优点就是跨平台(一次编译,到处运行),主要是指字节码文件可以在任何(具有Java虚拟机的)计算机或者电子设备上运行。 |
分 | Java的执行过程:![]() 1. Java程序的运行要经过:编辑、编译、解释并执行 2. Java源代码经过编译后生成 字节码文件(.class) ,字节码文件与平台无关,只面向虚拟机3. 字节码文件需要通过Java虚拟机(JVM)再解释成 相应平台的机器码 并运行。Java虚拟机是可运行Java字节码文件的虚拟计算机。Java虚拟机中的解释器负责将字节码文件解释成特定的机器码进行运行。Java虚拟机本身并不跨平台,但它们提供了相同的接口。 |
总 | Java具有一次编译,到处运行的特定特点。是说编译后的.class文件可以跨平台运行。 |
扩展 | C语言也可以实现跨平台:多次编译,多次运行。C语言的性能高于Java |
2. &和&&的区别和联系
概述 | 说明 |
---|---|
总 | & 和 && 都是双目运算符,无论使用哪个运算符,对最终的运算结果都没有影响。两个操作数都为 true ,结果才为true |
分 | 1. & 称为逻辑与运算符, && 称为短路与运算符 对于 & :无论任何情况, 两边的操作数都会参与运算 。对于 && : 当左边的操作数为 false时,右边的操作数将不参与运算,最终结果为 false 2. & 还可以用作位运算符,当 & 两边操作数不是 boolean 类型,而是整数类型时,& 将用于按位与操作符的操作。 5 & 6 结果为 4 |
总 | 推荐平时多使用 && ,因为它的效率高。 |
扩展 | 1. | 和 || 的区别和联系类似。 2. 8 << 1 结果为 16,每左移一位,相当与乘以2,使用位运算,速度快。 3. 面试题:使用最快的方式计算 2 * 8 ==》 2 << 3 |
3. switch 条件变量的取值类型
概述 | 说明 |
---|---|
总 | switch 是 Java 中的多重分支语句,只能进行等值运算,不能进行区间判断。 |
分 | 条件变量的取值范围是4种可以: 1. 整数类型中的 byte、short、int 2. 字符类型的 char 3. JDK 1.5 之后增加了 enum 枚举类型 4. JDK 1.7 之后增加了 String 类型 |
总 | 4种不可以:long、Boolean、float、double不能使用 |
扩展 | switch 中用到了 break 关键字,用来跳出switch语句。 还使用了 default 关键字,该关键字还可以使用在接口中,用来表示在 JDK8 之后接口中定义的非抽象但是可以被实现类重写的方法。 |
4. 数组相关
4.1 定义数组
数据类型[] 数组名 = new 数据类型[容量];
- 数据类型:确定数据类型之后,整个数组中保存的数据类型***无法修改***
- 数组名:是一个【引用数据类型】
- new:申请【XX】内存空间,并且***清空整个内存空间中所有二进制位***,所有的二进制位都是0
4.2 数组内存分析
堆中存放数据,栈中存放数组名 (也是一个【引用数据类型】的变量)
当前数组的属性length是要占用一定的数组空间的,属于数组中的内容,这就是为什么数组中占用的空间要比存储数据计算空间略大一些
4.3 数组查找操作
定义一个长度为 10 的一维字符串数组,在每一个元素存放一个单词;然后运行时从命令行输入一个单词,程序判断数组中是否包含这个单词,包含就打印出 “yes”,不包含就打印 ”no“
// 定义一个长度为 10 的一维字符串数组
String[] arr = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"};
// 从命令行输入一个单词
Scanner sc = new Scanner(System.in);
String str = sc.next();
// 判断数组中是否包含这个单词
int index = -1;
for (int i = 0; i < arr.length; i++) {
if (arr[i].equals(str)) {
index = i;
break;
}
}
// 不包含输出 NO,包含输出 YES
if (index == -1) {
System.out.println("no");
} else {
System.out.println("yes");
}
4.4 获取数组最大值和最小值操作
利用 Java 的 Math 类的 random() 方法,编写函数得到 0 到 n 之间的随机数,n 是参数,并找出产生 50 个这样的随机数中最大的、最小的数,并统计其中 >= 60 的有多少个(使用数组过于繁琐,此处直接进行了比较)
// 利用 Java 的 Math 类的 random() 方法,编写函数得到 0 到 n 之间的随机数,n 是参数
public static void getNums(int n) {
double random = 0.0;
double min = n + 1;
double max = 0.0;
int count = 0;
for (int i = 0; i < 50; i++) {
random = Math.random() * n;
// 找出产生 50 个这样的随机数中最大的、最小的数
if (random > max) {
max = random;
}
if (random < min) {
min = random;
}
// 统计其中 >= 60 的有多少个?
if (random >= 60) {
count++;
}
}
System.out.println(max);
System.out.println(min);
System.out.println(count);
}
4.5 找出数组中指定元素的最后一次出现的下标位置
public int lastIndexOf(int[] arr, int num) {
// 假设找不到对应的数据
int index = -1;
for (int i = arr.length - 1; i >= 0; i--) { // 最后一次,从后往前找
// 找到对应元素,保存index,终止循环
if (num == arr[i]) {
index = i;
break;
}
}
return index;
}
4.6 找出指定元素在指定数组中所有下标位置
public int allIndexOf(int[] arr, int[] indexArr, int num) {
// 参数合法性判断
if (arr.length > indexArr.length || num > arr.length || num < 0) {
System.out.println("Input Parameter is Invalid!");
return -1;
}
/*
* 定义一个变量,
* 1. 计数器,记录找到的元素个数
* 2. 尾插法当中下一次存放元素的位置
*/
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (num == arr[i]) { // 找到了对应的元素,需要保存下标i
// 保存到indexArr数组中
// 需要使用尾插法!保存下一次存放数据的位置
indexArr[count] = i;
count += 1;
}
}
return count;
}
4.7 在指定位置插入指定元素
public static boolean add(int[] arr, int index, int insert) {
// 参数合法性判断
if (index < 0 || index > arr.length - 1) {
System.out.println("Input Parameter is Invalid!");
return false;
}
for (int i = arr.length - 1; i > index; i--) {
arr[i] = arr[i - 1];
}
arr[index] = insert;
return true;
}
4.8 删除数组中的指定下标的元素
public boolean remove(int[] arr, int index) {
// 参数合法性判断
if (index < 0 || index > arr.length - 1) {
System.out.println("Input Parameter is Invalid");
return false;
}
for (int i = index; i < arr.length - 1; i++) {
arr[i] = arr[i + 1];
}
// 最后一位数据赋值为0,占位
arr[arr.length - 1] = 0;
return true;
}
4.9 选择排序
public static void selectSort(int[] arr)
{
// 外层循环控制核心算法的循环次数
for (int i = 0; i < arr.length - 1; i++) {
// 从index位置开始找寻极值
int index = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[index] > arr[j]) {
index = j;
}
}
if (index != i) {
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
}
}
5. JDK安装路径
- bin : binary 二进制目录,都是二进制可以执行文件(java.exe)
- db : JDK自带的小型数据库
- include : 系统接口目录!!!
- jre : Java运行环境 Java Runtime Environment
- lib : 资源库目录,存在一些.jar文件 Jar包
- src.zip : 源文件代码
6. 配置环境变量
- JAVA_HOME : jdk安装目录
- CLASS_PATH :
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
- PATH :
;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
7. 八大基本类型
- 整型 : byte(1)、 short(2)、 int(4)、 long(8)
- 浮点型 : float(4)、 double(8)
- 布尔类型 : boolean(1)
- 字符型 : char(2)
注意:
- 声明float类型时,后面加 F
- 声明long类型时,后面加 L
- 字符串类型(String),
“ ”
内所有内容都是字符串本身,并且是一个常量,不可以修改,StringBuffer是可变的
引用数据类型
- 字符串
- 数组
- 对象
String 相关面试题:
main(String[] args) {
String str1 = "老干妈";
str1 += ",蛋炒饭";
str1 += ",酱牛肉";
str1 += ",宫保鸡丁";
str1 += ",大盘鸡";
str1 += ",麻辣香锅";
System.out.println("请问这里有几个字符串");
}
12个字符串
-
使用双引号包含的字符串都是字符串常量!!! 常量的概念中要求不可以修改。
双引号包含的字符串都是存在于内存的【数据区】
-
在字符串常量操作时,使用原本的两个字符串拼接之后完成的一个新的字符串常量。
这里导致的字符串冗余问题,后期会使用StringBuffer,StringBuilder来解决问题
8. 方法
8.1 方法定义
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
三要素:
- 返回值
- 方法名
- 形式参数列表(可变参数,JDK5之后)
8.2 可变参数
(数据类型... 参数名) {}
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数
public class VarargsDemo {
public static void main(String args[]) {
// 调用可变参数的方法
printMax(34, 3, 3, 2, 56.5);
printMax(new double[]{1, 2, 3});
}
public static void printMax(double... numbers) { 【可变参数】
if (numbers.length == 0) {
System.out.println("No argument passed");
return;
}
double result = numbers[0];
for (int i = 1; i < numbers.length; i++){
if (numbers[i] > result) {
result = numbers[i];
}
}
System.out.println("The max value is " + result);
}
}
8.3 方法封装
需求分析:干什么、 方法名是什么、 参数列表有什么、 返回值类型是什么
注释完成每一步需要做的事情
- 功能单一化!!! 考虑后期的复用性,可移植性,模块化…
- 减少代码中return的使用,提高代码阅读性
- 找出特定的情况优化代码,提高效率