Fork me on GitHub
image frame

Java 多态的实现原理

Java 多态的实现原理

java方法调用依赖于方法表。
没有太细节。后续可以考虑补充

类引用调用和接口引用调用

类引用调用

jvm class文件调用方法的符号引用,然后在静态类型的方法表中找到偏移量,找不到就在父类中找

  • 方法区
    • 类型信息
      • 方法表

设计模式

设计模式

设计模式的相关复习。 先把我用过的设计模式梳理一下

单例模式

很常见

Java 实现单例的方法有很多

JavaScript呢?

工厂模式

没怎么用,有用到过。
在Android中生成部分对象时. 主要是interface, 然后根据不同的条件Factory类返回Interface的不同实现Class

抽象工厂

工厂是一个抽象类,用Producer类生成工厂类实现类

建造者模式

Builder

原型模式

实现clone ,存入数据库, 从数据库取出时使用clone()

Adapter

观察者模式

Subject

Observer

Java String

Java String

  • String
  • StringBuffer
  • StringBuilder

String

  • 修改会创建新变量

StringBuffer

  • 线程安全
  • 执行速度慢

StringBuilder

  • 线程不安全
  • 执行速度快

HTTP

HTTP

HTTP 超文本传输协议

HTTP

HTTPS

  • 客户端请求https
  • 服务端返回证书
  • 客服端生成秘钥,并用证书公钥进行加密
  • 服务端解密,获取秘钥

HTTP 状态码

  • 1 通知
    • 100
    • 101
    • 102
  • 2xx 成功
    • 200 成功 OK
    • 201
    • 202
    • 203
    • 204 响应头没有body数据
    • 205
    • 206 断点续传
  • 3xx 重定向
    • 300
    • 301
      • Moved Permanently
    • 302
    • 303
    • 304
      • Not Modified
      • 相应实体主体为空
      • 客户端已有数据,没必要重复发生
    • 305
  • 4 客户端错误
    • 400 Bad Request
    • 401 Unauthorized
    • 403 Forbidden
    • 404 Not found
    • 409 COnflict
    • 410 Gone
  • 5 服务端错误
    • 500
      • Internal Server Error
    • 502 bad gateway

Java 与JavaScript 内存泄漏与内存溢出

Java 与JavaScript 的内存泄漏和内存溢出

内存泄漏 memory leak

申请内存后无法释放已申请的内存空间

内存溢出 out of memory

申请内存时,没有足够的内存空间可以使用

java中

  • java内存回收机制

  • java内存泄漏原因

  • 引用

    • 强引用
    • 软引用
      • 内存不足时回收
    • 弱引用
      • 扫描时回收
    • 虚引用
      • 形同虚设

java内存回收机制

java中的内存主要指jvm虚拟机中的内存。通常一个java对象是被new或者通过放射的方式创建的。如果创建的是基础类型对象,则先在常量池中寻找,如果常量池中没有相对应得变量,则创建,然后栈中创建引用指向常量池

java内存泄漏原因

  • 静态类集合类引起内存泄漏
  • 结合内对象hash不同后remove不起作用
  • 监听器没有remove
  • 各种连接
  • 单例模式

    JavaScript中

  • 垃圾回收机制
  • 内存泄漏的识别方法
  • 命令行查看
  • WeakMap

垃圾回收机制

引用计数

内存泄漏识别

  • 经验法则
    • 连续5次gc, 内存占用一次比一次大
  • 浏览器
  • 命令行 process.memoryUsage

WeakMap

ES^ 新数据结构

  • WeakSet
  • WeakMap
1
2
3
4
5
6
const wm = new WeakMap();

const element = document.getElementById('example');

wm.set(element, 'some information');
wm.get(element) // "some information"

##异同

参考
1

TCP

TCP

  • 滑动窗口 (流量控制)
  • 拥塞控制
    • 拥塞避免算法
  • 网络模型
  • 3次握手
  • 4次挥手
    • timeout

滑动窗口

  • Client
    • send ack
    • send not ACK
    • not send, ready to receive
    • not send, not ready to receive
  • Server
    • rec, ack, not send to process
    • rec not ACK
    • not rec

拥塞控制

防止过多数据注入到网络,可以使网络中的路由器或链路不过载

常用方法

  • 慢开始, 拥塞控制
  • 快重传,快恢复

慢开始 慢启动

  • 发送方维持一个 拥塞窗口, 拥塞窗口和接收方共同决定发送窗口
  • 先发送1字节的试探报文
  • 当收到第一个字节的确认后,发送2字节报文
  • 2 ack, send 4 bit data. 2^n
  • 达到慢开始门限
    • cwnd < ssthresh 慢开始算法
    • cwnd > ssthresh ,停止慢开始算法,改用拥塞避免算法
    • cwnd = ssthresh 都可以

拥塞避免算法

  • 每经过一个往返时间rtt则把发送方拥塞窗口+1
  • 网络拥塞时(李儒丢包),
    • 慢开始门限设为原先一半
    • cwnd = 1
    • 执行慢开始算法

快重传 快回复

  • 快重传
    • 接收方 丢失包
      • 后续包继续发送针对该包的重传请求
    • 发送方
      • 接收到3个一样的确认 就知道该包出现错误,立刻重传该包
  • 快恢复
    • 慢开始门限减半
    • cwnd设为门限减半后的数值
    • 拥塞避免算法(高起点,线性增长)

网络模型

OSI模型

  • 应用层
  • 表示层
  • 会话层
  • 网络层
  • 传输层
  • 链路层
  • 物理层

TCP/IP模型

  • 应用层 报文 message
  • 传输层 报文段 segment
  • 网络层 分组 packet
  • 链路层 帧 frame
  • 物理层 PDU bit

3次握手

