java重点和难点

前言

本文引用了很多篇博客,所以其对应原文的参考链接就不发了.所以本文算是“伪原创”了(不过理解万岁了!233)当然里面也有我自己的总结了(这个要强调一下子,突出重点。哈哈)

hashmap和concurrentHashmap

数据结构
put/get,如何扩容,hash冲突,hashmap是哪里不安全

设计模式

二面会问的:了解/最熟悉哪些设计模式,应用场景,优缺点,你项目中有用到过吗

我在简易rpc框架实现里面有用到单例模式:zookeeper 的连接对象使用了单例,

一、创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。【抽工建单元】-----抽工建单元
二、结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。【组装适代享外桥】 ----组装时代想外桥
三、行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。
【观模命中策职备解访迭状】 ----- 观模命中撤职被解放迭撞

单例模式

解决的问题: 不一致状态
使用场景: 线程池、缓存、日志对象、网站的计数器,数据库连接池
我用到的地方: zookeeper的连接管理类

单例模式有以下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。

  单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象,网站的计数器常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。【单例类就是为了方便对资源进行统一管理,即只能有一个领导发号司令,统一指挥,进行资源的统一调度,不能多个领导都来发指令,那就乱套了,不知道什么时候该听哪个领导的才是对的】【日志对象:比如A,B属于通一个类的不同实例,早上new A,A把早上的日志存在了A里面,中午你有new B,B把中午的日志存在了B里面,C是晚上的,一般日志都是一整天的吗,早上,中午,晚上的日志都应该放在一个文件里面才对,这是日志对象就设计成单例合适】【数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。能达到一次连接,多次复用的高效率】

适用场景:

单例模式只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等。如:
1.需要频繁实例化然后销毁的对象。
2.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
3.有状态的工具类对象。
4.频繁访问数据库或文件的对象。
以下都是单例模式的经典使用场景:
1.资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
2.控制资源的情况下,方便资源之间的互相通信。如线程池等。

优缺点:

优点:
避免对共享资源的多重占用
节省内存,加快对象访问速度
缺点:
1.不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。
2.由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
3.单例类的职责过重,在一定程度上违背了“单一职责原则”。
4.滥用单例将带来一些负面问题,如为了节省资源将【数据库连接池对象设计为的单例类】【一件事物既有好的,也有坏的】,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

Spring 为啥默认把bean设计成单例的?

单例bean的优势

  1. 由于不会每次都新创建新对象所以有一下几个性能上的优势: 1.减少了新生成实例的消耗 新生成实例消耗包括两方面,第一,spring会通过反射或者cglib来生成bean实例这都是耗性能的操作,其次给对象分配内存也会涉及复杂算法
  1. 减少jvm垃圾回收 由于不会给每个请求都新生成bean实例,所以自然回收的对象少了
  1. 可以快速获取到bean 因为单例的获取bean操作除了第一次生成之外其余的都是从缓存里获取的所以很快

单例bean的劣势
单例的bean一个很大的劣势就是他不能做到线程安全!!!,由于所有请求都共享一个bean实例,所以这个bean要是有状态的一个bean的话可能在并发场景下出现问题,而原型的bean则不会有这样问题(但也有例外,比如他被单例bean依赖),因为给每个请求都新创建实例。【各自线程维护各自的实例】

总结
1.建少创建实例和垃圾回收,缓存快速获取,实例有状态的话在并发环境下线程不安全

代理模式

解决的问题:职责分工,程序扩展性,为对象的间接访问提供了一个解决方案,可以对对象的访问进行控制

使用场景:使用代理类给项目加入缓存、日志这些功能,对某些过程进行 拦截…(像常用的aop就是代理模式的实现。)

我用到的地方:简易rpc实现:客户端使用Proxy类创建远程服务的本地代理,本地代理实现和远程服务一样的接口,并且屏蔽了网络通信的细节,使得用户在使用本地代理的时候,感觉和使用本地服务一样。【客户端传递参数,服务端为委托类生成代理对象,序列化后(RpcEecoder)通过netty传给客户端,客户端的netty的channelRead0收到response,会调用解码器RpcDecoder,反序列化生成本地代理对象】—它也是远程代理

代理模式
Dubbo consumer使用Proxy类创建远程服务的本地代理,本地代理实现和远程服务一样的接口,并且屏蔽了网络通信的细节,使得用户在使用本地代理的时候,感觉和使用本地服务一样。

假设我要去买房:【我是委托人:我的业务是买房,我的需求是(买个性价比高的,具有很大升职空间的,价格在80万到100万之间的房子)(可我对买房这一块一无所知—光有参数,方法返回类型,没有实现)即我有个方法买房float buyHome(rating,duringPrice)】,那我就找中介帮我实现该方法,然后把结果告诉我(天津西青某胡同34号),那我调用完buyHome方法后就直接到指定地点付款买房就可以了

职责清晰:具体角色是实现具体的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,代码清晰。
高扩展性:想给委托类增加功能,只需要修改代理类就可以了。符合开闭原则。
缺点:动态生成字节码需要时间,所以再处理某些请求时速度上可能收到影响

