一些后端知识杂记

java基础

javac abc.java  编译==>字节码 abc.class

java abc //此处的abc是类名,但没有.class后缀


Linux下java程序的依赖运行

例子:Racer.java依赖Car.jar:

javac -cp .:Car.jar Racer.java  ##编译
java -cp .:Car.jar Racer  ##运行

java类型的默认值:

long:  0L

float:  0.0f

double:  0.0d

char:  'u0000'

boolean:  false


 

 局部变量必须初始化;实例变量、类变量有默认值;

 常量:final修饰,名称一般用 "大写下划线" 模式。如public static final double VALUE_PI=3.14  (前面3个修饰符不分前后)

类名驼峰+首字母大写、其他用驼峰


 java修饰符:

1. 访问修饰符:

  private: 当前class

  default: 同package

  protected: default+所有子类

  public

2. 非访问:

  static:静态变量==类变量;静态方法只能使用静态变量

  final: final类不能被继承;final方法 能继承不能重写

  abstract: 抽象类、抽象方法:不能实例化,需要子类来完成

  transient: 跳过 JVM序列化 实例变量

  synchronized:仅被同一线程访问

  volatile: 强制同步变量值


位运算符:

  ^异或:异是1

  ~按位取反

逻辑运算符&& || 具有短路特性


java增强for循环:(不用下标的情况下,遍历数组)


 自定义数组& Arrays类:java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。比如:fill、sort、equals


方法的重载:变量类型不同,但是其他结构都相同

方法重写(override):(父类)返回类型+输入类型(形参)  都不能改==》接口那一行不变,{}里面内容重写;

  方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。




 

java内存分析:对象通过引用来操作的:栈 => 堆(地址)


数字进制:0x,0,无,0b分别是16/8/10/2进制

float和double:最好避免用浮点数进行数字的比较!!而使用BigDecimal数字工具类


package包名:类似文件路径,中间用"."来分隔

package必须放在最上面,不能把import放在package上面


