Java方向知识点梳理(一)

2018年春招复习笔记草稿,舍不得扔,遂码上去

通过什么方式访问Hibernate:

1、使用HibernateTemplate的反转控制以及回调方法

2、继承HibernateDAOSupport,并申请一个AOP拦截器节点

Spring与Hibernate结合:

配置HibernateSessionFactory
继承HibernateDAOSupport实现一个DAO
使用AOP装载事务支持

Spring支持事务管理类型:编程式事务管理、声明式事务管理

Spring配置到应用开发:基于XML、基于注解、基于静态Java代码

Spring支持的Bean作用域:Singleton、Prototype、Request、Session、Global session

使用SpringJDBC框架时只需通过Sstatements和queries语句从数据库种存取数据

解释AOP:面向切面编程、AOP允许程序员模块化横向业务逻辑

nginx负载均衡算法:轮询、权重、IP哈希、fair

CAS:比较并交换
ABA:例如“1 2 1” 则CAS失效
Volatile:内存可见性、禁止指令重排、禁止缓存涉及JVM内存模型

stop the world:GC时需要处于暂停,以此来判断对象的可达性

Finalize方法:同一对象只执行一次
GC算法:标记清除、复制算法、标记整理、分代回收(新生代(复制算法):老年代(标记清除)=2:1 )
火车回收算法:内存被分为块、一块代表一节车厢、很多块组成一个集合、一列火车代表一个集合、垃圾收集以车厢为单位、收集顺序按照被创建的先后顺序进行。

迭代器两种失败方式:
fail-fast:java.util包下的集合类都是快速失败,原理:用迭代器遍历一个集合时,若集合被修改则会抛出一个异常,主要涉及关键字modcount!=expectedModCount
fail-safe:java.util.concurrent下使用安全失败,原理:遍历时不直接在集合中内容访问,而是先复制原有内容,在拷贝的集合上遍历,即迭代器遍历时,不知道原有集合是否发生改变

select…..from……where……group by………having……….order….by
MySQL执行顺序:
from .......where.....group by........having..........select...........order

函数指针:C语言种实现回调函数、Java中可以利用类种的接口来实现

面向对象:将数据及对数据的操作方法放在一起,作为一个相互依存的整体

抽象、继承、封装、多态(即对象对同类对象抽象其共性)

重载:编译时多态 覆盖:运行时多态

StringBuilder:不线程安全
StringBuffer:线程安全
类加载机制:虚拟机把描述类的文件从class文件加载到内存中,并对数据进行校验,转化解析和初始化最终形成可以被虚拟机直接使用的的Java类型

类加载过程:加载、链接(验证、准备、解析)初始化、使用和卸载
JVM 加载class文件的原理:隐式加载(使用new等方式创建时会隐式调用类加载器到JVM)、显式加载(直接调用Class.forName)

JVM有3种类加载器:启动器(JavaHome\lib)、扩展类加载器(JAVAHOME\Lib\Ext)、应用类加载器(CLASSPATH)
类加载模式: 双亲委派和线程上下文
线程上下文类加载器:通过Java.lang.Thread类的setContextClassLosser()方法进行设置,若创建线程时未设置,将会从父线程继承一个,若应用程序的全局范围内都没有设置过,那这个类加载器默认是应用程序的类加载器
java中的伪泛型:只有在源码中存在编译后的字节码已替换位原来的原生类型,且在相应的地方插入了强制转换,称为类型擦除

反射机制:得到一个对象的类、获得一个类的成员变量以及方法,在运行时创建对象、在运行时调用方法
反射机制获取类的3种方法:class.forName()、类名.class、实例.getclass
创建对象的方法:new、反射机制、clone、反序列化方式

OSI模型 TCP/IP模型
应用层 应用层
表示层
会话层
传输层 传输层
网络层 网络层
数据链路层 网络接口层
物理层
TCP UDP
可靠 不可靠
面向连接 元连接
面向字节流 面向报文
效率低 效率高
全双工 半双工

TCP的流量控制:滑动窗口
拥塞避免:慢开始(指数增长)、拥塞避免(线性增长)、快重传、快恢复

Vector:默认扩充为原来的2倍,线程安全
Arraylist:默认扩充为原来的1.5倍 不线程安全

HashMap:初始大小16(因为位运算更简单的原因),2的指数增长,散列表+拉链法WeakHashMap与HashMap 不线程安全
HashTable:初始大小11,增长:old*2+1
上下文同步:是在一个时间点只能由一个线程可以修改Hash表,任何线程都需要获取对象锁
实现HashMap同步:HashMap可以通过Map m=Collections.SynchronizedMap(new HashMap())

线程:程序执行过程中能够执行程序代码的一个执行单元
进程:系统资源调度的独立单位,由数据段、程序段、和PCB三部分组成
JDBC连接数据库步骤:
①加载JDBC驱动器
②注册到DriverManger-通过Class.forName()
③建立数据库连接得到Connection对象
④建立Statement
⑤执行SQL语句

