当前位置:主页 > 查看内容

JAVA基础 2021学习理解

发布时间:2021-05-06 00:00| 位朋友查看

简介:JAVA基础 2021学习理解 前言 一、JVM和GC 1.java跨平台运行原理 2 JVM理解 3 GC(垃圾回收器) 二、二进制 1 二进制基础理解 2 二进制转化十进制 三、数据类型和变量 3.1 变量 3.2 数据类型 3.2.1 数据类型介绍 3.2.2 数据类型转换 3.2.3 转义字符对char补充……


前言

资料来源:

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

一、JVM和GC

1.java跨平台运行原理

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 7670
长整数型(long)8 字节-9 223 372 036 854 775 808L ~ 9 223 372 036 854 775 807L0
字节型(byte)1 字节-128 ~ 1270
浮点型(float)4 字节-3.40292347E+38-3.40292347E+380.0f
双 精 度 型(double)8 字节-1.79769313486231570E+308-1.79769313486231570E+3080.0d
布尔型(boolean)1 字节true 或 falsefalse
字符型(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
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