1 Java语言概述

1.1常见DOS命令

dir ——常看当前目录下的文件或文件夹

cd \或cd/ ——回退到盘符目录

md——创建文件目录

rd——删除指定的文件目录

cls——清屏

针对.Java结尾的源文件进行编译操作。格式为:javac 源文件名.java(cmd中必须在源文件所在目录下进行编译)

针对编译后的字节码文件进行编译后运行,格式java 字节码文件名

1.2程序编写小结

  1. class 表示类,后面跟着类名

  2. main函数格式固定:

    public static void main(String[] args),如果非要变化只能改变String[] args,方式1String arg[], 方式2 String[] a

  3. java严格区分大小写!!

  4. 从控制台输出数据的操作:

    System.out.println("输出的信息");——输出数据后,会换行

System.out.print("输出的信息");——输出数据后,不会换行

windows不区分大小写

  1. 编译以后会生成一个或多个字节码文件。每一个字节码文件对应一个Java类,并且字节码文件名与类名相同。
  2. 一个源文件中最多只有一个类使用public声明,且这个类名与源文件名相同

1.3注释

1.//单行注释

2./* */多行注释

3./** */文档注释
文档注释内容可以被JDK提供的工具javadoc解析,生成一套以网页文件形式体现的该程序的说明文档
javadoc -d mydoc(生成的文件夹名) -author -version HelloWorld.java

1.4JavaApI

JavaApI提供了大量基本类库

在线看: https://docs.oracle.com/en/java/javase/17/docs/api/index.html

1.5Java核心机制JVM

JVM(Java Virtual Machine , Java 虚拟机):是一个虚拟的计算机,是 Java 程序的运行环境。 JVM 具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。

image-20240428220525652

我们编写的 Java 代码,都运行在 JVM 之上。正是因为有了 JVM,才使得 Java程序具备了跨平台性

两大功能:

  1. 实现 Java 程序的跨平台性

  2. 自动内存管理(内存分配、内存回收)

    •Java 程序在运行过程中,涉及到运算的数据的分配、 存储

    等都由 JVM 来完成

    • Java 消除了程序员回收无用内存空间的职责。提供了一种系统级线程跟踪存储空间的分配情况,在内存空间达到相应阈值时,检查并释放可被释放的存储器空间。

    • GC 的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上减少了因为没有释放空间而导致的内存泄漏。

1.6章节案例

class PersonalInfo 
{
public static void main(String[] args)
{
System.out.println("姓名:林");
System.out.println();//换行操作
System.out.println("性别: 女");
System.out.println("地址:重庆大学");
}
}
//结果
G:\Code\Java\chapter1>javac PersonalInfo.java
G:\Code\Java\chapter1>java PersonalInfo
姓名:林
性别: 女
地址:重庆大学

神书

神书:《Java核心技术》、《Effective Java》、《Java编程思想》

企业真题:

  1. Java 的优势(阿**巴)

​ 跨平台型、安全性高、简单性、高性能、面向对象性、健壮性

隐藏的优势是:Java的社区比较繁荣,有大量开源的第三方框架可 供调用

  1. Java 中是否存在内存溢出、内存泄漏?如何解决?举例说明(拼*多)

​ 你程序在执行的过程当中,某块已经是不再使用的内存空间了,但 是呢gvm通过相关的算法判定以后,不认为它是垃圾。那么就构成 了内存泄露.

  1. 如何看待Java是一门半编译半解释型的语言(携*)

    1. 生成的这个自解码文件之后,如果我们使用JAVA这个指令,即解释运行,但其实它具体在执行方面有两种方式:

      一种是逐行的去翻译来解释执行,这叫解释型。还有一种就是它针对这种热点代码,它会提前的把它翻译成相关的机器指令,如果要后边再调,就直接呢就拿这个机器指令去执行,这个性能会更好。这个呢,就是用到了这个叫JIT。机制编译器为什么说JAVA现在这个性能很高跟c可以并驾齐驱,就是因为有它。

      那JAVA叫半编译半解释性语言,是因为它可能是编译,也可能是直接解释性的,所以这叫半编译半解释性的。回到这个图这块呢,这个源文件先编译。生成的叫字节码文件,这个字节码文件再往下走的时候,它可能是解释执行的,也可能是git编译器执行的,这叫半解释型,半编译型的语言。你会发现呢?说这儿呢,也有一个编译器,这儿呢,也有个编译器,你可以把这儿理解成呢,叫前端编译器,这个叫后端编译器。