javadoc生成文档:

  

   生成类似官方文档样式的文档,点开index.html可见首页;

  官方文档 https://docs.oracle.com/javase/8/docs/api/


 /** 然后Tab自动生成多行注释(针对方法或者类)

  

IDEA设置参考:https://www.it610.com/article/1292552345036595200.htm


  

   运行时不能直接用:

  

  而是要使用完整的包名:

  


nums =new int[10] //创建数组并分配10个空间,会有默认值


可变长参数:

  标志是有3个点;必须写在方法的最后一个参数位置;


 

ps:平时做题的时候,一般都是用for循环加上下标来遍历数组。



面向对象的本质:

  以的方式 组织代码

  以对象的形式 封装数据


构造器:

  名称必须和类名相同,且没有返回类型。

  如果没写构造器会生成默认的无参构造器

  


封装:属性private+get/set

  属性设置private

  然后为private 提供一些public 的get、set方法

    set 的作用举例(进行一些额外的逻辑判断):

     


继承:

  Ctrl+H 打开继承树

  子类继承中,private的 变量/方法 都继承不了

  构造方法的时候,子类方法构造前需要先构造父类

  super引用父类,this调用本对象


 重写(子类重写父类方法)

  static 静态方法:方法属于类,无法重写;非静态方法,才可以重写

  final修饰的内容放在常量池中,private私有方法=》都无法重写

  修饰符范围只能扩大;抛出异常范围只能缩小;


 多态(有方法重写才有多态)

  动态编译,提高可扩展性;   多态是方法的多态,属性没有多态;

  下图中:左边是引用类型,右边是实际对象:(父类引用指向子类对象)

  

   Person 和 Object引用类型的s2/s3不能调用子类Student "独有" 的方法;但可以调用子类重写的方法;

  多态:同样的方法,到不同的对象,执行的是不同的方法(因为子类重写方法)


 static

  非静态方法可以调用静态方法;

  静态只能调用静态(因为静态是和类绑定的、只有一种固定的;非静态需要不同的实例对象)


 抽象类 abstract

   子类如果是抽象类,可以不实现抽象方法;否则一定要实现抽象方法;


 接口 interface

   接口里的方法全部是 public abstract

   在类中 重写(多个)接口中的方法


 内部类(一个类中定义另一个类)

   https://www.bilibili.com/video/BV12J41137hu?p=76



异常

  异常处理框架:

  

  throwable 分为 error 和 exception;error由JVM生成并抛出、一般是致命的错误

  Exception主要分为Runtime异常和IO异常,一般exception都可以去捕获、并处理;

    try catch finally;如果想要catch多个异常,需要由小到大;

    finally常用于释放一些资源(如IO/Scanner)

    主动抛出异常:throw用于方法内,throws用于方法名那一行

    有try catch捕捉异常,程序就不会立即停止,而会继续执行;而且可以加一些处理异常的代码来拯救一下

 



 

StringBuffer &StringBuilder


 I/O  Stream流  File文件   

例子:Java修改文件中某一行字符串:https://blog.csdn.net/shenyoubing/article/details/83013515

不进入文件内容的文件操作:https://jingyan.baidu.com/article/5bbb5a1b6920c053eba179a2.html

 java.io.*

看HFJ来简写吧~~~

序列化:

ObjectOutputStream Java对象写入字节流

ObjectInputStream 从字节流读取Java对象

I/O流:


 Math类中一些常用的(算法题常用):

1 xxxValue() 将 Number 对象转换为xxx数据类型的值并返回。
2 compareTo() 将number对象与参数比较。
3 equals() 判断number对象是否与参数相等。
4 valueOf() 返回一个 Number 对象指定的内置数据类型
5 toString() 以字符串形式返回值。
6 parseInt() 将字符串解析为int类型。
7 abs() 返回参数的绝对值。
8 ceil() 返回大于等于( >= )给定参数的的最小整数,类型为双精度浮点型。
9 floor() 返回小于等于(<=)给定参数的最大整数 。
10 rint() 返回与参数最接近的整数。返回类型为double。
11 round() 它表示四舍五入,算法为 Math.floor(x+0.5),即将原来的数字加上 0.5 后再向下取整,所以,Math.round(11.5) 的结果为12,Math.round(-11.5) 的结果为-11。
12 min() 返回两个参数中的最小值。
13 max() 返回两个参数中的最大值。
14 exp() 返回自然数底数e的参数次方。
15 random() 返回一个随机数
16 pow() 返回第一个参数的第二个参数次方。
17 sqrt() 求参数的算术平方根。


 Java集合框架

  Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。

  Collection 接口又有 3 种子类型:List (有序、Set、Queue

  常用的有 ArrayList(数组)、LinkedList(链表)、HashMap(键值对)、HashSet(无重复 线性表)、LinkedHashMap、LinkedHashSet 等等。

 Hashmap底层源码(面试高频):数组+链表+红黑树  https://juejin.cn/post/6844903518474600455

  HashSet源于HashMap,就是用了map的key来存值(无重复特性)、map的value设置占位不用。

到刷算法题时候,总结下容器的方法和复杂度 

 

https://www.jianshu.com/p/589d58033841


 泛型

  一般与集合框架一同使用。

  集合框架如List、Set等表示的是 "数据结构";

  而泛型表示的是 "数据类型"

  例子: ArrayList<Integer>   HashMap<Integer,Double>   HashSet<String>



Lambda表达式

  (函数作为参数传递到方法中

  这样就可以传递 "逻辑" 进入方法,而不是仅仅传入参数

  

 

没有lambda表达式时:

Arrays.sort(array, new Comparator<String>() {
    public int compare(String s1, String s2) {
        return s1.compareTo(s2);
    }
});

有lambda表达式:

Arrays.sort(array, (s1, s2) -> {
      return s1.compareTo(s2);
});

不用定义完整的函数了,简洁了很多


 JavaBean

  private变量 + get() / set()

 


Java9引入模块Module

jar文件是class文件的容器

 


 网络编程(补充)

java里面java.net,方法是 InetAddress

端口号,tcp/udp都是0~65535,单协议下不能冲突

TCP实现网络编程:

  

is流-->buffer-->baos流-->用toString转化为字符;baos多次读buffer里缓存的流;

    


UDP:

  


URL 统一资源定位符

  协议//ip地址:端口/项目名/资源

  https://www.bilibili.com/video/BV1LJ411z7vY?p=12

——————————  HTTP状态码  ——————————

状态码:
1系列:信息(S收到请求,正在处理)
2系列:成功
3系列:重定向(需要进一步的操作)
4系列:客户端错误(请求包含语法错误/无法完成请求)
5系列:服务端错误(处理请求过程中错误)

200 (OK)请求成功
301 (Moved Permanently)资源(网页等)被永久转移到其他URL
302 (Found)临时重定向
304 (Not Modified) 未修改。
400 (Bad Request)客户端 语法错误,Server无法识别
401 (Unauthorized)未进行用户验证
403 (Forbidden)S收到请求,但拒绝服务
404 (Not Found)请求的资源(网页等)不存在
499 (client has closed connection)S处理的时间过长,C主动断开连接
500 (Internal Server Error)S发生不可预期错误
502 (Bad Gateway)
503 (Service Unavailable)S超负荷/停机维护状态,暂时无法处理请求

 

——————————  HTTP请求方式  ——————————

GET: 获取C的数据【常用】
POST: 处理请求(数据包含在请求体里面)
GET和POST类似,都是TCP连接。
GET:(HTTP header 和 data 一起发送)
POST: 分两次发送

PUT: C向S传送数据,取代指定内容
PATCH: 类似PUT,做局部更新

DELETE
OPTION
TRACE
HEAD 返回报文头

  • PUT请求:如果两个请求相同,后一个请求会把第一个请求覆盖掉。(所以PUT用来"改"资源)
  • POST请求:后一个请求不会把第一个请求覆盖掉。(所以POST用来"增"资源)

 

————————————  F12  ————————————

HTTP请求包括多个部分:
Elements:当前页面的样式/布局
Console:js交互
Sources:页面的资源(html/css代码+图片)
Network:
Headers 一些基本信息:request url、HTTP方法(GET)、响应状态码、远程ip+port,还有 请求头、响应头;
Preview 预览面板
Response 响应信息资源未格式处理的内容,相当于html?
Timing ...

---------------------------------------------------------------------
HTTP特性:无状态、无连接、媒体独立;可靠连接

 

 

——————————  SpringBoot项目结构  ——————————

后端主要是:
(1)Controller层:
后端接受前端的请求,先在Controller层拿数据,并进行基本的格式处理
(2)Service层:
将符合要求的数据请求传给Service层,进行逻辑上的处理
(3)Dao层:
借助mybatis,通过mapper文件夹下的xml文件进行持久层的相关操作

-----------------------代码层结构-----------------------

启动类:Application.java(配置和启动引导)
@SpringBootApplication 开启了Spring组件扫描和SpringBoot的自动配置功能

数据实体类:domain
jpa项目
mybatis项目

数据接口访问层:Dao
jpa项目
mybatis项目

mapper:mybatis的数据库操作xml文件

entity:实体类文件(class)

数据服务接口层:Service
数据服务实现层:Service Implements

前端控制器层:Controller

工具库类:utils
配置类config
数据传输对象:dto
视图包装对象:vo

src/main/java 程序代码
src/main/resources 资源

-----------------------资源目录结构-----------------------
根目录 resources
项目配置文件resources/application.yml
静态资源目录resources/static/ (用于存放前端html css js 图片等)
视图模板目录resources/templates/
mybatis映射文件 resource/mapper/
mybatis配置文件 resource/mapper/config/

-----------------------MVC-----------------------
Model模型:从db存取数据、处理数据【类似后端】
View视图【类似前端】
Controller控制器:处理交互(对接M和V)

-----------------------IoC-----------------------
IoC 控制反转or依赖注入(inversion of control)
例:A使用B,则A依赖B;但有了Spring之后,Spring创建B,然后放到容器里面,之后A使用B的时候直接找容器,不用知道B了。(控制权此时在IoC容器了)

setter方法注入【略】
this.data=data;(这种语句是IoC的标志)

-----------------------AOP-----------------------
AOP 面向切面编程 (Aspect-Oriented Programming),将分散在各个方法中的,重复代码提取出来;这种横向抽取机制,方便修改。
是OOP面向对象编程的补充(OOP只能实现父子关系的“纵向重用”)

-----------------------Mybatis框架-----------------------
持久层框架,对(传统的)JDBC操作数据库 过程封装。使开发者只需要关注SQL本身
mybatis通过xml或注解的方式,配置statement
在“实体类<=>数据库”之间建立完整的映射关系(entity<==>DB) ORM:对象关系映射

-----------------------GET/POST-----------------------
GET和POST类似,都是TCP连接。
GET:(HTTP header 和 data 一起发送)
POST: 分两次发送

-----------------------Servlet-----------------------
Servlet==Server Applet 服务器小程序
编写Servlet,是编写一个Java类,这个类不能单独运行,必须部署到容器里面(比如Tomcat/Jetty)

HttpServletRequest、HttpServletResponse

-----------------------JDBC-----------------------
JDBC==Java DataBase Connectivity(JAVA数据库连接)
是访问数据库的Java API ,(Mybatis的底层框架是JDBC)

-----------------------数据库-----------------------
关系数据库:MySQL

非关系:NoSQL(Not only SQL)主要包括:【Redis】、(MongoDB)
Redis:基于内存、高性能、用作缓存;是一个Key-value数据库,value可以是string/map/list/sets/sorted sets

 

——————————  SpringCloud &微服务(初步了解)  ——————————

SpringCloud全家桶   (*待完成)

Spring Cloud Eureka “尤里卡”,服务发现

Spring Cloud Ribbon 客户端负载均衡

Spring Cloud Hystrix 断路器

Spring Cloud Zuul 网关

Spring Cloud Config 分布式配置
-----------------------------------------------------------------
Eureka 服务注册中心,失效剔除、服务保护
Dashboard 仪表盘监控 集群模式和单点模式

-----------------------------------------------------------------

Spring boot整合所有框架,
maven整合所有的jar包

 

微服务  (*待进一步学习)

分布式架构 CAP理论:
C一致性 A可用性 P容错性

Dubbo 首选ZooKeeper,ZK是CP架构(一致性+容错性)
Eureka,专注于AP(可用性+容错性)

Dubbo 提供一个组合起来不可拆分的整体功能
Eureka 组件简单轻便

Eureka容错,借助于Spring Cloud中的熔断器Hytrix
Eureka负载均衡,使用Ribbon/Nginx
Eureka服务注册及发现,采用应用层通讯HttpClient

微服务的宗旨是:
开发巨大的单体应用==》分解为小的、互相连接的微服务
【符合软件工程“模块化”+“高内聚低耦合”的思想】

各个服务之间,采用 异步+基于消息 的通讯;
每个服务都有自己的数据库,而不是像传统方式:多个服务共享一个数据库

微服务的缺点:
“there are no silver bullets”,像任何其它科技一样,微服务架构也有不足。
1. 分布式系统,带来复杂性:写代码处理局部失效问题。
2. 数据库架构,
3. 测试&部署的复杂性

SpringBoot架构,单体Web开发,适合轻量级的简单应用
微服务,适合构建复杂应用。
(与“单体怪兽”比,微服务复杂度曲线:起步高但增长不会太陡峭)

 

——————————  Postman的使用  ——————————

好文:https://blog.csdn.net/zbj18314469395/article/details/106693615

  • GET请求:用于查询。
  • POST请求:创建或更新
  • PUT请求:更新
  • DELETE请求:删除

HTTP请求包含四个部分:URL,方法,header头部和body主体

最容易用的请求方法是GET,get请求的参数在URL中;

POST请求方法:

有3种传参方式,一般用body-->raw里面的json就行

然后把需要传给后端的json输入到body里面。


 Junit 测试

Junit属于白盒测试(需要写代码;而黑盒测试不用写代码)

   

补充:两个注解用于减少重复测试代码(AOP):

  @Before  @After

   

   

原文地址:https://www.cnblogs.com/qyf2199/p/13632559.html