JDBC处理事务:commit().rollback
五种事务隔离级别(从高到低):可序列化、可重复读、读已提交、读未提交、不支持事务

脏读:一个事务读取了另一个事务,且未提交事务。
不可重复读:
一个事务操作导致另一个事务前后两次读取到了不同的数据
幻读:
一个事务操作导致另一个事务前后两次查询的结果数据量不同`

Class.forName()的作用是把类加载到JVM种,返回一个带有给定字符串名的类或接口相关联的class对象,且JVM会加载该类、同时JVM执行该类的静态代码段。

preparedstatement:表示预编译的sql语句对象,效率更高,代码可读性好,安全性好,可预防sql注入攻击
sql注入:只对sql语句编译过程有破坏,而且执行阶段知识指输入串作为数据处理,不再需要对sql语句解析

Hibernate:是一个持久化层框架,将表的信息映射到XML文件中,再将XML文件映射到相应持久化类中,这样就使用Hibernate独特的查询语句,返回的是List< object>类,Hibernate具有DAO类层访问层,采用Hibernate方式只需要修改DAO层的类即可
Hibernate支持单一对象简单的CRUD,具有瞬时态、持久态、脱管态
transaction Query
session 非线程安全
session Factory 线程安全
configuartion
Hibernate.cfg.xml是配置文件,*.hbm.xml是映射文件

数据库连接池:负责分配、管理并释放数据库连接,允许应用程序重复使用一个现有的数据库连接,同时还负责释放空闲
J2EE调优方法:使用数据库连接池、preparedstatment、缓存功能,

Structs Action不是线程安全

IOC方式:使得上层不再依赖于下层,通过采用一定机制来选择不同的下层实现,完成控制反转

延迟加载:通过建立一个代理对象,将对象的属性设置为默认值,只有当用的时候才去加载数据
缓存技术:将当前或接下来一段时间可能用到的数据保存到内存中,在使用的时候直接从内存中读取
优化查询:一级缓存 session 二级缓存 sessionFactory 独立于Hibernate的第三方软件中常见的产品有:ehchache。

每秒事务处理数(TPS)时最重要的指标之一
缓存一致性:每个处理器都有自己的高速缓存,且又共享同一主存,

为使得处理器内部的运算单元能够尽量被充分利用,Java虚拟机的即使编译器有类似的指令重排优化。

Java内存模型:规定所有变量都存储在主内存中。

处理器 高速缓存 缓存一致性 主内存

Java线程<—>工作内存<——->Sava和load操作<——->主内存

可见性:JVM实现方式,通过在变量修改后将新值同步回主内存,在变量读取前主内存刷新变量值这种依赖主内存作为传输媒介的方法。
实现线程3种方法:使用内核线程实现(1:1),使用用户线程实现(1:N),使用用户加轻量级线程混合实现(N:M)
轻量级线程:内核线程的一种高级接口,其实现是建立在内核上的
用户线程:完全建立在用户空间上的

主流:混合实现,1条Java线程就映射到一条轻量级进程之中。
线程调度:协同式调度(主动通知系统切换)、抢占式线程调度(被动由系统切换)
Java线程调度由系统自动完成,可通过设置优先级来控制,但不靠谱。
线程状态:新建、运行、等待、阻塞、结束
线程安全:如果一个对象可以被安全的被多个线程同时使用,那它就是线程安全。
线程安全的程度(强到弱):不可变、绝对线程安全、相对线程安全、线程兼容和线程对立
ReebtrantLock和Synchronized相似,但增加了主要项:等待可中断、可实现公平锁(默认都是非公平锁)、以及锁可以绑定多个条件。

非阻塞同步:基于冲突检测的乐观并发策略
阻塞同步:互斥同步、悲观并发策略

CAS:比较并交换
ABA漏洞:V 变量内存地址、A旧的预期值、B新值 解决办法:版本号,JUC中的原子类、或者传统的互斥同步

同步是保证共享数据争用时的正确手段,若一个方法本身就不涉及共享数据,那自然无需任何同步手段。‘
天生的线程安全
可重入代码:可在代码执行的任何时刻中断它,转而去执行其他代码,且控制权返回的时候,原来的程序不会出现任何错误。
线程本地存储:若一个变量要被某个线程独享,Java.lalng.ThreadLocal类可以实现

volatile只保证可见性,禁止指令重排,是在JDK1.5才被修复,在JDK1.5之前的Java中无法安全使用DCL(双锁检测)来完成单例模式因为volatile无法保证原子性,所以在多线程的情况下,可能会出现未分配内存而被引用的情况。

DCL单例模式:

public class Singleton{
    private volatile static singleton instance;
    public static Singleton getInstance(){
        synchronized(singleton.class){
           if(instance==null)
              instance=new Singleton();
              }
             }
            }

猜你喜欢

转载自blog.csdn.net/mikeoperfect/article/details/80793205