image-20240428222637718

2 变量与运算符

2.1关键字

特点:全部关键字都是小写字母

官方地址: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html

标识符命名规范

标识符的命名规范(建议遵守的软性要求,否则工作时容易被鄙视):

> 包名:多单词组成时所有字母都小写:xxxyyyzzz。
例如:java.lang、com.atguigu.bean

> 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
例如:HelloWorld,String,System等

> 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
例如:age,name,bookName,main,binarySearch,getName

> 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
例如:MAX_VALUE,PI,DEFAULT_CAPACITY

2.2基本数据类型

整数类型:byte、short、int、long

image-20240429134219943

  • 定义long类型的变量,赋值时需要以”l“或”L“作为后缀。

  • Java程序中变量通常声明为int型,除非不足以表示较大的数,才使用long。

  • Java的整型常量默认为 int 型

计算机存储单位

  • 字节(Byte):是计算机用于计量存储容量基本单位,一个字节等于8 bit。

  • 位(bit):是数据存储的最小单位。二进制数系统中,每个0或1就是一个位,叫做bit(比特),其中8 bit 就称为一个字节(Byte)。

  • 转换关系:

    • 8 bit = 1 Byte
    • 1024 Byte = 1 KB
    • 1024 KB = 1 MB
    • 1024 MB = 1 GB
    • 1024 GB = 1 TB

浮点类型:float、double

  • 与整数类型类似,Java 浮点类型也有固定的表数范围和字段长度,不受具体操作系统的影响。
image-20220311001749699
  • 浮点型常量有两种表示形式:
    • 十进制数形式。如:5.12 512.0f .512 (必须有小数点)
    • 科学计数法形式。如:5.12e2 512E2 100E-2
  • float:单精度,尾数可以精确到7位有效数字。很多情况下,精度很难满足需求。
  • double:双精度,精度是float的两倍。通常采用此类型。
  • 定义float类型的变量,赋值时需要以”f“或”F“作为后缀。
  • Java 的浮点型常量默认为double型

浮点类型float、double的数据不适合在不容许舍入误差的金融计算、航天领域。如果需要精确数字计算或保留指定位数的精度,需要使用BigDecimal类

字符类型:char

  • char 型数据用来表示通常意义上“字符”(占2字节)

  • Java中的所有字符都使用Unicode编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。

  • 字符型变量的三种表现形式:

    • 形式1:使用单引号(‘ ‘)括起来的单个字符

      例如:char c1 = ‘a’; char c2 = ‘中’; char c3 = ‘9’;

    • 形式2:直接使用 Unicode值来表示字符型常量:‘\uXXXX’。其中,XXXX代表一个十六进制整数。

      例如:\u0023 表示 ‘#’。

    • 形式3:Java中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。

      例如:char c3 = ‘\n’; // ‘\n’表示换行符

    转义字符 说明 Unicode表示方式
    \n 换行符 \u000a
    \t 制表符 \u0009
    \" 双引号 \u0022
    \' 单引号 \u0027
    \\ 反斜线 \u005c
    \b 退格符 \u0008
    \r 回车符 \u000d
  • char类型是可以进行运算的。因为它都对应有Unicode码,可以看做是一个数值。

boolean类型

  • boolean类型数据只有两个值:true、false,无其它。
    • 不可以使用0或非 0 的整数替代false和true,这点和C语言不同。
    • 拓展:Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达所操作的boolean值,在编译之后都使用java虚拟机中的int数据类型来代替:true用1表示,false用0表示。——《java虚拟机规范 8版》
  • 一般不谈布尔类型占用空间的大小,但是真正在内存中分配时占4个字节

2.3 基本数据类型变量间运算规则

自动类型提升

1)在Java程序中,不同的基本数据类型(只有7种,不包含boolean类型)变量的值经常需要进行相互转换。

2)转换的方式有两种:自动类型提升强制类型转换

3)基本数据类型的转换规则如图所示:

image-20220311002543688

int i = 'A';//char自动升级为int,其实就是把字符的编码值赋值给i变量了
double d = 10;//int自动升级为double
long num = 1234567; //右边的整数常量值如果在int范围呢,编译和运行都可以通过,这里涉及到自动数据类型转换

