JavaSE学习
1 Java语言概述
1.1常见DOS命令
dir
——常看当前目录下的文件或文件夹
cd \或cd/
——回退到盘符目录
md
——创建文件目录
rd
——删除指定的文件目录
cls
——清屏
针对.Java结尾的源文件进行编译操作。格式为:javac 源文件名.java
(cmd中必须在源文件所在目录下进行编译)
针对编译后的字节码文件进行编译后运行,格式java 字节码文件名
1.2程序编写小结
class 表示类,后面跟着类名
main函数格式固定:
public static void main(String[] args)
,如果非要变化只能改变String[] args,方式1String arg[]
, 方式2String[] a
java严格区分大小写!!
从控制台输出数据的操作:
System.out.println("输出的信息");
——输出数据后,会换行
System.out.print("输出的信息");
——输出数据后,不会换行
windows不区分大小写
- 编译以后会生成一个或多个字节码文件。每一个字节码文件对应一个Java类,并且字节码文件名与类名相同。
- 一个源文件中最多只有一个类使用public声明,且这个类名与源文件名相同
1.3注释
1.//单行注释 |
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 具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。
我们编写的 Java 代码,都运行在 JVM 之上。正是因为有了 JVM,才使得 Java程序具备了跨平台性
两大功能:
实现 Java 程序的跨平台性
自动内存管理(内存分配、内存回收)
•Java 程序在运行过程中,涉及到运算的数据的分配、 存储
等都由 JVM 来完成
• Java 消除了程序员回收无用内存空间的职责。提供了一种系统级线程跟踪存储空间的分配情况,在内存空间达到相应阈值时,检查并释放可被释放的存储器空间。
• GC 的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上减少了因为没有释放空间而导致的内存泄漏。
1.6章节案例
class PersonalInfo |
神书
神书:《Java核心技术》、《Effective Java》、《Java编程思想》
企业真题:
- Java 的优势(阿**巴)
跨平台型、安全性高、简单性、高性能、面向对象性、健壮性
隐藏的优势是:Java的社区比较繁荣,有大量开源的第三方框架可 供调用
- Java 中是否存在内存溢出、内存泄漏?如何解决?举例说明(拼*多)
你程序在执行的过程当中,某块已经是不再使用的内存空间了,但 是呢gvm
通过相关的算法判定以后,不认为它是垃圾。那么就构成 了内存泄露.
如何看待Java是一门半编译半解释型的语言(携*)
生成的这个自解码文件之后,如果我们使用JAVA这个指令,即解释运行,但其实它具体在执行方面有两种方式:
一种是逐行的去翻译来解释执行,这叫解释型。还有一种就是它针对这种热点代码,它会提前的把它翻译成相关的机器指令,如果要后边再调,就直接呢就拿这个机器指令去执行,这个性能会更好。这个呢,就是用到了这个叫
JIT
。机制编译器为什么说JAVA现在这个性能很高跟c可以并驾齐驱,就是因为有它。那JAVA叫半编译半解释性语言,是因为它可能是编译,也可能是直接解释性的,所以这叫半编译半解释性的。回到这个图这块呢,这个源文件先编译。生成的叫字节码文件,这个字节码文件再往下走的时候,它可能是解释执行的,也可能是git编译器执行的,这叫半解释型,半编译型的语言。你会发现呢?说这儿呢,也有一个编译器,这儿呢,也有个编译器,你可以把这儿理解成呢,叫前端编译器,这个叫后端编译器。
2 变量与运算符
2.1关键字
特点:全部关键字都是小写字母
。
官方地址: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
标识符命名规范
标识符的命名规范(建议遵守的软性要求
,否则工作时容易被鄙视):
> 包名:多单词组成时所有字母都小写:xxxyyyzzz。 |
2.2基本数据类型
整数类型:byte、short、int、long
定义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 浮点类型也有固定的表数范围和字段长度,不受具体操作系统的影响。

