飞道的博客

JAVA基础 2021学习理解

320人阅读  评论(0)


前言

资料来源:

  1. 开课吧视频学习
  2. 部分百度资料
  3. 个人学习笔记

一、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 ’
补充:char类型输出对照ascii码表。

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场