//byte bigB = 130;//错误,右边的整数常量值超过byte范围
long bigNum = 12345678912L;//右边的整数常量值如果超过int范围,必须加L,显式表示long类型。否则编译不通过

4)double型末尾不加字符,float要加F

5)整型常量规定是int类型

强制类型转换

规则:将取值范围大(或容量大)的类型强制转换成取值范围小(或容量小)的类型。

自动类型提升是Java自动执行的,而强制类型转换是自动类型提升的逆运算,需要我们自己手动执行。

转换格式:

数据类型1 变量名 = (数据类型1)被强转数据值;  //()中的数据类型必须<=变量值的数据类型

(1)当把存储范围大的值(常量值、变量的值、表达式计算的结果值)强制转换为存储范围小的变量时,可能会损失精度溢出

int i = (int)3.14;//损失精度

double d = 1.2;
int num = (int)d;//损失精度

int i = 200;
byte b = (byte)i;//溢出

2.4基本数据类型与String的运算

  • String不是基本数据类型,属于引用数据类型
  • 使用一对""来表示一个字符串,内部可以包含0个、1个或多个字符。
  • 声明方式与基本数据类型类似。例如:String str = “lxx”;

任意八种基本数据类型的数据与String类型只能进行连接“+”运算,且结果一定也是String类型

String str = "123";
int num = (int)str;//错误的,不能跨数据类型进行转换
int num = Integer.parseInt(str);//正确的,后面才能讲到,借助包装类的方法才能转

2.5计算机底层如何存储数据

进制的分类与转换

  • 十进制(decimal)

    • 数字组成:0-9
    • 进位规则:满十进一
  • 二进制(binary)

    • 数字组成:0-1
    • 进位规则:满二进一,以0b0B开头
  • 八进制(octal):很少使用

    • 数字组成:0-7
    • 进位规则:满八进一,以数字0开头表示
  • 十六进制

    • 数字组成:0-9,a-f
    • 进位规则:满十六进一,以0x0X开头表示。此处的 a-f 不区分大小写

二进制如何表示整数?

  • 计算机数据的存储使用二进制补码形式存储,并且最高位是符号位

    • 正数:最高位是0
    • 负数:最高位是1
  • 规 定

    • 正数的补码与反码、原码一样,称为三码合一
    • 负数的补码与反码、原码不一样:
      • 负数的原码:把十进制转为二进制,然后最高位设置为1
      • 负数的反码:在原码的基础上,最高位不变,其余位取反(0变1,1变0)
      • 负数的补码:反码+1
负数:-25  10000000 00000000 000000000 00011001(原码)
负数:-25 11111111 11111111 111111111 11100110(反码)
负数:-25 11111111 11111111 111111111 11100111(补码)

十进制转二进制:除2取余的逆

image-20220312000042595

二进制与八进制、十六进制间的转换

2.6 运算符

算数运算符基本语法

image-20220312000848332

++或–不会改变数据的类型;

赋值运算符也不会改变数据的类型

short s1 = 10;
s1 += 2; //编译通过,因为在得到int类型的结果后,JVM自动完成一步强制类型转换,将int类型强转成short
System.out.println(s1);//12
//写法2:
short s2 = 10;//s2 = s2 + 2;//编译报错,因为将int类型的结果赋值给short类型的变量s时,可能损失精度

逻辑运算符

image-20220312001943403

逻辑运算符,操作的都是boolean类型的变量或常量,而且运算得结果也是boolean类型的值。

  • 逻辑运算符,操作的都是boolean类型的变量或常量,而且运算得结果也是boolean类型的值。

  • 运算符说明:

    • & 和 &&:表示”且”关系,当符号左右两边布尔值都是true时,结果才能为true。否则,为false。
    • | 和 || :表示”或”关系,当符号两边布尔值有一边为true时,结果为true。当两边都为false时,结果为false
    • ! :表示”非”关系,当变量布尔值为true时,结果为false。当变量布尔值为false时,结果为true。
    • ^ :当符号左右两边布尔值不同时,结果为true。当两边布尔值相同时,结果为false。
      • 理解:异或,追求的是“异”!
  • 区分“&”和“&&”(短路与、逻辑与):

    • 相同点:如果符号左边是true,则二者都执行符号右边的操作

    • 不同点:& : 如果符号左边是false,则继续执行符号右边的操作

    ​ && :如果符号左边是false,则不再继续执行符号右边的操作

    • 建议:开发中,推荐使用 &&
  • 区分“|”和“||”:

    • 相同点:如果符号左边是false,则二者都执行符号右边的操作

    • 不同点:| : 如果符号左边是true,则继续执行符号右边的操作

      ​ || :如果符号左边是true,则不再继续执行符号右边的操作

    • 建议:开发中,推荐使用 ||