- 浮点型常量有两种表示形式:
- 十进制数形式。如: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)基本数据类型的转换规则如图所示:
int i = 'A';//char自动升级为int,其实就是把字符的编码值赋值给i变量了 |
4)double型末尾不加字符,float要加F
5)整型常量规定是int类型
强制类型转换
规则:将取值范围大(或容量大)的类型强制转换成取值范围小(或容量小)的类型。
自动类型提升是Java自动执行的,而强制类型转换是自动类型提升的逆运算,需要我们自己手动执行。
转换格式:
数据类型1 变量名 = (数据类型1)被强转数据值; //()中的数据类型必须<=变量值的数据类型 |
(1)当把存储范围大的值(常量值、变量的值、表达式计算的结果值)强制转换为存储范围小的变量时,可能会损失精度
或溢出
。
int i = (int)3.14;//损失精度 |
2.4基本数据类型与String的运算
- String不是基本数据类型,属于引用数据类型
- 使用一对
""
来表示一个字符串,内部可以包含0个、1个或多个字符。 - 声明方式与基本数据类型类似。例如:
String str = “lxx”;
任意八种基本数据类型的数据与String类型只能进行连接“+”运算,且结果一定也是String类型
String str = "123"; |
2.5计算机底层如何存储数据
进制的分类与转换
十进制(decimal)
- 数字组成:0-9
- 进位规则:满十进一
二进制(binary)
- 数字组成:0-1
- 进位规则:满二进一,以
0b
或0B
开头
八进制(octal):很少使用
- 数字组成:0-7
- 进位规则:满八进一,以数字
0
开头表示
十六进制
- 数字组成:0-9,a-f
- 进位规则:满十六进一,以
0x
或0X
开头表示。此处的 a-f 不区分大小写
二进制如何表示整数?
计算机数据的存储使用二进制
补码
形式存储,并且最高位是符号位
。- 正数:
最高位是0
- 负数:
最高位是1
- 正数:
规 定
- 正数的补码与反码、原码一样,称为
三码合一
- 负数的补码与反码、原码不一样:
- 负数的
原码
:把十进制转为二进制,然后最高位设置为1 - 负数的
反码
:在原码的基础上,最高位不变,其余位取反(0变1,1变0) - 负数的
补码
:反码+1
- 负数的
- 正数的补码与反码、原码一样,称为
负数:-25 10000000 00000000 000000000 00011001(原码) |
十进制转二进制:除2取余的逆

二进制与八进制、十六进制间的转换
2.6 运算符
算数运算符基本语法
++或–不会改变数据的类型;
赋值运算符也不会改变数据的类型
short s1 = 10; |
逻辑运算符

逻辑运算符,操作的都是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 基本语法


- 位运算符的运算过程都是基于二进制的补码运算
条件运算符
- 条件运算符格式:
(条件表达式)? 表达式1:表达式2 |
说明:条件表达式是boolean类型的结果,根据boolean的值选择表达式1或表达式2
如果运算后的结果赋给新的变量,要求表达式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中的基本数据类型包括哪些?(*米)
类似问题: |
略
5. Java开发中计算金额时使用什么数据类型?(5*到家)
不能使用float或double,因为精度不高。
使用BigDecimal类替换,可以实现任意精度的数据的运算。
6. char型变量中能不能存储一个中文汉字,为什么?(*通快递)
可以的。char c1 = ‘中’;
char c2 = ‘a’。
因为char使用的是unicode字符集,包含了世界范围的所有的字符。
7. 代码分析(君*科技、新*陆)
short s1=1; |
short s1=1; |
8. int i=0; i=i++执行这两句化后变量 i 的值为(*软)
0。
9. 如何将两个变量的值互换(北京*彩、中外*译咨询)
String s1 = "abc"; |
10. boolean 占几个字节(阿**巴)
编译时不谈占几个字节。 |
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…else
和switch-case
两种分支语句。
- 循环结构
- 根据循环条件,重复性的执行某段代码。
- 有
for
、while
、do-while
三种循环语句。- do-while至少执行一次循环体
- 循环中一旦执行break,就跳出或结束当前循环结构
- 补充:JDK5.0 提供了
foreach
循环,方便的遍历集合、数组元素。(第12章集合中讲解)
switch-case选择结构
基本语法
语法格式:
switch(表达式){ |
执行流程图:
执行过程:
第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循环)
适用范围 在循环结构中使用的作用 相同点 |
此外,很多语言都有goto语句,goto语句可以随意将控制转移到程序中的任意一条语句上,然后执行它,但使程序容易出错。Java中的break和continue是不同于goto的。
带标签的使用
break语句用于终止某个语句块的执行 |
continue语句出现在多层嵌套的循环语句体中时,也可以通过标签指明要跳过的是哪一层循环。
标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。
举例:
class BreakContinueTest2 { |
如何获取一个随机数
如何产生一个指定范围的随机整数?
1、Math类的random()的调用,会返回一个[0,1)范围的一个double型值
2、
Math.random() * 100 ---> [0,100) |
3、如何获取[a,b]
范围内的随机整数呢?(int)(Math.random() * (b - a + 1)) + a
4 数组
- 数组本身是
引用数据类型
,而数组中的元素可以是任何数据类型
,包括基本数据类型和引用数据类型。 - 数组元素的分类
- 基本数据类型元素的数组:每个元素位置存储基本数据类型的值
- 引用数据类型元素的数组:每个元素位置存储对象(本质是存储对象的首地址)(在面向对象部分讲解)
数组元素的默认值
对于基本数据类型而言,默认初始化值各有不同。
对于引用数据类型而言,默认初始化值为null(注意与0不同!)