Java内存
栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中。
堆:存放new出来的对象,注意创建出来的对象只包含各自的成员变量,不包括成员方法。
常量池:存放常量,如基本类型的包装类(Integer、Short)和String
代码段:用来存放从硬盘上读取的源程序代码。
数据段:用来存放static修饰的静态成员
Java垃圾回收
回收的对象:无用的对象引用,匿名对象,超出声明周期的
清理三步:
标记:标记哪些在使用,哪些不是在使用
清除:删掉标记处的对象
压缩:将剩下已用对象压缩 放在一起,以便后面对象可以直接在最后插入
设计模式
工厂模式:我们明确地计划不同条件下创建不同实例时,解决接口选择的问题
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点
适配器模式:使接口不兼容的类可以一起工作 ex:jdbc
观察者模式:当一个对象发生变化时,所有依赖于它的对象都被改变
桥接模式:使抽象与现实分离,使他们都能独立变化 ex:电灯开关,按了灯就亮,但不管内部是怎么实现的
代理模式:为其他对象提供一种代理以控制对这个对象的访问
生产者/消费者模式:不是传统的设计模式,该模式还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而消费者从缓冲区取出数据
ArrayList与LinkedList、集合
ArrayList是基于动态数组实现的,它有大小限制,超出大小则进行扩容,每次扩容上次的1.5倍
LinkedList是基于双链表实现的
ArrayList内存有序,所以适合查询,不适合添加删除。
LinkedList无序,不适合查找。但双链表更适合添加和删除操作
List和Set都实现了Collection接口
List: 允许重复,有序,可以插入null元素,LinkedList,ArrayList,Vector
Set:不允许重复,无序,只允许一个null,HashSet,LinkedHashSet,TreeSet
Map不是collection的子接口或者实现类。Map是一个接口。
Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)
线程安全的集合:Vector,HashTable,StringBuffer
HashMap
数组+链地址表实现,jdk1.8后,链地址表长度超过8时会用一颗红黑树来代替。
put方法的工作原理:
1.调用hashcode()函数得到哈希值
2.根据散列函数与hashcode计算数组下标
3.定位数组位置后,没有就插入,有就检查是否重复,重复就覆盖。若超过8,则按红黑树的规则插入。
红黑树
根节点是黑的
每个节点非黑即红
每个叶子节点都是黑的(方块)
如果一个节点是红的,那么它两个儿子都是黑的
从根节点到叶子节点,不会出现两个连续红色节点
从任何一个节点出发,到叶子节点,这条路上都有相同数目的黑色节点
排序算法
| 排序算法 | 平均时间复杂度 | 稳定性 | 空间复杂度 |
|---|---|---|---|
| 冒泡排序 | o(n^2) | 稳定 | O(1) |
| 快速排序 | o(n*log2 n) | 不稳定 | O(log2 n)-O(n) |
| 选择排序 | o(n^2) | 稳定 | O(1) |
| 二叉树排序 | o(n*log2 n) | 不一定 | O(n) |
| 插入排序 | o(n^2) | 稳定 | O(1) |
| 堆排序 | o(n*log2 n) | 不稳定 | O(1) |
| 希尔排序 | o | bu 稳定 | O(1) |
二叉树的排序
先序:根左右
中序:左根右
后续:左右根
深度为k的完全二叉树,至少有2k-1个叶子结点,至多有2k-1个结点。
spring
a.非入侵是编程,代码污染度低
b.作为一个容器,可以管理对象的生命周期,对象与对象之间的依赖关系,
c.控制反转,创建被调用的实例,并注入
d.AOP 面向切面编程 是对面向对象的补充。能够让我们在不影响原有功能的前提下,为软件横向扩展功能
DI机制,依赖注入
IOC 控制反转
创建被调用者的工作由spring来完成,然后注入调用者。
Aop 面向切面编程:完善DI,是对面向对象的补充,为程序横向扩展功能,如日志
TCP
a.tcp面向连接,udp是无连接的
b.tcp提供可靠服务,udp是尽最大努力交付
c.tcp的开销比udp大
d.tcp连接只能是点到点,而udp支持一对一,一对多,多对一的通信
这里引用别人的图片(自己画的有点丑)三次握手
四次挥手
七层体系结构
应用层:HTTP协议
表示层
会话层
传输层:TCP,UDP,SCTP等
网络层:IP协议
数据链路层:802.3/802.4,HDLC
物理层
数据库优化
1.数据库设计和表的创建时要考虑性能
2.sql编写时要注意优化
a.字段名大写 b.避免null值 c.尽量使用Int或者更小的类型
d.控制表的字段数 e.使用合适的数据类型,选择合适的索引
3.分区
4.分表
5.分库
mybatis与hibernate
mybatis:小巧,方便,高效,简单,直接,半自动,轻量级
需要自己写sql语句,但手上相对容易
hibernate:强大,方便,高效,复杂,间接,全自动话,重量级
多线程
系统抖动:是操作系统的一种反应,也可以说是一种现象。原因是,内存不足、缓存不足和进程的调度方法不合理,而造成程序的调入调出内存。这就是系统抖动。
原子性:该操作不可再分,同一时刻只能有一个线程对它进行操作
线程等待时间所占比例越高,需要越多线程
线程cpu等待所占比例越高,需要越少线程
最佳线程数目=(线程等待时间/cpu等待时间+1)*cpu数
线程池的作用:
提供了一种限制,管理资源的策略
降低资源的消耗
提高响应速度
提高线程的可管理性
线程的六种状态:
初始
运行:分就绪和运行中两种
阻塞
等待
超时等待
终止
锁:synchronized
a.修饰方法
b.synchronized代码块
死锁:
两个线程互相等待对方的锁
解决方法:加锁顺序,加锁的编号,加锁的范围
多线程的方法:具体见api
start() java虚拟机调用该线程的run方法
run()继承runnable 接口时的方法
setNaem()改变线程名
setPriority() 更改线程的优先级
setDamemon()记为守护线程或用户线程
join(s) 等待该线程终止的时间最长为 millis 毫秒。
interrupt() 中断线程。
isAlive() 测试线程是否处于活动状态。
yield() 暂停当前正在执行的线程对象,并执行其他线程。
sleep(long millisec) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
currentThread() 返回对当前正在执行的线程对象的引用。
小白是今年(20年)毕业的应届生,知识水平还不够完善,欢迎建议补充和指教啦!!!!!!