Java学习笔记-2022年12月12日
(这是第一行)
牢记使命:文化基因的传播
暂时的计划:优秀程序员
项目需求
管理系统:程序员书店
网页游戏:模拟程序员人生
小说形式的Java从入门到精通
学习方法
形而上的是意思,不是文字,尽量不要发展自己的namespace,否则别人不懂
工科,不必看太细
自言自语,输入同时输出,学习是为了面试、跟同事讨论、做视频输出
我的优势:项目想象力、知识点串连
程序员的工作就是边做边学,工科,实现最重要
每次进度慢下来,这是直觉在提醒我,走错路了。我要让成功变成必然
回忆好状态:智力题(联系现实),读书-进化心理学(创作)
多用百度
脑子动起来,迷茫时关注大佬up主
学概念时,哲学三问:这是什么?这怎么实现的?这可以用来做什么?
喜欢学理论,脑子动起来,迷茫时关注大佬
认清自己,单兵实干家
学习过程中找状态,不着急
关注大佬up主,跟着大佬的思路
自己做整理,存ROM,求精不求多,对新的概念做联想
脑子动起来,脑子从一个状态变成另一个状态,混乱时停下来,及时止损
Java基础
注释
/* 注释 */
// 注释
/**
* 多行注释
*/
public class
package
import
Class object = new Class();
基本类型
数字 * 6 + char + boolean
byte short int long float double char boolean
void用于空返回的方法
long默认0L
float默认0.0f
double默认0.0d
char最小值是 \u0000;最大值是 \uffff
引用类型
Java引用类型的变量类似于C/C++的指针。
变量一旦声明后,类型就不能被改变了。
对象、数组都是引用数据类型。
所有引用类型的默认值都是null。
一个引用变量可以用来引用任何与之兼容的类型。
final double PI = 3.14; // final不可修改,通常用大写字母
自动类型转换
short转int,float转double
boolean不能
float转int,舍弃小数,不是四舍五入
强制类型转换
int i = 100;
byte b = (byte) i;
隐含强制类型转换
整数默认int
小数默认double
float f = 1.1f // 定义float时要有f
Java语言支持的变量类型有:
类变量:方法之外,用 static 修饰。
实例变量:方法之外,没有 static 。
局部变量:类的方法中的变量。
Java 局部变量
在方法、构造方法、语句块
不能用访问修饰符
分配栈内存,run时new,run完就没了
实例变量
在类中,但在方法、构造方法和语句块之外,多是private
对象被new之后,实例变量就有了,在对象被销毁的时候销毁
在静态方法或其他类中,应该用完全限定名:ObjectReference.VariableName。
类变量(静态变量)
大多数是public static final,用大写字母。
存在静态存储区,只有一份,在第一次被访问时创建,在程序结束时销毁。
同一个类private,同一个包(默认),子类protected,所有包public
private
private用来隐藏类的实现细节和保护类的数据
private可用于变量、方法、构造方法
类和接口不能用private
private变量只能通过类中的public getter方法被外部类访问
protected(复杂,少用)
如果子类和基类不在同一package:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。
运算符
算术运算符 + - * / % ++ --
关系运算符 == != > < >= <=
逻辑运算符 && || !
赋值运算符 = += -= *= /= %=
三元运算符 int max = a > b ? a : b
位运算符,少用
instanceof 运算符
String str = "abc";
boolean b = str instanceof String; // 由于 str 是 String 类型,所以返回真
循环控制
while( i > 0 )
至少一次的do while
for( int i = 0; i < 10; i++)
for each
break 打断循环或switch
continue 关键字
continue 让程序立刻跳转到下一次循环。
在 for 循环中,continue 跳转到更新语句i++。
在 while 或者 do…while 循环中,跳转到布尔表达式的判断语句i>0。
if else
switch case
包装类
Number Boolean Character
日期时间
正则表达式
try catch finally
为什么要有try?方法调用时,不可run,返回原因
extends class
implements interface
this自己 super引用当前对象的父类
final
重写(Override) extends父类
重载(Overload) 同一class中,方法名同,参数不同,返回值随意
多态
implements interface
HashMap key-value
HashSet没重复
泛型:
E - Element (集合的元素)
T - Type(Java 类)
K - Key(键)
V - Value(值)
N - Number(数值类型)
? - 不确定的 java 类型
JVM
JRE
JDK
.txt -> .exe // 编译之后,操作系统可直接run
.java -> .class -> JVM // 编译之后,给JVM解释执行,JVM运行在操作系统上
JavaWeb
Servlet是一个能处理HTTP请求,发送HTTP响应的程序
JSP简单输出HTML,混带Java代码
out
session
request
Cookie存在用户浏览器中
Session存在服务器端,存在服务器上的文件、数据库、内存或 Redis 这种内存型数据库。
Session ID存在Cookie和服务器各一份
客户端之后对同一个服务器进行请求时会顺带Cookie,服务器收到之后找Session ID,继续之前的业务操作。
框架
顺序
new Maven Project
pom.xml
application.yml
前端html放进来
再后面全是java类
Spring
控制反转IoC
对象实例化的控制权交给外部环境(Spring框架、IoC容器)
例如:现有类A依赖于类B
●传统的开发 :在类A中手动new一个B的对象
●使用IoC思想的开发 :通过IoC容器(Spring框架)来实例化对象,要用哪个对象,直接从IoC容器里面拿
Bean依赖注入DI
Spring中的bean
面向切面AOP
多个方法的相同位置出现了重复的代码,比如:权限检查,日志代码等,横切逻辑代码
AOP横向抽取,把横切逻辑代码和业务逻辑代码分离
SpringMVC
对接前端
简化Servlet
MyBatis
简化数据库操作
MyBatis工作量大,要写SQL,性能好
对比Hibernate隐藏SQL
SpringBoot
Ctrl-v SpringBoot骨架代码from官网
自动配置,省事
SpringCloud
微服务
分布式
注册中心、配置中心、服务器集群、负载均衡
SQL
对data的操作都有封装,要用时查字典
Database,Table,Column
SELECT * FROM students;
SELECT * FROM students WHERE score >= 80;
SELECT id, name, score FROM students;
SELECT id, name, score FROM students ORDER BY score;
SELECT id, name, score FROM students ORDER BY score DESC;
SELECT COUNT(*) FROM students;
SELECT AVG(score) average FROM students;
INSERT INTO students (name, score) VALUES ( '小明', 80);
UPDATE students SET name='小明', score=90 WHERE id=1;
DELETE FROM students WHERE id=1;
视图是虚拟的表,用户只能拿到视图,安全
存储过程是对一系列 SQL 操作的批处理。
好处:
代码封装,安全;
代码复用;
预先编译,高性能。
在存储过程中用游标对一个结果集做移动遍历。
游标用于交互式应用,用户对数据集中的任意行做浏览和修改。
触发器在某个操作时自动run:DELETE、INSERT、UPDATE。
触发器在语句run之前run用 BEFORE ,之后run使用 AFTER 。
BEFORE 用于数据验证和净化,AFTER 用于审计跟踪,将修改记录到另外一张表中。
MySQL 不允许在触发器用 CALL ,不能调用存储过程。
事务(transaction)
回退(rollback)
提交(commit)
不能回退 CREATE 和 DROP 语句
索引
B树BalanceTree
B+树
hash散列
Redis
NoSQL
缓存 响应快
6种数据结构,逻辑少,速度快
理论
设计模式
常用的软件设计原则
软件工程
开发流程:
分析、设计、实现、测试
软件设计原则:
高内聚、低耦合,文件为单位
直接完整开发,瀑布模型。
为了预防需求变更,增量模型。
算法
一组动作,有结果,时间有限
结构*3:顺序、判断、循环
常用的排序、查找
递归:用到自己,每次不同,最后有结果
数据结构
数组
链表
栈
队列
树
二叉树
图
操作系统
抽象硬件,管理硬件,提供API,提供用户界面UI
管理:内存、进程、硬件设备、文件
饿死:进程缺资源,不能run了
死锁:
互斥
占有和等待
不可抢占
环路等待
自举
网络
单机之间的通信是互联网
软件进程线程之间的通信归操作系统管
硬件之间的通信用总线
HTTP
三个部分
get / HTTP
key-value
post参数
UDP 无连接 不可靠 低耗
TCP 面向连接 可靠
IP 标识唯一的连接
URL
C/S
P2P
分组交换
每个分组都有首部和尾部,包含了源地址和目的地址等控制信息,在同一个传输线路上同时传输多个分组互相不会影响
总时延 = 排队时延 + 处理时延 + 传输时延 + 传播时延
处理时延:主机或路由器收到分组时进行处理所需要的时间,例如分析首部、从分组中提取数据、进行差错检验或查找适当的路由等
传输时延:主机或路由器传输数据帧所需要的时间
传播时延:电磁波在信道中传播所需要花费的时间
网络分层
5层
应用层,传输层,网络层,数据链路层,物理层
7层OSI
应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
帮助应用程序开发者处理表示层和会话层
TCP/IP
应用层,传输层TCP,网络层IP,网络接口层
TCP/IP 体系结构不严格遵循 OSI 分层概念,应用层可能会直接使用 IP 层或者网络接口层
HTTP的URL前缀是http://,端口号默认80
HTTPS的URL前缀是https://,端口号默认443,安全性高,但耗费更多服务器资源
计算机组成
1010是基础,有了10之分,就有了变数
CPU软件、内存数据、IO硬件
CPU
CPU组成:算术逻辑单元、控制单元、一系列寄存器
内存
寄存器+RAM+ROM(IO快的容量小)
RAM通过地址找ROM
IO
总线连接各个硬件
总线分类:数据、地址、控制
数据
数字:自然界的类似抽象为相同
文本:人类交流
音频:模拟,有损,话筒输入,音箱输出
图像:二维点图或形状描述图
视频:连续图像带音频
程序设计语言
发展:
1010、汇编、C、C++、Java、Spring
汇编
最快,CPU相关,不可移植
用英文字母、符号串来替代一个特定的指令的二进制串,比如,用"ADD"代表加法,"MOV"代表数据传递等等
汇编程序的每一句指令只能对应实际操作过程中的一个很细微的动作,例如移动、自增
C语言
C语言把相关的机器指令合成为单条指令,去掉了操作细节,例如操作寄存器。
在C语言之前,操作系统是用汇编语言写的,不可移植。
移植性:C语言的核心以及ANSI函数调用都具有移植性,但仅限于流程控制、内存管理和简单的文件处理。其他的东西都跟平台有关。
比如说,为Windows和Mac开发可移植的程序,用户界面部分就需要用到与系统相关的函数调用,所以要写两次用户界面代码。有一些库可以减轻工作量。
C++
C语言+面向对象
面向对象编程是结构化编程的下一步。
程序由对象组成,其中的对象是数据和函数的离散集合。
有很多对象库,编程简单,只要将一些程序堆在一起。
比如说,有很多的GUI和数据库的库实现为对象的集合。
优点:组织大型程序时比C好得多。支持面向对象。通用数据结构组成的库减轻了处理低层细节的负担。
缺点:非常大而复杂。跟C一样语法滥用。比C慢。
移植性:比C好多了,但还不是很好。因为它有C语言相同的缺点,大多数可移植性用户界面库都使用C++对象实现。
Java
Java从C++中借用了大量的语法,丢弃了C++的复杂功能,强制面向对象,所以紧凑、易学。
没有指针、自动分配垃圾回收、虚拟机机制,所以不易崩溃且不会泄漏资源。
移植性好,二进制码可移植到其他平台。
内含的类库非常标准且极其健壮。
缺点:虚拟机run可移植的字节码而非本地机器码,程序将比真正编译器慢。早期的功能如AWT没经过慎重考虑,虽然被正式废除,但为了向后兼容而保留。
编程语言都有一些共性是不变的,3点:
1:1或0,内存电位的设置
2:if else条件判断,该功能可通过逻辑门实现
3:goto程序下一条指令地址可设置,可循环,默认顺序
链接库,静态或动态的
编译,txt转成exe,run exe
解释,run txt,按行run
对比其他exe软件,编程软件为专业人员专用
人工智能
问题求解
蛮力搜索或启发式搜索
专家系统
可以推理的基于规则的系统
抽象事实,得到知识
可控的
神经网络
仿生,接受刺激则加强联系
造机器人
感知、学习、思考、动作
如果加入进化心理学,给单机行为动机,机器就有自主行为,像人一样,之后发育成为超人
大事记录
1997年10月6日出生
2022年10月21日决定自学Java,走优秀程序员路线,最终目标永不变:文化基因的传播
2022年11月7日开了这篇整理
2022年11月29日到12月3日,刷了一遍进化心理学