【Java】html
1. 容器前端
1)隊列(queue): 若Blocking:阻塞put/take offer/peek poll 異常element/removejava
a. PriorityQueue:comparator 堆排序react
b. Deque:雙向隊列 linkedList addFirst()web
c. DelayQueue:相似timeTask,延遲期滿才能提取元素算法
d. ConcurrentLinkedQueue:線程安全spring
2)數組(Array):注意左右邊界校驗,如arr!=null&&arr.length>1;數據庫
3)List:有序可重複,可接受null,索引方便,.subList()視圖。express
a. LinkedList, ArrayList編程
b. CopyOnWriteArrayList:讀寫分離,寫時複製加鎖。開闢新空間,內存消耗多
4)Set:去重,必須實現equals方法。
a.hashSet,LinkedHashSet:快速查找,後者則是爲了保證次序
b.SortedSet:如treeSet,底層實現的紅黑樹,保證有序
c. Collections.newSetFromMap:實現線程安全
5)Map:hashCode 數組 + equals linkedList put get
a. HashMap,LinkedHashMap:後者是爲了保證次序
b.sortedMap:如treeMap,key保持排序狀態
c. ConcurrentHashMap:鎖分段技術,讀寫分析,寫的時候,Segment加鎖保護其名下的HashEntry,讀的時候不加鎖。
6)遍歷:Iterator:指向第一個元素前一個,故要next。Foreach,實現Iterator便可用,單不可增刪,會引發modCount變化,拋異常。
Comparablet內比較器 comparator 外比較器 策略模式
2. 併發
1)線程實現方法:Thread runnable接口 callable接口
2)線程池:減小損耗(一開始就建立好),好管理
類別:newSiggleThreadPool(),newFixedThreadPool(workQueue長度不可控),newCachedThreadPool(線程數不可控),newScheduledThreadPool(),
內部:ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue(直接/有界/無界),ThreadFactory(worker線程),handler(DiscardPolicy/CallerRunPolicy))
方法:execute/submit Future.get FutureTask shutdown/shutdownNow
3)常見類:ThreadLocal,內部ThradLocalMap,CountDownLatch, CyclicBarrier, Semaphore
4)Synchronized和Lock的區別
Lock:AQS AbstractQueuedSynchronized jdk類,可衝入,不可中斷,非公平
Synchronized: object final 1. jvm關鍵字 可衝入,可判斷鎖狀態,可公平,大量同步,finally要釋放鎖。在不斷優化,鎖消除,鎖粗化,monitorenter,monitorexist映射在內核上,影響開銷
5)性能調優:
Atomic原子類,免鎖容器,ConcurrentHashMap在java8使用CAS無鎖算法,ReentrantReadWriteLock讀寫鎖, CAS,衝突檢測,數據更新
3. IO
1. 字節流:OutputStream/InputStream,直接IO, 字符流:Writer/Reader,間接IO,需flush 字符字節轉換,須要指定編碼格式
2. 基本概念:while((read=inputStream.read(byteArr))>0) 硬盤-(阻塞)-> 內核 -(同步)-> 用戶
3. FileLock Charset
4. IO和NIO的區別:觀察者模式--> 事件機制 --> reactor設計模式 --> nio --> netty對nio進行了簡單封裝 jetty或tomcat
面向緩衝:ByteBuffer等,稍後處理,可移動,靈活 mark position limit capacity
非阻塞:FileChannel(阻塞)沒法和Selcetor使用;ServerSocketChannel中設置,可配合Selcetor。Reactor模式
選擇器 Selector selector = Selector.open(), register(selector, SelectionKey.OP_ACCPECT)
5. 實現案例:Netty EventLoopGroup ServerBootstrap group channel childHandler
4. 內存管理&JVM
1)GC內存模型:堆(新生代/老年代) 調整-Xms 方法區:永久代 j8用元空間代替; 棧:JVM棧(引用類型) Native棧
2)JVM內存模型:volatile 不能保證原子性,能夠保證可見性,有序性 主內存,工做內存
3)清理:引用計數法,GCRoot:標記-清除 標記-複製 標記-整理
4)性能:JDK工具jconsole Jps Jstack Jmap; 內存泄露:jmeter+jps+MAT CPU衝高:ps -ef | grep jstack pid top-Hp pid
5. 反射
1)反射:getClass .class Class.forName,getFields(); 提升性能,反射+緩存
2)雙親委派模型:BootStrap lib Extension lib\ext Application \lib 自定義
3)類加載器:classLoader findClass defineClass loadClass 代理加強
Apache tomcat OSGI javaAgent探針,main以前攔截 Java字節碼 熱部署等
6. Java8
1)lamada閉包:
匿名函數捕獲一個外部變量(自由變量),那麼它就是一個closure。
閉包是自帶運行環境的函數final,當一個函數在定義它的做用域意外的地方被調用時,他訪問的依然是定義它時的做用域。這種現象稱之爲閉包
2)Stream API:
Java8中的Stream是對集合(Collection)對象功能的加強,它專一於對集合對象進行各類很是便利、高效的聚合操做(aggregate operation),或者大批量數據操做(bulk data operation)
藉助於lamada表達式 java.util.stream,函數式語言+多核時代
.stream().parallelStream().map().readuce(),對stream的使用就是實現一個filter-map-reduce過程,產生一個最終結果
Stream.of("one","two","three","for"),filter(e->e.length()>3).peek(e->System.out.println("Filtered value:"+e)).map(String::toUpperCase).peek(e->System.out.pringtln("Mapped value:"+e)).collect(Collectors.toList());
【設計模式】
1. 代理模式
真實類在代理類裏註冊,代理類根據註冊new一個真實類Object並運轉
2. 觀察者模式
當對象間存在一對多關係時,使用觀察者模式。好比,當一個對象唄修改,則會自動通知它的依賴對象。行爲型模式
client->Subjec(被觀察者state容器註冊,notifyUpdate)->Observer abstract ->o1,o2,o3(update方法)
3. 適配器模式
4. 裝飾器模式
【框架】
1. Spring
IOC:主業務,自動注入而非本身維護 DI和DL(JNDI)
動態工廠Bean/靜態工廠bean Bean的做用域 單例,原型 Bean後處理器(採用動態代理,對bean加強)。
2. Spring的IOC和DI
1)bean的裝配:動態工廠:factory-bean="someFactory" factory-method="getSomeService" 靜態工廠:class="" factory-method="getSomeService"
2)bean的做用域:singleton prototype
3)bean後處理器:對bean建立的先後對bean進行加強
4)bean的生命週期 構造方法-> set值 -> BeanNameAware -> beanFactoryAware -> 執行後護理器前 -> InitializingBean-afterPropertiesSet -> initPost --> 執行後處理器後 -> 執行方法 --> DisposableBean-destroy -> destroy
5)xml方式
property/constructor-arg name value/ref
array/list/set/map/props
autowire
parent
6)註解方式
<context:compont-sacn base-package="com.huawei.ztj.di01">
@Compont
@Scope
@Value @Resource
MyJavaConfig @Configuration @Bean 構造器
AOP:系統業務,織入而非混入
1. Proxy代理 java.lang.reflect.Proxy 使用:ISomeService target = new SomeServiceImpl(); ISomeService proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHander(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throwable {
..; Object result = method.invoke(target, args); ..;
}
});
2. 代理設計模式 : 代理類和目標類實現同一接口,代理類是對目標類的加強(仍包含目標類的邏輯)。好處:控制目標對象的訪問,加強目標對象的功能。區別於:適配器模式(改變),裝飾器模式(加強,方式不同)。
3. AOP
1. 通知Advice 加強的系統功能 MethodBeforeAdvice AfterReturningAdvice MethodInterceptor(aopalliance中的包) ThrowsAdvice CGLIB 無實現InvocationHandler
2. 顧問Advisor 切入點
<bean id="afterAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> NameMatchMethodPointcutAdvisor
<property name="advice" ref="beforeAdvice"/>
<property name="patterns" value=".*Sec.*/.*T.*"> mappedName
</bean>
3.配置
<bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <bean class="org.springframework.aop.framework.autoproxy.advisorAutoProxyCreator"/>
<property name="target" ref="someService"/>
<property name="interfaces" value="com.huawei.ztj.di01.ISomeService"/>
<property name="interceptorNames" value="beforeAdvice"/>
</bean>
4. AspectJ
註解:"execution(" * *..ISomeService.doSome(..)")" 通知+顧問
XML:<aop:config>
<aop:pointcut expression="execution(* *..ISomeService.doSome(..))" id="doSomePointcut"/>
<aop:aspect ref="myAspect">
<aop:before method="myBefore" pointcut-ref="doSomePointcut"/>
</aop:aspect>
</aop:aspect>
</aop:config>
1. spring-aop包源碼解讀
外層: Advice各個接口
support包: Advisor 切入點,如NameMatchMethodPointcutAdvisor、RegexpMethodPointcutAdvisor
framework包: 攔截器
1)autoproxy:DefaultAdvisorAutoProxyCreator、BeanNameAutoProxyCreator
2)ProxyFactoryBean
3)JdkDynamicAopProxy、CglibAopProxyFactory 重點
下一步計劃:core beans context aspectJ aop:config aop:pointcut aop:aspect aop:before pointcut-ref <aop:pointcut expression="execution(* *..ISomeService.doSome(..))" id="doSomePointcut"/>
2. SpringMVC
DispatcherServlet--> 映射處理器 處理適配器ModelAndView 視圖解析(view) 視圖渲染(Model)
一、DispatcherServlet前端控制器接收發過來的請求,交給HandlerMapping處理器映射器
二、HandlerMapping處理器映射器,根據請求路徑找到相應的HandlerAdapter處理器適配器(處理器適配器就是那些攔截器或Controller)
三、HandlerAdapter處理器適配器,處理一些功能請求,返回一個ModelAndView對象(包括模型數據、邏輯視圖名)
四、ViewResolver視圖解析器,先根據ModelAndView中設置的View解析具體視圖
五、而後再將Model模型中的數據渲染到View上
3. MyBatis
4. OSGI
5. SOA架構
1. RMI:https://www.cnblogs.com/ygj0930/p/6542811.html 學習參考:http://www.blogjava.net/zhenyu33154/articles/320245.html
RMI:stub skeleton 接口Remote 註冊:java.rmi.Naming.rebind("rmi://10.74.226.146:11099/demoService", demoService); rmic生成樁和框架 JVM rmiregistry註冊程序運行
調用:IHello hello = (IHello) Naming.lookup("rmi://localhost:1099/hello");
RPC:系統網絡服務,客戶端和服務端句柄。
JNDI:Java Naming and Directory Interface 是一個應用程序設計的API
採用java的序列化 頭疼的防火牆滲透
2. Spring HttpInvoker 它基於HTTP之上提供RPC,同時又使用了Java的對象序列化機制。
學習參考:https://www.cnblogs.com/lpc-xx/p/8556827.html
3. Hessian:Hessian是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能 二進制
web.xml註冊 <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
調用:HessianProxyFactory factory = new HessianProxyFactory(); HessianService hs = (HessianService)factory.create(HessianService.class, url);
私有的序列化機制 解決防火牆問題
4. Burlap:https://www.cnblogs.com/javalouvre/p/3730597.html 集中遠程服務的區別 https://www.cnblogs.com/maybo/p/5190012.html
私有的序列化機制 解決防火牆問題
5. Http服務和RFC服務的區別:https://blog.csdn.net/wangyunpeng0319/article/details/78651998 看下客戶端請求是否有http打頭
6. 使用和發佈web服務: https://blog.csdn.net/gray_li/article/details/78460213
7. 使用Spring MVC建立Rest API:
1) 【Spring集成】-SpringMVC建立REST API https://blog.csdn.net/fxkcsdn/article/details/80932349 n
【MySQL】
1)參考:https://blog.csdn.net/zhugewendu/article/details/73550414
2)
SQL和索引優化
優化數據庫對象
優化InnoDB
磁盤優化
【TCP/IP】
【消息通知】
ActiveMQ:java, java系統配合默契 基於STOMP協議 Simple Text Orientated Message Protocol
RabbitMQ:Erlang 性能更強 基於AMQP(Advanced Message Queue Protocol) 而「語言中立」則意味着只要遵循 AMQP 的協議,任何一種語言均可以開發消息組件乃至中間件自己
基於Erlang,支持多種協議的消息Broker,經過插件支持STOMP協議 admin/Changeme_123 jms
HornetQ:基於JBoss
1. 總體架構
private int getCalledTimes(long minTime) {
int i = 0;
List<Long> removeList = new ArrayList<Long>();
for (int k = callTimes.size() - 1; k > 0; k--)
{
Long time = callTimes.get(k);
if (time > minTime)
{
i++;
}
else
{
removeList.add(time);
}
}
callTimes.removeAll(removeList);
return i;
}
【途徑】
1. 書:Java編程思想,Java併發編程實戰,effective java, Spring實戰,
2. 網絡: MOOC課程,Java技術棧, ImportNew