java中代理类就是Proxy负责生成代理对象,使用JDK动态代理有一个限制,就是被代理的对象必须实现一个或多个接口,若想代理没有实现接口的类,就需要使用Cglib实现.
优缺点,使用场景

为对象的间接访问提供了一个解决方案,可以对对象的访问进行控制。代理模式类型较多,其中远程代理、虚拟代理、保护代理等在软件开发中应用非常广泛。

java的实现有静态代理,动态代理,cglib,javassit

代理模式主要使用了java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根(指同一接口)就成,大家知根知底,你能做啥,我能做啥都清楚得很,同样一个接口。

一个典型的动态代理创建对象过程可分为以下四个步骤:
1、通过实现InvocationHandler接口创建自己的调用处理器 IvocationHandler handler = new InvocationHandlerImpl(...);
2、通过为Proxy类指定ClassLoader对象和一组interface创建动态代理类
Class clazz = Proxy.getProxyClass(classLoader,new Class[]{...});
3、通过反射机制获取动态代理类的构造函数,其参数类型是调用处理器接口类型
Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.class});
4、通过构造函数创建代理类实例,此时需将调用处理器对象作为参数被传入
Interface Proxy = (Interface)constructor.newInstance(new Object[] (handler));
为了简化对象创建过程,Proxy类中的newInstance方法封装了2~4,只需两步即可完成代理对象的创建。
生成的ProxySubject继承Proxy类实现Subject接口,实现的Subject的方法实际调用处理器的invoke方法,而invoke方法利用反射调用的是被代理对象的的方法(Object result=method.invoke(proxied,args)

责任链模式

责任链模式在Dubbo中发挥的作用举足轻重,就像是Dubbo框架的骨架。Dubbo的调用链组织是用责任链模式串连起来的。责任链中的每个节点实现Filter接口,然后由ProtocolFilterWrapper,将所有Filter串连起来。Dubbo的许多功能都是通过Filter扩展实现的,比如监控、日志、缓存、安全、telnet以及RPC本身都是。如果把Dubbo比作一列火车,责任链就像是火车的各车厢,每个车厢的功能不同。如果需要加入新的功能,增加车厢就可以了,非常容易扩展。
netty也有用到
springmvc中的责任链模式

观察者模式

Dubbo中使用观察者模式最典型的例子是RegistryService。消费者在初始化的时候回调用subscribe方法,注册一个观察者,如果观察者引用的服务地址列表发生改变,就会通过NotifyListener通知消费者。此外,Dubbo的InvokerListener、ExporterListener 也实现了观察者模式,只要实现该接口,并注册,就可以接收到consumer端调用refer和provider端调用export的通知。Dubbo的注册/订阅模型和观察者模式就是天生一对。
spring中的观察者模式

看过哪些开源框架的源码,讲讲

spring,springmvc,dubbo----讲讲待续:233

索引,sql语句,事务,存储引擎

慢查询,优化sql,union,left join,join,right join
一条sql语句的执行原理

索引失效:主键id,索引name名字,sex性别为空,问你进行了多少次io。

网络

跨域整么解决,发几次请求,第一次code是多少
如何网络抓包,如何判断是否建立起了tcp连接
restful实现crud,
tcp三次四次,网络拥塞算法

synchronized,volitile,cas,AQS,ReentankLock等原理

java中的各种锁
线程池

分支算法,动态规划的思想

面试

与(&)、非(~)、或(|)、异或(^)
有三面,二面就还是问技术,主要是考算法,
没有三面,二面是最终面:就问你看过哪些开源框架的源码(重点),,开发中遇到哪些问题,整么解决的(重点),近阶段学习目标整样,度过哪些书。
二面设计模式应该必考:你项目中有用到过哪些设计模式吗?
以及一些系统架构及设计方面的,解决问题的能力

sso的实现
短期学习计划,工作目标,看过哪些书(深入浅出设计模式,深入理解jvm),你在技术的哪方面最擅长,

  • 实战项目中需要用到的东西
    sso如何实现一次只能在一个地方登录(用session去记录用户标识,然后设为过期)
    讲讲你分布式系统的架构

dubbo rpc是用什么协议实现的,(你自己做的时候用的什么协议)

网络7层模型都有哪些协议,请求到web层?
事务ACID

新生代和老年代的区别
各排序的时间复杂度,都有哪些。
url整么请求到后台,80端口就能找到其他服务(如订单,库存)
select * 表 id in(1,2,3)的 执行原理
项目中遇到的问题(支付那一块),实习中遇到的问题。
为什么要服务拆分,有哪些好处。

关于es的知识:先放掉—es和mysql如何保证数据一致性
如何解决高并发如618抢购,

为何不说说你实际在公司做的东西呢

既然是rpc框架,你有考虑过监控、日志、缓存、安全、telnet以及RPC本身吗,如何解决限流。

分布式系统设计与开发,负载均衡技术,系统容灾设计,高可用系统

数组和链表区别及应用场景

数组占用内存少(链表除了存数据,还要存后继节点)
插入:O(1)链表:头插法,数组添加到尾部
查找:按下标查找数组O(1),链表O(n),按值数组,链表O(n)
大数量要用堆排

引用文章

作者堪称人生的导师
java技术栈知识点详解
详解代理模式

cvte

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值