一、设计模式
简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你
复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spring的Factoy
单例模式:懒汉和饿汉模式,spring的bean
代理模式:动态代理:RPC远程调用,使用的就是远程代理;dubbo、Feign
模板模式:runnable(关注线程的创建) 和 thread (关注线程的管理)的关系
适配模式:旧的接口不适合,重新在旧的接口之上进行装修再利用,
组合模式:DOM树形接口,部分-整体的关系,把所有零散的关系通过树结构进行组合在一起
观察者模式:一对多。线程之间通信,或者MVC,发布/订阅(分布式 zookeeper、ereuka)
中介模式:多对多:MVVM
迭代器模式:集合中使用迭代器的方式进行遍历
桥接模式:jdbc可以适配不同的数据源
fut

二、spring
1、springMVC的流程:DispatcherServlet-> HandlerMapping-> HandlerAdapter(controller)->ModelAndView(视图解析层)
不过现在大部分都是直接RESTful编程模式了
2、spring的bean的生命周期:由容器创建并实例—》注入——》一直等待被使用,直到容器被销毁它就销毁,另外也可以调用bean自身的

三、springCloud
1、Ribbon(客户端负载均衡)
2、Feign RPC(远程调用同本地一样调用,开发者可以无感HTTP 的过程)
3、Zuul网关
4、Erueka(注册服务中心)
5、springBoot(便捷模式)
6、Nginx  服务器端负载均衡,反向代理模式
7、springConfig   统一配置中心

四、多线程
1、状态:NEW/RUNNABLE/RUNNING/BLOCKED/TEMINATE
2、JMM:原子性、可见性、有序性
3、Future(FutureTask)和Callable获取返回值+execute.submit 一个 callable实现类,然后通过future接收!
4、如何创建线程:反射、实现runnable接口,继承Thread类、callable
5、wait和sleep都进入blocked状态,但是Wait是Object的方法,sleep是Thread类的方法,yield进入RUNNABLE状态,interrupt也是中断线程进入BLOCKED的状态
6、notify也是object的方法,是唤醒wait该对象的BLOCKED线程进入RUNNABLE状态
7、阻塞的线程被interrupt的话会进入runnable状态,阻塞的操作完成了会自动进入RUNNABLE状态。被notify唤醒的BLOCKED线程
8、线程包:https://www.cnblogs.com/aheizi/p/6851416.html
8、Future是一个接口,FutureTask是一个具体实现类。这里先通过两个场景看看其处理方式及优点。

8、线程返回值:实现calleble接口,然后使用线程池ExecutorService来submit
 public static void main(String[] args) {
        ExecutorService exec = Executors.newCachedThreadPool();//工头
        ArrayList<Future<String>> results = new ArrayList<Future<String>>();//
        for(int i = 0 ; i < 10 ;i++){
            results.add(exec.submit(new TaskCallable(i)));//submit返回一个Future,代表了即将要返回的结果
        }
        
        System.out.println("size1: "+results.size());
        int count1 = 0;
        int count2 = 0;
        for(Future<String> future: results){
            System.out.println("isDone: "+future.isDone());
            if(future.isDone())count2 ++;
            try {
                System.out.println("get: "+future.get());
                count1 ++;
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        System.out.println("count1: "+count1);
        System.out.println("count2: "+count2);
    }


当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略,通常有以下四种策略:
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务

五、集合
1、https://www.cnblogs.com/dengcl/p/8046739.html
1、equels和==的问题:原本相等,但是要equals值表面相等那就需要重写咯
2、重写equels时候为什么要重写hashcode。那是因为hashset的原因!
3、hashtable的链表。原因是jvm在计算hashcode的时候不靠谱,导致不同的对象可以产生相同的hashcode,这就会在hashtable中会产生链表,当用这个hashcode找到节点时候,再用equels方法查找到特定的对象。所以得出,equels为true的(这里是等同于==),hashcode一定相同,相同对象嘛。hashcode相同的不一定equals相同的不同对象!
1、改写equels可以让两个值相等对象实现值相等逻辑。对于开发者来说是相同的
2、两个equals为true的对象,但是引用地址放入到hashset中,又成功?因为hashset是对对象进行计算hashcode。所以产生不同的hashcode。
3、所以为了避免hashcode的“表面”重复,这里的hashcode也要计算得到相同的hashcode!
4、set是唯一/map是key-value也是需要唯一不可重复key。但是hashset计算的是对象的hashcode。hashmap计算的是key字符的hashcode。
5、hashtable线程安全/hashmap不安全
6、arraylist和linkList。link插入和删除容易,遍历难因为不连接,arraylist遍历容易,插入删除难
7、hash是最快查询的方法。不需要遍历
8、array数组长度不可变,list可变!
9、当hashtable上链表过长时候,就会影响查询遍历,这时候回自动变成红黑二叉树
10、Vector比arraylist 线程安全


六、数据结构



队列

数组
树:二叉树、红黑二叉树、B-tree


七、JVM
1、内存模型:计数器、堆、栈、方法区、本地方法区、常量池
2、JVM的GC
1)标记-清理法
2)标记-整理法
3)复制法
4)新生代(清理法)-老年代(复制)
3、JVM的类加载过程:加载-连接(验证-准备-解析)-初始化-使用-卸载
4、JMM的模型:可见性、原子性、有序性
5、内存泄漏和内存溢出

八、java基础
1、java的八个数据类型:short/int/char/boolean/byte/float/double/long
2、包装类型转成基础类型为拆装,反过来为装箱
3、内部类与静态内部类的区别?:在静态内部类中无法直接访问外部类中变量
4、StringBuffer,Stringbuilder有什么区别:stringbuffer 是线程安全
5、String str=”aaa”,与String str=new String(“aaa”)一样吗?不一样,一个事常量字面量,一个是字符对象!
6、String s = "a" + "b";只创建了一个对象,就是ab,存于常量池中。
7、new String("abc")为什么又能被看成"abc"和new String()
8、String a="abc";  String b="abc";   那这里呢?  一个!
9、String a="ab"+"cd";   再看看这里呢?三个!
10、String a = “abc”;String b = “abc”;String c = new String(“abc”);两个!
12、字符串反转:Stringbuilder或者stringbuffer的reverse方法
13、float型float f=3.4是否正确?不正确——》float f=(float)3.4 或float f = 3.4f  ——》double d=4.0,
14、Math.round(11.5) 等于多少? Math.round(-11.5)等于多少?
答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。
15、swtich 是否能作用在byte(可以) 上,是否能作用在long 上(不可以),是否能作用在String上(可以)?
16、抽象类(abstract class)和接口(interface)有什么异同?
答:抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。
17、

八、mysql
https://my.oschina.net/u/3697586/blog/3113322

10-17 12:13