Three way handshake , 建立tcp连接

  • 客户端发送 SYN包,进入SYN-SEND状态,等待服务器确认
  • 服务器 收到SYN包,确认客户的sYN,自己也发送一个SYN-ACK包,进入SYN-RECV状态
  • 客户端收到 SYN-ACK包,发生ACK包,发送完毕,客服端和服务器进入ESTABLISHED状态,完成3次握手,

SYN攻击

Server发送SYN-ACK后,收到client的ACK之前的TCP连接称为TCP半连接 half-open connect

  • server
    • SYN-RECV

等待client确认, 需要不断重发超时,导致正常的SYN因为队列满而被丢弃

4次挥手

Four-way wavehand。

  • Client send FIN ,Client => FIN_WAIT_1
  • Server get FIN ,send ACK, Server => CLOSE_WAIT
  • Server send FIN, Server => LAST_ACK
  • Client get FIN, Client => TIME_WAIT, send ACK , Server => CLOSED

##为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态

一、保证TCP协议的全双工连接能够可靠关闭
二、保证这次连接的重复数据段从网络中消失

参考:
1
2

Spring2vue-my-code-life-4-about-android

从Spring 到Vue 4 关于Android

为什么会扯到Android呢,提起java,自然想起Android了呗。

java有java虚拟机,Android有dvm和art。

这三者有什么异同呢。

第一肯定是指令集不同。但是我也想不起具体哪个打哪个了。等下查查资料。

另外,jvm跑的是.class而dvm跑的是.dex。 art也是.dex.

从.class到.dex经历了什么呢,为什么要这样做呢?这中间的具体流程是怎样的呢?

以及,dvm和art有什么不同呢,为什么要这样做呢? 怎样实现的呢? 原理是什么呢?

说起Android虚拟机。我们都知道Android是一个基于Linux的操作系统,那么Android与Ubuntu有什么区别呢。

Android应用正在跑的进场,与Linux中的进程有什么区别,各自是怎样的呢?

一个Android应用从

  • 下载
  • 安装
  • 手机桌面获取安装包信息
  • 启动应用程序
  • 应用程序挂起
  • 待机
  • 关闭

发生了什么

下载自然是http请求,io操作。但是具体怎么实现呢,还得查一下。

安装就涉及到art dvm的区别了

手机获取安装包信息,就涉及到各种manager的关系了。

启动应用程序,就涉及到Android启动模式的相关问题了。

Android声明周期

Android四大组件

四大组件的相关

四大组件与进程的关系

四大组件的通信方式呢

那进程的通信方式呢

与Linux有什么区别呢

与原生的通信方式呢。

Android数据库。事务,触发器

  • greendao
  • realm
  • room

Android事件分发机制

分发机制首先都有屏幕,那Android window相关呢

另外就是recyclerview, 请问recyclerview

Android framework

  • Activity Manager
  • Window Manager
  • Content Provider
  • View System
  • Notification Manager
  • Package Manager
  • Telephony Manager
  • Resource Manager
  • Location Manager
  • XMMP Service

Android

  • Linux Kernel
  • Libraries & android runtime
  • application framework
  • application

FixBug-引发bug的原因在于规划

FixBug-引发bug的原因在于规划

刚修了一个bug。bug的表现是数据库到显示列表的过滤规则失效。

引发bug的原因在于:

  • 初始规划不科学,可行的情况下存有漏洞
  • 中间经过要求后修改了代码逻辑,但是没有做足够有效的验证

偏算法的逻辑代码一定要有完整的规则,用例,测试,用例图等。不然后续出错后调整的成本太大

笔试-博乐

笔试,还挺意思

  • 逻辑题
  • 其他
    • mipmap是什么
    • unit生命周期,
  • 算法题

Mipmap

//todo

unit生命周期

//todo

算法题

无序数组求第二小数

求数组最大子数组

面试-华为-通用软件工程师

华为云核心网 通用软件工程师 20200310

  • 自我介绍
  • 语言
    • java & JavaScript
  • 项目经历
    • miui的经历
  • JVM GC
    • 发展逻辑滤了一遍
  • 计算机网络
    • ISO 7层
      • 只记得5层了,忘记了七层是什么
    • 子网掩码
      • 255.255.255.0的局域网能分配多少个ip
        • 答错了,255.255.255.0 和255.255.255.255都不能用作ip
    • 面试的这个视频 7层
      • 随便说了一下
  • 数据结构
    • 顺序表 链表
      • 怎样选择使用
    • 平衡二叉树的定义
      • 没答出来,答了二叉排序树。定义是左右子树高度差小于1
  • 算法

算法题

1
2
let a = "www.abc.com"
a.split('.').reverse().join('.')

二面

  • 自我介绍
  • java , vue ,spring 都问都讲了,偏问项目
  • 不太记得了
  • 算法题

算法题

数组中有正数和负数,正数代表向右,负数代表向左。当两数字相撞时取绝对值大的数字,保证保持整个数组稳态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
let deal = function (arr) {
let stack = []
arr.map(i => {
console.info(stack)
if (stack.length == 0) {
stack.push(i)
} else {
// duibi tail he i
let t = stack[stack.length-1]
if (t * i > 0) {// 同方向
stack.push(i)
} else if (t * i <0) {//不同方向
if (t <0 && i >0){
stack.push(i)
} else if (t> 0 && i <0){
//要撞
let value = t + i
value = value > 0 ? t:i
stack[stack.length-1] = value
//维持前面稳定
let change = stack.length > 1
while(change) {
t = stack.pop();
tp = stack.pop();

if (tp > 0 && t <0) {
value = tp + t
value = value > 0 ? tp:t
stack.push(value)
} else {
change = false
stack.push(tp)
stack.push(t)
}}}}}
})
return stack
}
  • © 2020 Kfdykme
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信