位运算符

7.5.1 基本语法

image-20220313174721111 image-20220312002506339
  • 位运算符的运算过程都是基于二进制的补码运算

条件运算符

  • 条件运算符格式:
(条件表达式)? 表达式1:表达式2
  • 说明:条件表达式是boolean类型的结果,根据boolean的值选择表达式1或表达式2

    image-20220312002841945
  • 如果运算后的结果赋给新的变量,要求表达式1和表达式2为同种或兼容的类型

运算符优先级

上一行中的运算符总是优先于下一行的。

优先级 运算符说明 Java运算符
1 括号 ()[]{}
2 正负号 +-
3 单元运算符 ++--~
4 乘法、除法、求余 */%
5 加法、减法 +-
6 移位运算符 <<>>>>>
7 关系运算符 <<=>=>instanceof
8 等价运算符 ==!=
9 按位与 &
10 按位异或 ^
11 按位或 `
12 条件与 &&
13 条件或 `
14 三元运算符 ? :
15 赋值运算符 =+=-=*=/=%=
16 位赋值运算符 &=、`

2.7企业真题

1. 高效的方式计算2 * 8的值 (文**辉、轮*科技)

使用 <<

2. &和&&的区别?(恒*电子、*度)

3. Java中的基本类型有哪些?String 是最基本的数据类型吗?(恒*电子)

8种基本数据类型。(略)

String不是,属于引用数据类型。

4. Java中的基本数据类型包括哪些?(*米)

类似问题:
> Java的基础数据类型有哪些?String是吗?(贝壳)

5. Java开发中计算金额时使用什么数据类型?(5*到家)

不能使用float或double,因为精度不高。

使用BigDecimal类替换,可以实现任意精度的数据的运算。

6. char型变量中能不能存储一个中文汉字,为什么?(*通快递)

可以的。char c1 = ‘中’;

char c2 = ‘a’。

因为char使用的是unicode字符集,包含了世界范围的所有的字符。

7. 代码分析(君*科技、新*陆)

short s1=1; 
s1=s1+1; //有什么错? =右边是int类型。需要强转
short s1=1;
s1+=1; //有什么错? 没错

8. int i=0; i=i++执行这两句化后变量 i 的值为(*软)

0。

9. 如何将两个变量的值互换(北京*彩、中外*译咨询)

String s1 = "abc";
String s2 = "123";

String temp = s1;
s1 = s2;
s2 = temp;

10. boolean 占几个字节(阿**巴)

编译时不谈占几个字节。

但是JVM在给boolean类型分配内存空间时,boolean类型的变量占据一个槽位(slot,等于4个字节)。
细节:true:1 false:0

>拓展:在内存中,byte\short\char\boolean\int\float : 占用1个slot
double\long :占用2个slot

11. 为什么Java中0.1 + 0.2结果不是0.3?(字*跳动)

在代码中测试0.1 + 0.2,你会惊讶的发现,结果不是0.3,而是0.3000……4。这是为什么?

几乎所有现代的编程语言都会遇到上述问题,包括 JavaScript、Ruby、Python、Swift 和 Go 等。引发这个问题的原因是,它们都采用了IEEE 754标准

IEEE是指“电气与电子工程师协会”,其在1985年发布了一个IEEE 754计算标准,根据这个标准,小数的二进制表达能够有最大的精度上限提升。但无论如何,物理边界是突破不了的,它仍然不能实现“每一个十进制小数,都对应一个二进制小数”。正因如此,产生了0.1 + 0.2不等于0.3的问题。

具体的:

整数变为二进制,能够做到“每个十进制整数都有对应的二进制数”,比如数字3,二进制就是11;再比如,数字43就是二进制101011,这个毫无争议。

对于小数,并不能做到“每个小数都有对应的二进制数字”。举例来说,二进制小数0.0001表示十进制数0.0625 (至于它是如何计算的,不用深究);二进制小数0.0010表示十进制数0.125;二进制小数0.0011表示十进制数0.1875。看,对于四位的二进制小数,二进制小数虽然是连贯的,但是十进制小数却不是连贯的。比如,你无法用四位二进制小数的形式表示0.125 ~ 0.1875之间的十进制小数。

所以在编程中,遇见小数判断相等情况,比如开发银行、交易等系统,可以采用四舍五入或者“同乘同除”等方式进行验证,避免上述问题。

3 流程控制语句

程序设计中规定的三种流程结构,即:

  • 顺序结构
    • 程序从上到下逐行地执行,中间没有任何判断和跳转。
  • 分支结构
    • 根据条件,选择性地执行某段代码。
    • if…elseswitch-case两种分支语句。
  • 循环结构
    • 根据循环条件,重复性的执行某段代码。
    • forwhiledo-while三种循环语句。
      • do-while至少执行一次循环体
    • 循环中一旦执行break,就跳出或结束当前循环结构
    • 补充:JDK5.0 提供了foreach循环,方便的遍历集合、数组元素。(第12章集合中讲解)

switch-case选择结构

基本语法

语法格式:

switch(表达式){
case 常量值1:
语句块1;
//break;
case 常量值2:
语句块2;
//break;
// ...
[default:
语句块n+1;
break;
]
}

执行流程图:

image-20220514101841710

执行过程:

第1步:根据switch中表达式的值,依次匹配各个case。如果表达式的值等于某个case中的常量值,则执行对应case中的执行语句。

第2步:执行完此case的执行语句以后,
​ 情况1:如果遇到break,则执行break跳出当前的switch-case结构
​ 情况2:如果没有遇到break,则会继续执行当前case之后的其它case中的执行语句。—>case穿透
​ …
​ 直到遇到break关键字或执行完所有的case及default的执行语句,跳出当前的switch-case结构

使用注意点:

  • switch(表达式)中表达式的值必须是下述几种类型之一:byte,short,char,int,枚举 (jdk 5.0),String (jdk 7.0);

  • case子句中的值必须是常量,不能是变量名或不确定的表达式值或范围;

  • 同一个switch语句,所有case子句中的常量值互不相同;

  • break语句用来在执行完一个case分支后使程序跳出switch语句块;

    如果没有break,程序会顺序执行到switch结尾;

  • default子句是可选的。同时,位置也是灵活的。当没有匹配的case时,执行default语句。

break和continue的说明(就近原则,结束包含break的最近的for循环)

			适用范围			在循环结构中使用的作用						相同点

break switch-case
循环结构 一旦执行,就结束(或跳出)当前最近的循环结构 此关键字的后面,不能声明语句

continue 循环结构 一旦执行,就结束(或跳出)最近的当次循环结构 此关键字的后面,不能声明语句

此外,很多语言都有goto语句,goto语句可以随意将控制转移到程序中的任意一条语句上,然后执行它,但使程序容易出错。Java中的break和continue是不同于goto的。

带标签的使用

break语句用于终止某个语句块的执行
{ ……
break;
……
}

break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
label1: { ……
label2: { ……
label3: { ……
break label2;
……
}
}
}

  • continue语句出现在多层嵌套的循环语句体中时,也可以通过标签指明要跳过的是哪一层循环。

  • 标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。

  • 举例:

class BreakContinueTest2 {
public static void main(String[] args) {
l:for(int i = 1;i <= 4;i++){

for(int j = 1;j <= 10;j++){
if(j % 4 == 0){
//break l;//输出123
continue l;//输出123123123123
}
System.out.print(j);
}
System.out.println();
}
}
}

如何获取一个随机数

如何产生一个指定范围的随机整数?

1、Math类的random()的调用,会返回一个[0,1)范围的一个double型值

2、

Math.random() * 100  --->  [0,100)
(int)(Math.random() * 100) ---> [0,99]
(int)(Math.random() * 100) + 5 ----> [5,104]

3、如何获取[a,b]范围内的随机整数呢?(int)(Math.random() * (b - a + 1)) + a

4 数组

  • 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
  • 数组元素的分类
    • 基本数据类型元素的数组:每个元素位置存储基本数据类型的值
    • 引用数据类型元素的数组:每个元素位置存储对象(本质是存储对象的首地址)(在面向对象部分讲解)

数组元素的默认值

对于基本数据类型而言,默认初始化值各有不同。

对于引用数据类型而言,默认初始化值为null(注意与0不同!)

image-20240515205155804