那年学过的Java笔记一SE基础

JavaSE知识点梳理

[外链图片转存失败(img-EbT2nyO4-1564412078255)(https://i.imgur.com/eZoqsaL.jpg)]
JavaSE基础

[外链图片转存失败(img-YwTkdMQ1-1564412078256)(https://i.imgur.com/KQf6701.png)]
计算机的体系结构

基本概念

计算机俗称"电脑",是一种被广泛使用在各个领域的设备。
计算机主要由:硬件 和 软件 两部分组成。
计算机中常见的硬件有:CPU、内存、硬盘、输入输出设备、...
CPU---中央处理器,是计算机最核心的部件,相当于人的大脑
所有的运算都在CPU中进行

内存 —是计算机中的存储部件,用于存储CPU需要使用的相关数据。

  • 该部件中存储的内容可以被CPU直接访问,并且效率比较高。
  • 该部件中的数据不能永久存储,一旦关机都会造成数据的丢失。
  • 使用ctrl+s快捷键可以进行数据的保存
    硬盘 - 是计算机中的存储部件,该部件可以实现永久存储,通常不会造成数据的丢失
  • 该部件中存储的内容不能被CPU直接访问,若希望访问则需要将数据加载到内存

科普
1Tb = 1024Gb
1Gb = 1024Mb
1Mb = 1024Kb
1Kb = 1024byte(字节) 通常情况下单个英文字母占1个字节,单个汉字占2个字节
1byte = 8bit(二进制位) 在计算机的底层只识别0和1组成的二进制序列

思考
目前主流的硬盘配置:250G 320G 500G 1Tb等,为啥我的硬盘只有298G呢?
解析:
硬件厂商在生产硬件时按照1000作为进率,操作系统是按照1024作为进率。

常见的软件

计算机的常见软件分为:系统软件 和 应用软件。
其中系统软件主要指操作系统,目前主流的主机操作系统:Windows/Linux/Unix系列
    Windows系统:WinXp、Vista、Win7、Win8、Win8.1、Win10   
    目前移动终端的操作系统:Android、ios、windowsPhone
其中应用软件主要指安装在操作系统上的软件,如:火狐、记事本、计算器、QQ等

计算机的体系架构
使用者 => 应用软件 => 操作系统 => 硬件
=> 操作系统分为:外壳(Shell) 和 内核(Kernel)

Java语言的基本概述

1 Java语言的产生背景
Java语言诞生于1995年,高斯林是公认的Java语言之父,隶属于sun公司,现在
隶属于oracle(甲骨文)公司。

2 Java语言的版本

  • Java SE(Java Platform, Standard Edition)
    称之为“Java平台标准版”,可以编写像office之类的桌面软件。
  • Java EE(Java Platform,Enterprise Edition)
    称之为“Java平台企业版”,可以编写具有B/S架构的项目和解决方案。
  • Java ME (Java Platform,Micro Edition)
    称之为Java 平台微型版,随着Android系统的普及走向淘汰。

3.开发环境的搭建和使用
1 jdk的下载和安装
(1)下载方式
a.从官网直接下载:www.sun.com/www.oracle.com
b.从百度/谷歌/搜狗进行搜索下载
(2)安装方式
a.若下载的安装版,则一路点击下一步即可。
b.若下载的绿色版,则直接解压即可。
切记不要有中文路径。

2 相关的概念
[外链图片转存失败(img-BjfDIYxf-1564412078260)(https://i.imgur.com/lHeR0FS.png)]
jdk - Java开发工具包,只要做Java语言的开发就必须安装该软件。
jre - Java运行时环境,只要运行Java程序就必须安装该软件。
javac.exe - Java语言编译器,用于将高级源代码文件编译为字节码文件。
java.exe - Java语言解释器,用于启动Java虚拟机对字节码文件进行边解释边执行。
JVM - Java虚拟机,用于作为Java语言和操作系统之间的桥梁。

3 编写Java程序的流程
(1) 新建文本文档,将文件的名称由xxx.txt修改为xxx.java。
(2) 使用记事本的方式打开文件,编辑Java代码后保存。
(3) 启动dos窗口,将路径切换到xxx.java所在的目录。
(4) 使用javac xxx.java进行编译,生成xxx.class的字节码文件。
(5) 使用java xxx进行解释执行,打印最终的结果。

注意
若文本文档没有显示.txt后缀时,则具体处理如下:
组织 => 文件夹和搜索选项 => 查看 => 隐藏已知文件名的扩展名 => 去掉勾选 =>确定

4 常用的快捷键

ctrl+s 保存
ctrl+a 全选
ctrl+c 复制
ctrl+v 粘贴
ctrl+x 剪切
ctrl+f 查找
ctrl+z 撤销
windows+d 打开桌面
windows+e 打开计算机
windows+l 锁屏
windows+r 打开运行,输入cmd后回车,就可以启动dos窗口
windows+tab 切换任务
alt+tab  切换任务
ctrl+alt+delete 打开任务管理器
ctrl+shift 切换输入法,若切换到中文输入法后就可以使用shift进行中英文切换

5 常用的dos命令

d: 表示切换到d盘
cd 目录名/路径 表示切换到指定的目录中
dir 表示查看当前目录的内容
cls 表示清屏 
cd .. 表示切换到上一级目录     

6 环境变量的配置
基本概念
通常情况下的可执行文件需要在该文件所在的目录中才能使用,为了使得该可执行文件可以在任意的位置直接使用,此时就需要配置环境变量Path。

配置方式
计算机 => 鼠标右击 => 属性 => 高级系统设置 => 高级 => 环境变量 => 系统变量
=> 找到Path,点击编辑 => 将javac.exe所在的路径拷贝到Path变量值的最前面,添加分号
=> 一路点击确定即可
切记Path变量值原来的内容不要改!
配置环境变量后记得重启dos窗口!

7 Java语言的跨平台特性
由于不同的操作系统中都提供了Java虚拟机进行解释执行,因此对于同一份字节码文件来说,可以实现一次编译,到处运行的美名。

编码:编写第一个java程序Hello world

public class helloWorld(){
	public static void main(String args){
		system.out.println("Hello world");
	}
}

变量

1 变量的基本概念
当需要在程序中记录单个数据内容时,则声明一个变量来记录即可,而变量的本质就是在内存中申请一块存储单元,并且该区域中的数据内容可以发生改变,因此得名为 变量。
由于存储的数据内容不同导致所需的内存空间大小不同,在Java语言中使用数据类型的概念加以描述,并指定该区域一个变量名的概念来记录地址信息。
2 变量的声明方式

数据类型 变量名 = 初始值;     - 其中=初始值可以省略,但;不可以省略。
如:
String name = "xiaomage"; - 推荐该方式
int age = 18;
int age;   

注意:
在main()方法体中直接声明的变量叫做 局部变量,局部变量的作用域为:从声明开始一直到该方法体结束。

3 标识符(变量名)的命名规则

  • 由字母、数字、下划线以及美元$组成,其中数字不能开头。
    如:name age id country name2 name3 等
  • 不能与Java语言中的关键字同名,关键字就是Java语言中用于代表特殊含义的单词。
    如:class int void static 等
  • 区分大小写,长度没有限制但不宜过长。
    如:Day 和 day代表两个不同的变量名,不推荐使用
  • 尽量做到见名知意,支持中文但不推荐使用。
    如:sendMsgToAll

数据类型

基本分类

在Java语言中将数据类型分为两大类:
基本数据类型:byte、short、int、long、float、double、char、boolean。
引用数据类型:数组、类、接口、枚举以及标注。

常见的进制

在日常生活中采用十进制,逢十进一,每个十进制数字的权重:100、101、10^2、…
在计算机的底层采用二进制,逢二进一,每个二进制数字的权重:20、21、2^2、…
为了简化二进制的表示形式,通常会采用八进制和十六进制来描述。

在二进制中操作最高位(最左边)代表符号位,使用0代表非负数,使用1代表负数。

进制之间的转换(尽量掌握、原理)

1 正十进制转换为正二进制的方式
a.除2取余法,让十进制整数不断地除以2记录余数,直到商为0将所有余数逆序排列。
b.拆分法,将十进制整数拆分为若干个二进制权重的和,若有该权重则下面写1,否则写0。

如: 
34 = 32 + 2

128  64  32  16      8  4  2  1
0   0   1   0       0  0  1  0   => 0010 0010

2 正二进制转换为正十进制的方式
a.加权法,让二进制的每个数字乘以当前位的权重,再将所有乘积累加起来即可。

如:
0010 0010 => 0*2^7 + 0*2^6 + 1*2^5 + 0*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2^0
=> 0 + 0 + 32 + 0 + 0 + 0 + 2 + 0
=> 34

3 负十进制转换为负二进制的方式
a.将十进制整数的绝对值转换为二进制,然后进行按位取反再加1。

如:
-34 转换为二进制的结果:
34转换为二进制: 0010 0010
按位取反:       1101 1101
再加1:          1101 1110    

34: 0010 0010 
-34: 1101 1110 +
1  0000 0000  (若只保留低8位二进制,则最高位的1溢出/丢弃, 结果是:0 )

4 负二进制转换为负十进制的方式
a.先减1再按位取反,然后采用加权法合并为十进制整数,最后添加负号。

如:
1101 1110转换为十进制:
先减1:   1101 1101 
按位取反:0010 0010
合并十进制整数:34
最后添加负号: -34

解析:
1个二进制位:  0  1
2个二进制位:  00 01 10 11
3个二进制位:  000 001 010 011 100 101 110 111 

5 二进制转换为八进制的方式(了解)

a.将每三位二进制合并为一位八进制,并使用0作为八进制的前缀。
如:
010 001(二进制) => 021(八进制)

6 八进制转换为二进制的方式(了解)

a.将每一位八进制拆分为三位二进制,并使用0b作为二进制的前缀(jdk1.7的新特性)。  
如:
063(八进制) => 0b110 011(二进制)

7 二进制转换为十六进制的方式(了解)

a.将每四位二进制合并为一位十六进制,并使用0x作为十六进制的前缀。
如:
1010 0111(二进制) => 0xa7(十六进制,使用a~f来代表10~15之间的整数)

8 十六进制转换为二进制的方式(了解)

a.将每一位十六进制拆分为四位二进制,并使用0b作为二进制的前缀。
如:
0xc9(十六进制) => 0b1100 1001

单个字节表示的整数范围(重中之重)

在计算机中单个字节占8位二进制位,最高位表符号位,0表非负数,1表负数,具体如下:
非负数的表示范围是:0000 0000 ~ 0111 1111 => 0 ~ 127 => 0 ~ 2^7-1
0000 0000 => 0
0111 1111 => 0*2^7 + 1*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0
=> 64 + 32 + 16 + 8 + 4 + 2 + 1
=> 127
负数的表示范围是:1000 0000 ~ 1111 1111 => -128 ~ -1 => -2^7 ~ -2^0
1000 0000 => 减1:0111 1111
=> 按位取反:1000 0000
=> 转换十进制:128
=> 添加负号: -128
1111 1111 => 减1:1111 1110
=> 按位取反:0000 0001
=> 转换十进制:1
=> 添加负号: -1
综上所述:
对于单个字节来说,所能表示的十进制整数范围是:-128 ~ 127 => -2^7 ~ 2^7-1.

整数类型(重点)

在Java语言中用于描述整数数据的类型有:byte、short、int、long,推荐使用int类型。     其中byte类型在内存空间中占1个字节的大小,因此表示范围是:-2^7 ~ 2^7-1.
                                -128 ~ 127.
其中short类型在内存空间占2个字节的大小,因此表示范围是: -2^15 ~ 2^15-1.
                                -32768 ~ 32767.
其中int类型在内存空间占4个字节的大小,因此表示范围是:-2^31 ~ 2^31-1.
                             正负二十一亿之间.
其中long类型在内存空间占8个字节的大小,因此表示范围是:-2^63 ~ 2^63-1.
                              比int类型还大的数.
在Java程序中直接写出的整数数据叫做 直接量/字面值/常量,如:66,默认为int类型,若希望表达更大的直接量,则需要在直接量的后面加上l或者L,推荐使用L。

浮点类型(重点)

在Java语言中用于描述小数数据的类型有:float、double,推荐使用double类型。
其中float类型在内存空间中占4个字节,叫做单精度浮点数,通常小数点后可以取到7位。
其中double类型在内存空间中占8个字节,叫做双精度浮点数,通常小数点后可以取到14位
在Java程序中直接写出的小数数据叫做直接量,默认为double类型,如:3.14,若希望表达float类型的直接量,则需要在直接量后面加上f或者F.

扩展:
由于float类型和double类型无法实现精确计算,因此商业开发中需要借助java.math.BigDecimal类型加以描述。
查询float和double类型的底层结构。

布尔类型(重点)

在Java语言中用于描述真假信息的类型有:boolean,数值只有:true(真) 和 false(假)
其中boolean类型占用内存空间的大小没有明确的规定,通常认为是1个字节。

字符类型(重点)

在Java语言中用于描述字符信息的类型有:char,如:‘1’,‘a’,'中’等。
其中char类型占用内存空间的大小为2个字节,在以后的开发中char类型很少使用,使用更多的是多个字符组成的字符串,使用""括起来,并且用String类型加以描述。

为了使得字符能够有效地记录到计算机中,给每个字符指定了一个编号,叫做 ASCII值.
[外链图片转存失败(img-AtCsqbg7-1564412078261)(https://i.imgur.com/xdZuN21.jpg)]

要求记住的ASCII值有:

'0' - 48   'A' - 65   'a' - 97  空格 - 32  换行符 - 10

要求大家记住的转义字符有:

\" - "   \' - '  \\ - \   \t - 制表符(tab键)  \n - 换行符

基本数据类型之间的转换(尽量理解)

在Java语言中数据类型之间的转换分为两大类:
自动类型转换 - 主要指从小范围到大范围之间的转换。
强制类型转换 - 主要指从大范围到小范围之间的转换。
- 目标类型  变量名 = (目标类型)源类型的变量名。
- byte b1 = (byte)s1;
- 尽量少使用强制类型转换,因为可能会造成数据的丢失。

运算符

算术运算符

— + - * / %表示取模/取余运算符

注意:

  • 当两个整数进行除法运算时,结果只取整数部分,丢弃小数部分;

  • 若希望保留小数部分则处理方式如下:

    将其中一个操作数强转为double类型后再进行除法运算。
    将其中一个操作数乘以1.0后再进行除法运算(推荐)。

  • 0不能做除数,0.0可以做除数但结果是无穷大,因此通常不建议使用

  • +运算符既可以表示加法运算符也可以表示字符串连接符,具体区别如下:

    1 若+运算符两边的操作数没有任何一个是字符串类型时,则按照加法运算符来处理;
    2 若+运算符两边的操作数只有有一个是字符串类型,则按照字符串连接符来处理;

关系/比较运算符

>  表示是否大于运算符       >=  表示是否大于等于运算符
<  表示是否小于运算符       <=  表示是否小于等于运算符
== 表示是否等于运算符       !=  表示是否不等于运算符

所有以关系运算符为最终运算的表达式结果一定是boolean类型,只有:true 和 false。

3 自增减运算符
+  表示加法运算符      ++ 表示自增运算符,让变量自身的数值加1
-  表示减法运算符      -- 表示自减运算符,让变量自身的数值减1

逻辑运算符

&& 表示逻辑与运算符,相当于"并且",只有运算符两边的结果都为真,最终的结果才为真
- 同真为真,一假为假
|| 表示逻辑或运算符,相当于"或者",只要运算符两边的结果有一个为真,最终结果为真
- 一真为真,同假为假
!  表示逻辑非运算符,相当于"取反",真为假,假为真。

短路特性:

对于逻辑与运算符来说,若第一个条件为假则整个表达式一定为假,第二个条件跳过不执行
对于逻辑或运算符来说,若第一个条件为真则整个表达式一定为真,第二个条件跳过不执行

条件运算符###

?: - 表示条件运算符,又叫做三目运算符。
条件表达式 ? 表达式1: 表达式2
=> 判断条件表达式是否成立,若成立则执行表达式1,否则执行表达式2

赋值运算符

1 简单赋值

= 表示赋值运算符,用于将=右边的数值赋值给=左边的变量,切记不要与==混淆。
笔试题:
ia == 2;  - 表示判断ia是否等于2
2 == ia;  - 表示判断2是否等于ia
ia = 2;   - 表示将数值2赋值给变量ia,覆盖ia原来的数值
2 = ia;   - 编译报错     

2 复合赋值

+=  -=  *=  /=  ...
如:
ia = ia + 2;   =>  ia += 2; 从结果上来说等价.
笔试题:
byte b1 = 2;
b1 += 2 真正等价的是: b1 = (byte)(b1 + 2);

移位运算符(了解)

<<  表示按照二进制位向左移动右边填0,叫做左移运算符
>>  表示按照二进制位向右移动左边填符号位,叫做右移运算符
>>> 表示按照二进制位向右移动左边填0,叫做无符号右移运算符

位运算符(了解)

& 表示按位与运算符,同1为1,一0为0(1看做真,0看做假).
| 表示按位或运算符,一1为1,同0为0.
~ 表示按位取反运算符,1为0,0为1.
^ 表示按位异或运算符,相同为0,不同为1.

运算符的优先级

(1) ()的优先级极高;
(2) =的优先级极低;
(3) * / %的优先级高于+ -,同级的哪个在前先算哪个;

分支结构

基本概念

在某些特殊场合中根据判断的条件是否成立来决定是否执行某段代码的结构,叫做分支结构

if分支结构

(1)语法格式
if(条件表达式){
语句块;
}	
(2)执行流程
判断条件表达式是否成立
=> 若成立,则执行语句块;
=> 若不成立,则分支结构结束;

if-else分支结构

(1)语法格式
if(条件表达式){
语句块1;
}
else{
语句块2;
}
(2)执行流程
判断条件表达式是否成立
=> 若成立,则执行语句块1;
=> 若不成立,则执行语句块2;

if-else if-else分支结构

(1)语法格式
if(条件表达式1){
语句块1;
}
else if(条件表达式2){
语句块2;
}
... ...
else{
语句块n;
}	
(2)执行流程
判断条件表达式1是否成立
=> 若成立,则执行语句块1;
=> 若不成立,则判断条件表达式2是否成立
=> 若成立,则执行语句块2;
=> 若不成立,则执行语句块n;

switch-case分支结构

(1)语法格式
   switch(变量/表达式){
       case 直接量1: 语句块1; break;
       case 直接量2: 语句块2; break;
       ... ...
       default: 语句块n;
   }
(2)执行流程
   计算变量/表达式的数值 => 判断是否与直接量1匹配
      => 若匹配,则执行语句块1 => 执行break跳出该结构;
      => 若不匹配,则判断是否与直接量2匹配
               => 若匹配,则执行语句块2 => 执行break跳出该结构;
               => 若不匹配,则执行语句块n;

注意事项
switch()中支持的类型有:byte、short、char以及int类型,从jdk1.5开始支持枚举类型,从jdk1.7开始支持String类型。

循环结构

基本概念

当需要在程序中重复执行一段代码时,则使用循环结构。

for循环

(1)语法格式
   for(初始化表达式; 条件表达式; 修改初始值表达式){
       循环体;
   }
(2)执行流程
   执行初始化表达式 => 判断条件表达式是否成立
       => 若成立,则执行循环体 => 执行修改初始值表达式 => 判断条件表达式是否成立
       => 若不成立,则循环结束

break和continue

break关键字可以用在switch-case分支结构和循环结构中,用于跳出当前循环。
continue关键字可以用在循环结构中表示结束本次循环继续下一次循环(熟悉)。

特殊的循环

for(;;) - 这种没有明确循环条件的循环叫做无限循环,俗称"死循环"。
该循环通常与break关键字搭配使用

双重for循环

(1)语法格式
for(初始化表达式1; 条件表达式2; 修改初始值表达式3){
	for(初始化表达式4; 条件表达式5; 修改初始值表达式6){
		内层循环的循环体;
	}
}
(2)执行流程
执行表达式1 => 判断表达式2是否成立
=> 若成立,则执行表达式4 => 判断条件表达式5是否成立
=> 若成立,则执行循环体 => 执行表达式6 => 判断条件表达式5是否成立
=> 若不成立,则内层循环结束 => 执行表达式3 => 判断表达式2是否成立
=> 若不成立,则外层循环结束

while循环

(1)语法格式
   while(条件表达式){
      循环体;
   }

(2)执行流程
   判断条件表达式是否成立
       => 若成立,则执行循环体 => 判断条件表达式是否成立
       => 若不成立,则循环结束

(3)注意事项
   a.while循环和for循环可以完全互换;
   b.while循环通常使用在明确循环条件不明确循环次数的场合中;
     for循环通常使用在明确循环次数但不明确循环条件的场合中;
   c.while(true)等价于for(;;)都表示无限循环;

do-while循环

(1)语法格式
   do{
     循环体;
   }while(条件表达式);

(2)执行流程
   执行循环体 => 判断条件表达式是否成立
        => 若成立,则执行循环体 => 判断条件表达式是否成立
        => 如不成立,则循环结束

(3)注意事项
   do-while循环主要用于至少执行一次循环体的场合中;

一维数组(重点)

基本概念

当需要在程序中记录单个数据时,则声明一个变量来记录即可;
当需要在程序中记录多个类型相同的数据时,则声明一个一维数组来记录,而一维数组的本质就是在内存中申请一段连续的存储空间,每个存储单元负责记录一个数据。

数组名称 - 主要用于记录该连续内存空间的首地址,代表该数组。
数组元素 - 主要指存放在数组中的数据内容。
数组长度 - 主要指该数组可以存放的元素个数,通常使用 数组名.length 的方式获取。
数组下标 - 主要指数组元素在数组中的编号,从0开始 一直到 数组名.length-1。

数组的声明

(1)语法格式
   数据类型[] 数组名称 = new 数据类型[数组的长度];  - 动态方式
如:
   int[] arr = new int[5]; - 声明一个长度为5元素类型为int类型的一维数组
   int num = 5;            - 声明一个int类型的变量num,初始值为5
   int arr[] = new int[5]; - 不推荐使用
   double[] arr = new double[3]; - 声明一个长度为3元素类型为double类型的一维数组

注意:
   只有在声明数组时[]中的数字才代表数组的长度,否则一律代表数组的下标;

(2)数组元素的初始化
   数据类型[] 数组名称 = {初始值1, 初始值2, ...};  - 静态方式
如:
   int[] arr = {10, 20, 30}; - 声明一个长度为3元素类型为int类型的一维数组
 该数组元素的初始值为:10 20 30

二维数组

[外链图片转存失败(img-X5aCrpW5-1564412078261)(https://i.imgur.com/BCVAsq7.png)]
基本概念

一维数组本质上就是一段连续内存空间,用于存放多个类型相同的数据内容。
二维数组本质上就是由一维数组组成的数组,换句话说,二维数组中的每个元素都是一个一维数组,而一维数组的每个元素才是具体的数据内容。

声明方式

(1)语法格式
   数据类型[][] 数组名称 = new 数据类型[行数][列数];
如:
   int[][] arr = new int[2][3];  - 声明一个具有2行3列元素类型为int类型的二维数组
   其中行下标范围是:0 ~ 1;
   其中列下标范围是:0 ~ 2;

思考:
   arr代表什么?  arr[0]代表什么?  arr[0][0]代表什么?
解析:
   arr表示二维数组的名称,代表连续内存空间的首地址
   arr[0]表示二维数组的第一行,也就是一个一维数组
   arr[0][0]表示二维数组的第一行第一列,也就是第一个数据内容

   arr.length代表二维数组的大小,也就是元素/一维数组的个数,换句话说,二维数组行数
   arr[0].length代表二维数组第一行的大小,也就是一维数组的大小,换句话说,就是列数
   
(2)初始化
   数据类型[][] 数组名称 = {{初始值1,初始值2, ...}, ...};
如:
   int[][] arr = {{1, 2, 3}, {4, 5, 6}};

你可能感兴趣的:(你那么努力总得给自己留点记忆)