前言
资料来源:
- 开课吧视频学习
- 部分百度资料
- 个人学习笔记
一、JVM和GC
1.java跨平台运行原理
java源码进行编译成字节码(.class文件),此文件可以被jvm虚拟机识别转化,然后通过在各个操作系统中的jvm虚拟机实现跨平台运行。
举个栗子:出国旅游,找一个既懂中文,也懂其他语言(日语、英语等)的翻译向导,可以让你无障碍的与他人进行交流。
这里面翻译向导相当于jvm虚拟机,国家相当于各个操作系统。
2 JVM理解
jvm可以理解成一个可运行的java字节码的虚拟计算系统
jvm有一个解释器组件,可以实现java字节码和计算机操作系统之间的通信。
jvm屏蔽了底层运行环境的差别,实现了一次编译,随处运行。
不同的平台,有不同的jvm。
3 GC(垃圾回收器)
jvm提供了系统线程,用来跟踪存储空间的分配情况,检查并且释放可以被释放的存储空间。
GC在程序运行时自动启用。
二、二进制
1 二进制基础理解
二进制:逢二进一,只有0和1俩个值。 // 0101 √ 2323 ×
位(Bit):表示一个二进制数码0或1,是计算机存储信息的最基本单位。
字节(Byte):一个字节由8个位组成。表示作为一个完整处理单位的7个二进制数码。
2 二进制转化(十进制)
1.十进制转成二进制主要有以下几种:正整数转二进制,负整数转二进制,小数转二进制;
a.正整数转二进制:除二取余,倒序排列,高位补零
b.负整数转换成二进制:整数转二进制,取反,结果加一
c.负整数转换成二进制:小数点以后的数乘以2,取结果的整数部分,然后用小数部分再乘以2,再取结果的整数部分(整数部分大于0的二进制转化倒叙排列+小数部分的正序排列)
2.十进制转成二进制主要有以下几种:正整数转二进制,负整数转二进制,小数转二进制;
a.整数二进制转换为十进制:从低位开始按照2的0次方,2的1次方计算,所得结果相加。
b.负整数二进制转换成十进制:取反,结果加一,整数二进制转换为十进制。
b.小数转换成二进制:从高位开始按照2的-1次方,2的-2次方计算,所得结果相加。
建议:前期只要了解二进制基本转化、补码即可。
三、数据类型和变量
八种基本类型 归为四种不同的数据类型。3.1 变量
变量就是系统为程序分配的一块内存单元,用来存储各种类型的数据。由于该存储单元中的数据可以发生改变,因此得名为"变量"。
变量分类:
按所属的数据类型划分:
- 基本数据类型变量
- 引用数据类型变量
按被声明的位置划分:
- 局部变量:方法或语句块内部定义的变量
- 成员变量:方法外部、类的内部定义的变量
3.2 数据类型
3.2.1 数据类型介绍
类型 | 占用内存 | 值范围(含边界值) | 默认值 |
---|---|---|---|
整数型(int) | 4 字节 | -2 147 483 648 ~ 2 147 483 647(稍大于 20 亿) | 0 |
短整数型(short) | 2 字节 | -32 768 ~ 32 767 | 0 |
长整数型(long) | 8 字节 | -9 223 372 036 854 775 808L ~ 9 223 372 036 854 775 807L | 0 |
字节型(byte) | 1 字节 | -128 ~ 127 | 0 |
浮点型(float) | 4 字节 | -3.40292347E+38-3.40292347E+38 | 0.0f |
双 精 度 型(double) | 8 字节 | -1.79769313486231570E+308-1.79769313486231570E+308 | 0.0d |
布尔型(boolean) | 1 字节 | true 或 false | false |
字符型(char) | 2 字节 | ‘ \u0000 - u\ffff ’ | ‘\u0000 ’ |
3.2.2 数据类型转换
自动类型转换:容量小的类型自动转换成容量大的数据类型
- byte,short,int -> float ->long ->double
- byte,short,int不会互相转换,它们三者在计算时会转换成 int 类型
强制类型转换:容量大的类型转换成容量小的数据类型时,要加上强制转换符
long g = 100L;
int i = (int)g;
有可能造成精度降低或数据溢出,使用时要小心。
boolean 类型不能转换成任何其它数据类型。
3.2.3 转义字符(对char补充)
转义字符 | 意义 | ASCII码值(十进制) |
---|---|---|
\n | 换行,将当前位置移到下一行开头 | 010 |
\r | 回车 ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\ | 代表一个反斜线字符’’’ | 092 |
’ | 代表一个单引号(撇号) | 字符 039 |
" | 代表一个双引号字符 | 034 |
四、运算符
4.1 算术运算符(自增或自减)
(++): 如果是变量前缀:先对此变量加 1,再执行其他的操作。
如果是变量后缀:先执行当前语句的其他操作,再对此变量加 1
(- -): 如果是变量前缀:先对此变量减 1,再执行其他的操作。
如果是变量后缀:先执行当前语句的其他操作,再对此变量减 1
4.2 三目运算符
返回值 = 条件表达式 ? 表达式1 : 表达式2
解析:条件表达式 为true则返回表达式1,否则返回表达式2
五、流程控制
5.1 if条件语句
if (条件语句) {…}
if (条件语句) {…} else {…}
if (条件语句) {…} else if (条件语句) {…}
if (条件语句) {…} else if (条件语句) {…} else {…}
5.2 switch 语句
switch(表达式){
case 取值 1: 语句块 1; break;
case 取值 n: 语句块 n; break;
default: 语句块 n+1; break;
}
switch 语句有关规则
表达式的返回值必须是下述几种类型之一:int, byte, char, short,String;
case 子句中的取值必须是常量,且所有 case 子句中的取值应是不同的;
default 子句是可选的;
break 语句用来在执行完一个 case 分支后使程序跳出 switch 语句块;如果 case 后面没有写 break 则直接往下面执行!
Case 后面的执行体可写{ }也可以不写{ }
5.3 while 循环
符合条件,循环继续执行;否则,循环退出
特点:先判断,再执行
while(条件表达式){
//语句块;
}
}
5.4 do-while 循环
先执行一遍循环操作,符合条件,循环继续执行;否则,循环退出
特点:先执行,再判断
do {
循环操作
} while ()
while 循环和 do-while 循环的区别? while:先判断条件,如果条件满足,再执行循环操作 do while:先执行一遍循环操作,然后再判读条件,如果条件满足,继续执行循环操作。
5.5 for 循环
for(初始化参数; 判断条件 ; 更新循环变量){
循环体;
}
六、数组
6.1 数组创建格式
格式 1. 数据类型[] 数组名称 = new 数据类型[数组长度];
格式 2. 数据类型[] 数组名称 = {数组内容 1,数组内容 2,数组内容 3…数组内容 n};
格式 3. 数据类型[] 数组名(属于只创建了数组引用名, 并未在内存创建数组空间);
格式 4. 数据类型[] 数组名称 = new 数据类型[]{内容 1,内容 2,内容 3…内容 n};
6.2 Arrays常用方法
// 数组填充
Arrays.fill(arr, val);
// 数组排序 数字类型按顺序排 字符串按开头字母或数字顺序进行排序 (还有重构方法)
Arrays.sort(arr);
// 数组拷贝复制
Arrays.copeOf(arr, arr.length);
// 数组转化集合
Arrays.asList(arr);
// 数组转化集合
Arrays.asList(arr);
// 数组转流 可以使用流里面的方法
Stream stream = Arrays.stream(arr)
6.3 冒泡排序和二分查找
// 冒泡排序
// 初始化数组
int[] nums = {1,3,9,5,6,7,15,4,8};
// 设置临时变量 用来存储某个节点上的最大值
int temp;
// 外层控制执行次数 第一次循环相邻元素最多比较nums.length - 1
for (int i = 0; i < nums.length - 1; i++) {
// 内层控制比较的次数 外层每循环一次,就有最大值移动到末尾, 相应的末尾就不需要再进行比较 nums.length - i - 1
for (int j = 0; j < nums.length - i - 1; j++) {
if (nums[j] > nums[j+1]) {
temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(nums));
// 二分查找
// 设置目标元素
int target = 6;
// 设置第一次最大最小下标
int minIndex = nums[0];
int maxIndex = nums[nums.length - 1];
// 设置中间下标 3/2 = 1;4/2 = 2
int centerIndex = (minIndex + maxIndex) / 2;
while (true) {
// 下标值判断 每次一半的划分 进行二分逻辑查找
if (nums[centerIndex] > target) {
maxIndex = centerIndex - 1;
} else if (nums[centerIndex] < target) {
minIndex = centerIndex + 1;
} else {
centerIndex = (minIndex + maxIndex) / 2;
System.out.println("目标值下标为" + centerIndex);
break;
}
// 最小值大于最大值情况下
if (minIndex > maxIndex) {
System.out.println("此数不存在");
break;
}
// 每次循环更新中间下标
centerIndex = (minIndex + maxIndex) / 2;
}
总结
人生无限,缓缓起航,修正改错,在满足完成任务的条件下,追求完善,全身而退。
转载:https://blog.csdn.net/qq_43230154/article/details/115430385