問題記錄
1.http和https的區(qū)別:超文本傳輸協(xié)議
(1)http不安全,在傳輸過程中博助,是明文傳輸
(2)無法驗(yàn)證通信方的身份夜惭,沒有用戶驗(yàn)證
(3)在http傳輸過程中劳跃,接收方和發(fā)送方都 不會驗(yàn)證報(bào)文的完整性
2.java8--支持函數(shù)式編程癌蚁、日期Api唱遭、StreamApi戳寸、新的javaScript引擎
(1)Lambda 表達(dá)式
3.TreeMap可以自動排序
4.SpringBoot:簡化配置 數(shù)據(jù)庫 注解 日志 tomcat等都是配置好的 可以直接使用
5.get/post:
1.get有長度限制,post無長度限制
2.都是http請求 都不是安全的 參數(shù)都存在于requestBody中 相對比來說 post比get安全(get參數(shù)直接在url后面)
6.面向?qū)ο筇卣?繼承 封裝 多態(tài) 抽象
7.Spring:
AOP:面向切面(把所有散落的事務(wù)集中到一個(gè)切面事務(wù)中)
IOC:依賴注入/控制反轉(zhuǎn)
把需要的對象提前創(chuàng)建好拷泽,放到spring容器疫鹊,還可以設(shè)置單例模式;
? ? 注入方式最常見的:注解(@Controller @Service)
事務(wù):可能會更新數(shù)據(jù)庫數(shù)據(jù)項(xiàng)的一段程序
8.Spring SpringMVC SpringBoot MyBatis
注解:
Spring:@Controller @Service @Autowired @Configuration @Value
SpringMVC:@RequestMapping(訪問url) @ResponseBody @RequestBody @RestController(@Controller和@ResponseBody)
SpringBoot:@SpringBootApplication @RestController @ResponseBody @RequestMapping @Configuration
9.MyBatis框架優(yōu)點(diǎn):減少JDBC大量冗余代碼司致、很好的與各種數(shù)據(jù)庫兼容拆吆、提供第三方插件分頁插件、sql在xml里面 減少代碼與sql耦合
10.設(shè)計(jì)模式:
Facade模式(外觀模式):要求一個(gè)子系統(tǒng)的外部與內(nèi)部訪問時(shí) 必須通過Facade對象脂矫,F(xiàn)acade模式提供接口枣耀,方便其余子系統(tǒng)調(diào)用
工廠模式、模板模式庭再,單例模式捞奕、觀察者模式、
11.Redis(非關(guān)系型數(shù)據(jù)庫拄轻,主要用于緩存)颅围,關(guān)系型數(shù)據(jù)庫(數(shù)據(jù)存于硬盤中)
redis支持list hash set String等數(shù)據(jù)類型 所以redis可以用來作為注冊中心、數(shù)據(jù)庫恨搓、緩存院促、消息中間件
memcache 不支持?jǐn)?shù)據(jù)持久化,重啟之后斧抱,數(shù)據(jù)丟失常拓。 且只支持String類型
redis安全機(jī)制:redis.conf 加密碼驗(yàn)證? ? 禁止外網(wǎng)訪問redis:bind 127.0.0.1 使得redis服務(wù)只在當(dāng)前服務(wù)器使用
? ? redis設(shè)置過期時(shí)間:jedisClient.set(key, value, "NX", "EX", expireSecond);
高性能(速度快) 高并發(fā)(用戶訪問數(shù)據(jù)訪問一次? 然后放入緩存)
redis為什么速度快 (1.數(shù)據(jù)存儲在內(nèi)存中 ,用戶訪問請求通過內(nèi)存 2.數(shù)據(jù)簡單 3.單線程夺姑,避免多線程出現(xiàn)阻塞而導(dǎo)致性能消耗)
redis讀寫性能很高 很適合讀寫操作多的
redis支持持久化 把內(nèi)存中的數(shù)據(jù)寫到硬盤 防止因?yàn)殄礄C(jī)數(shù)據(jù)丟失
redis讀的速度110000/s 寫速度80000/s
redis集群 哨兵模式 創(chuàng)建多個(gè)redis實(shí)例
主從復(fù)制 主只要用于寫? 分節(jié)點(diǎn)主要用于讀(速度快)
秒殺系統(tǒng)業(yè)務(wù)層 集群? 多臺機(jī)器一起處理? 提高并發(fā)
redis持久化:RDB和AOF(修改配置文件 appendonly改為yes墩邀,redis會記錄每次操作)
12.進(jìn)程 線程
繼承Thread類、實(shí)現(xiàn)Runnable接口盏浙、實(shí)
現(xiàn)callAble(可以獲得異步任務(wù)返回的值)
join方法:可以設(shè)置a線程在b線程執(zhí)行完后再執(zhí)行
13.JVM
java虛擬機(jī)是一個(gè)可以執(zhí)行java字節(jié)碼文件的虛擬機(jī)進(jìn)程眉睹。java源文件被編譯成能被java虛擬機(jī)執(zhí)行的字節(jié)碼文件
堆區(qū):存放對象
棧區(qū):存放引用,變量
方法區(qū):類信息 常量變量
14.StringBuffer(線程安全) StringBuilder(線程不安全)
15.相對于HashMap來說 ConcurrentHashMap線程安全
16.多線程:單個(gè)程序創(chuàng)建多個(gè)并行執(zhí)行的線程來完成各自的任務(wù)
劣勢:線程也是程序废膘,線程越多 占用內(nèi)存也越大
一個(gè)進(jìn)程可以有多個(gè)線程(比如window中的.exe執(zhí)行文件)
創(chuàng)建線程:
繼承Thread類? extends Thread類 重寫run方法
實(shí)現(xiàn)Runnable接口 implement Runnable接口 重寫run方法
實(shí)現(xiàn)Callable接口
使用Executors工具類創(chuàng)建線程
調(diào)用start方法是啟動線程 使線程處于就緒狀態(tài) run方法只是Thread的一個(gè)普通執(zhí)行方法? 所以 線程啟動 是用start
wait(線程等待) sleep(線程睡眠) notify(喚醒線程)
線程數(shù)過多 消耗過多cpu? 占用過多內(nèi)存
synchronized控制線程同步 控制同一段代碼段不被多個(gè)線程同時(shí)使用? 可以修飾 類方法變量
synchronized修飾實(shí)例方法(給對象實(shí)例加鎖) 修飾代碼塊
ConcurrentHashMap-并發(fā)容器 使用分布鎖來保證多線程的性能
線程池--事先創(chuàng)建若干個(gè)線程放入池中 需要的話從池中取 不需要放回池中? 這樣就大量減少創(chuàng)建和銷毀對象的開銷
線程池優(yōu)點(diǎn):降低資源消耗 提高響應(yīng)速度 提高線程管理 提供定時(shí)執(zhí)行 定期執(zhí)行 單線程 并發(fā)數(shù)控制等功能
利用Executors 框架可以非常方便的創(chuàng)建一個(gè)線程池
Future表示異步計(jì)算的結(jié)果 可以提供get方法獲取結(jié)果
線程池中 executor和submit(可以返回future對象)
ThreadPoolExecutor 創(chuàng)建線程池 三個(gè)重要參數(shù):corePoolSize(核心線程數(shù))maximumPoolSize (允許存在的工作中的線程數(shù)) workQueue(新任務(wù)達(dá)到核心線程數(shù) 要放入隊(duì)列)
一個(gè)簡單的線程池Demo
FutureTask詳解
17.SpringMvc Post亂碼--在web.xml配置characterEncodingFilter過濾器
get亂碼---修改tomcat配置文件 new String(str.getBytes('ISO-8859-1'),'utf-8')
18.swagger? 可以直接生成一個(gè)接口文檔網(wǎng)站? 方便調(diào)試? 可視化api
19.刪除百萬數(shù)據(jù)的時(shí)候? 先刪除索引 再刪除無用數(shù)據(jù)? 再加上索引
20.集群:是指在多態(tài)服務(wù)器上部署同樣的業(yè)務(wù)代碼竹海,構(gòu)建一個(gè)集群,提高負(fù)載均衡設(shè)備對外提高服務(wù)
21.dubbo: 提供方 消費(fèi)方
22.zookeeper部署方式:單機(jī)部署? 集群部署
23.MQ 主要用于服務(wù)間異步通信
優(yōu)點(diǎn):支持高并發(fā) 高吞吐 性能高 異步處理消息(系統(tǒng)數(shù)據(jù)修改不需要直接同步調(diào)用接口的? 就可以發(fā)消息異步處理)丐黄,解耦斋配,削峰(減少高峰時(shí)期服務(wù)器壓力)
缺點(diǎn):系統(tǒng)可用性變低(消息隊(duì)列掛了,系統(tǒng)就掛了),系統(tǒng)復(fù)雜度變高(無法判斷 消息處理一致性問題艰争、消息是否重復(fù)消費(fèi) )
kafka 轉(zhuǎn)為超高吞吐量的實(shí)時(shí)日志采集 實(shí)時(shí)數(shù)據(jù)同步
kafka 吞吐量17萬 支持順序模式 穩(wěn)定性差
rabbitMq 吞吐量3萬 不支持順序模式 穩(wěn)定性好
MQ保證順序執(zhí)行的方法:1.生產(chǎn)方-MQServer-消費(fèi)方? 一對一對一? ? 缺點(diǎn):并行度就會成為消息系統(tǒng)的瓶頸(吞吐量不夠)
關(guān)鍵字 交換機(jī)(Exchange) 隊(duì)列(queue) 綁定(binding) 路由關(guān)鍵字(Routing Key) 消息通道(Channel) consumer producer
24.接口和抽象類的區(qū)別:
? ? ? ? ? ? 接口? ? ? ? ? 抽象
可以實(shí)現(xiàn)多接口? ? ? 只能單繼承
沒有構(gòu)造函數(shù)? ? ? ? 可以有構(gòu)造函數(shù)(用于實(shí)現(xiàn)初始化)
只能做方法聲明? ? ? 可以做方法聲明 也可以做方法實(shí)現(xiàn)
? ? ? ? 都不能被實(shí)例化
25.String:trim() equal() split() substring() length indexOf
26.常用的集合類? list(add get remove ) Map(put clear get) HashMap ArrayList TreeMap
ConcurrentHashMap websocket? nginx
# cd /d
# tar zxvf? 解壓文件
# vi profile? 編輯文件? esc退出編輯模式 shift+: wq保存并退出
# tomcat 啟動服務(wù)
# cd bin
# ./startup.sh
# cd logs 進(jìn)入到tomcat服務(wù)下的log日志目錄
# cat catalina.out? 顯示tomcat服務(wù)該文件的內(nèi)容
# lsof -i:端口號? 查看當(dāng)前是哪個(gè)進(jìn)程占用了該端口號
進(jìn)入tomcatbin目錄 # ./shutdown.sh 關(guān)閉tomcat服務(wù)
安裝rz-使用rz上傳文件到虛擬機(jī)? yum install -y lrzsz
# unzip dist.rar? 解壓縮
# zip -r
# rm -f dir? 刪除dir目錄并且刪除該目錄下的文件
yum install? 下載部分命令
1.dobbo能不能用socket實(shí)現(xiàn)坏瞄;
由于Dubbo底層采用Socket進(jìn)行通信
tomcat的線程池
redis分布式鎖原理
jvm線程是虛擬還是真實(shí)的
hashmap的put方法原理。
rabbitMq工作模式甩卓。
內(nèi)存溢出鸠匀,內(nèi)存泄漏。
繼承和聚合的區(qū)別逾柿。
自定義注解缀棍。
mysql,優(yōu)化机错。
反射原理
1112
Java對象序列化和反序列化
Mybatis爬范,where,trim標(biāo)簽
where 元素只會在至少有一個(gè)子元素的條件返回 SQL 子句的情況下才去插入“WHERE”子句。而且弱匪,若語句的開頭為“AND”或“OR”青瀑,where 元素也會將它們?nèi)コ?/p>
去除if條件的第一個(gè)and或者or
格式化
trim標(biāo)記是一個(gè)格式化的標(biāo)記,可以完成set或者是where標(biāo)記的功能
常用的io流
線程的創(chuàng)建痢法,狀態(tài)狱窘。線程池屬性杜顺。
實(shí)現(xiàn)Runnable接口和繼承Thread可以得到一個(gè)線程類财搁,new一個(gè)實(shí)例出來,線程就進(jìn)入了初始狀態(tài)
線程從創(chuàng)建躬络、運(yùn)行到結(jié)束總是處于下面五個(gè)狀態(tài)之一:新建狀態(tài)尖奔、就緒狀態(tài)、運(yùn)行狀態(tài)穷当、阻塞狀態(tài)及死亡狀態(tài)
Mysql默認(rèn)的事務(wù)隔離級別
mysql數(shù)據(jù)庫事務(wù)的隔離級別有4個(gè)提茁,而默認(rèn)的事務(wù)處理級別就是【REPEATABLE-READ】,也就是可重復(fù)讀馁菜。
低級別的隔離級一般支持更高的并發(fā)處理茴扁,并擁有更低的系統(tǒng)開銷。
mysql的4種事務(wù)隔離級別汪疮,如下所示:
1峭火、未提交讀(Read Uncommitted):允許臟讀,也就是可能讀取到其他會話中未提交事務(wù)修改的數(shù)據(jù)
2智嚷、提交讀(Read Committed):只能讀取到已經(jīng)提交的數(shù)據(jù)卖丸。Oracle等多數(shù)數(shù)據(jù)庫默認(rèn)都是該級別 (不重復(fù)讀)
3、可重復(fù)讀(Repeated Read):可重復(fù)讀盏道。在同一個(gè)事務(wù)內(nèi)的查詢都是事務(wù)開始時(shí)刻一致的稍浆,InnoDB默認(rèn)級別。在SQL標(biāo)準(zhǔn)中,該隔離級別消除了不可重復(fù)讀衅枫,但是還存在幻象讀嫁艇,但是innoDB解決了幻讀
4、串行讀(Serializable):完全串行化的讀弦撩,每次讀都需要獲得表級共享鎖裳仆,讀寫相互都會阻塞。
Maven packet install區(qū)別
package是把jar打到本項(xiàng)目的target下孤钦,而install時(shí)把target下的jar安裝到本地倉庫歧斟,供其他項(xiàng)目使用.
Mq重發(fā)機(jī)制
Spring事務(wù)
主要還是依靠數(shù)據(jù)庫的實(shí)務(wù),底層是aop實(shí)現(xiàn)偏形。具體是在業(yè)務(wù)層添加@Transational注解静袖,這樣spring容器啟動時(shí)會去找具體的配置,datasource俊扭,然后開啟實(shí)務(wù)队橙,提交回滾等。spring事務(wù)有6種傳播機(jī)制萨惑,默認(rèn)是required捐康,沒有事務(wù)開啟一個(gè),有就進(jìn)入當(dāng)前事務(wù)庸蔼。
設(shè)計(jì)模式
Facade模式(外觀模式):要求一個(gè)子系統(tǒng)的外部與內(nèi)部訪問時(shí) 必須通過Facade對象解总,F(xiàn)acade模式提供接口,方便其余子系統(tǒng)調(diào)用
工廠模式姐仅、模板模式花枫,單例模式、觀察者模式掏膏、代理模式
Arraylist linkedlist區(qū)別
1劳翰、數(shù)據(jù)結(jié)構(gòu)不同
ArrayList是Array(動態(tài)數(shù)組)的數(shù)據(jù)結(jié)構(gòu),LinkedList是Link(鏈表)的數(shù)據(jù)結(jié)構(gòu)馒疹。
2佳簸、效率不同
當(dāng)隨機(jī)訪問List(get和set操作)時(shí),ArrayList比LinkedList的效率更高颖变,因?yàn)長inkedList是線性的數(shù)據(jù)存儲方式生均,所以需要移動指針從前往后依次查找。
當(dāng)對數(shù)據(jù)進(jìn)行增加和刪除的操作(add和remove操作)時(shí)悼做,LinkedList比ArrayList的效率更高疯特,因?yàn)锳rrayList是數(shù)組,所以在其中進(jìn)行增刪操作時(shí)肛走,會對操作點(diǎn)之后所有數(shù)據(jù)的下標(biāo)索引造成影響,需要進(jìn)行數(shù)據(jù)的移動。
3邻吞、自由性不同
ArrayList自由性較低组题,因?yàn)樗枰謩拥脑O(shè)置固定大小的容量,但是它的使用比較方便抱冷,只需要創(chuàng)建崔列,然后添加數(shù)據(jù),通過調(diào)用下標(biāo)進(jìn)行使用旺遮;而LinkedList自由性較高赵讯,能夠動態(tài)的隨數(shù)據(jù)量的變化而變化,但是它不便于使用耿眉。
4边翼、主要控件開銷不同
ArrayList主要控件開銷在于需要在lList列表預(yù)留一定空間;而LinkList主要控件開銷在于需要存儲結(jié)點(diǎn)信息以及結(jié)點(diǎn)指針信息鸣剪。
過濾器和攔截器區(qū)別===================過濾器是取你所想组底,攔截器是拒你所不想
攔截器是AOP( Aspect-Oriented Programming)的一種實(shí)現(xiàn),底層通過動態(tài)代理模式完成筐骇。
區(qū)別:
(1)攔截器是基于java的反射機(jī)制的债鸡,而過濾器是基于函數(shù)回調(diào)。
(2)攔截器不依賴于servlet容器铛纬,而過濾器依賴于servlet容器厌均。
(3)攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用饺鹃。
(4)攔截器可以訪問action上下文莫秆、值棧里的對象,而過濾器不能悔详。
(5)在action的生命周期中,攔截器可以多次被調(diào)用惹挟,而過濾器只能在容器初始化時(shí)被調(diào)用一次茄螃。
執(zhí)行順序
過濾器 -> 攔截器 -> aop -> 業(yè)務(wù)邏輯 -> 攔截器的post方法 -> filter的destroy
攔截器與過濾器使用場景:
springWeb MVC的處理器攔截器類似于Servlet開發(fā)中的過濾器Filter,用于對處理器進(jìn)行預(yù)處理和后處理连锯。
1归苍、日志記錄:記錄請求信息的日志,以便進(jìn)行信息監(jiān)控运怖、信息統(tǒng)計(jì)拼弃、計(jì)算PV(Page View)等。
2摇展、權(quán)限檢查:如登錄檢測吻氧,進(jìn)入處理器檢測檢測是否登錄,如果沒有直接返回到登錄頁面;
3盯孙、性能監(jiān)控:有時(shí)候系統(tǒng)在某段時(shí)間莫名其妙的慢鲁森,可以通過攔截器在進(jìn)入處理器之前記錄開始時(shí)間,在處理完后記錄結(jié)束時(shí)間振惰,從而得到該請求的處理時(shí)間(如果有反向代理歌溉,如apache可以自動記錄);
4骑晶、通用行為:讀取cookie得到用戶信息并將用戶對象放入請求痛垛,從而方便后續(xù)流程使用,還有如提取Locale桶蛔、Theme信息等榜晦,只要是多個(gè)處理器都需要的即可使用攔截器實(shí)現(xiàn)。
5羽圃、OpenSessionInView:如hibernate乾胶,在進(jìn)入處理器打開Session刁憋,在完成后關(guān)閉Session飒筑。
非關(guān)系型數(shù)據(jù)和關(guān)系型數(shù)據(jù)庫區(qū)別
Redis(非關(guān)系型數(shù)據(jù)庫,主要用于緩存)第步,關(guān)系型數(shù)據(jù)庫(數(shù)據(jù)存于硬盤中)
關(guān)系型數(shù)據(jù)庫最典型的數(shù)據(jù)結(jié)構(gòu)是表脑融,由二維表及其之間的聯(lián)系所組成的一個(gè)數(shù)據(jù)組織
優(yōu)點(diǎn):
1喻频、易于維護(hù):都是使用表結(jié)構(gòu),格式一致肘迎;
2甥温、使用方便:SQL語言通用,可用于復(fù)雜查詢妓布;
3姻蚓、復(fù)雜操作:支持SQL,可用于一個(gè)表以及多個(gè)表之間非常復(fù)雜的查詢匣沼。
缺點(diǎn):
1狰挡、讀寫性能比較差,尤其是海量數(shù)據(jù)的高效率讀寫释涛;
2加叁、固定的表結(jié)構(gòu),靈活度稍欠唇撬;
3它匕、高并發(fā)讀寫需求,傳統(tǒng)關(guān)系型數(shù)據(jù)庫來說窖认,硬盤I/O是一個(gè)很大的瓶頸豫柬。
非關(guān)系型數(shù)據(jù)庫嚴(yán)格上不是一種數(shù)據(jù)庫告希,應(yīng)該是一種數(shù)據(jù)結(jié)構(gòu)化存儲方法的集合,可以是文檔或者鍵值對等轮傍。
優(yōu)點(diǎn):
1暂雹、格式靈活:存儲數(shù)據(jù)的格式可以是key,value形式、文檔形式创夜、圖片形式等等杭跪,文檔形式、圖片形式等等驰吓,使用靈活涧尿,應(yīng)用場景廣泛,而關(guān)系型數(shù)據(jù)庫則只支持基礎(chǔ)類型檬贰。
2姑廉、速度快:nosql可以使用硬盤或者隨機(jī)存儲器作為載體,而關(guān)系型數(shù)據(jù)庫只能使用硬盤翁涤;
3桥言、高擴(kuò)展性;
4葵礼、成本低:nosql數(shù)據(jù)庫部署簡單号阿,基本都是開源軟件。
缺點(diǎn):
1鸳粉、不提供sql支持扔涧,學(xué)習(xí)和使用成本較高;
2届谈、無事務(wù)處理枯夜;
3、數(shù)據(jù)結(jié)構(gòu)相對復(fù)雜艰山,復(fù)雜查詢方面稍欠湖雹。
Java stream.map 和 stream.forEach 區(qū)別
map 方法接收一個(gè)功能型接口,功能型接口接收一個(gè)參數(shù)程剥,返回一個(gè)值劝枣。map 方法的用途是將舊數(shù)據(jù)轉(zhuǎn)換后變?yōu)樾聰?shù)據(jù),是一種 1:1 的映射织鲸,每個(gè)輸入元素按照規(guī)則轉(zhuǎn)換成另一個(gè)元素。該方法是 Intermediate 操作溪胶。
forEach 接收一個(gè) Consumer 接口搂擦,該接口我們之前講 Function 包時(shí)已經(jīng)提過了。它只接收不參數(shù)哗脖,沒有返回值瀑踢。然后在 Stream 的每一個(gè)元素上執(zhí)行該表達(dá)式
區(qū)別-----------------
生成一個(gè)新的對象的時(shí)候扳还,使用 map 會更好;只是操作 list 內(nèi)部的對象時(shí)橱夭,用 forEach
Maven 中 dependencies 與 dependencyManagement 的區(qū)別? ? ? ? ? ? ? ?
dependencies 即使在子項(xiàng)目中不寫該依賴項(xiàng)氨距,那么子項(xiàng)目仍然會從父項(xiàng)目中繼承該依賴項(xiàng)(全部繼承)
dependencyManagement
里只是聲明依賴,并不實(shí)現(xiàn)引入棘劣,因此子項(xiàng)目需要顯示的聲明需要用的依賴俏让。如果不在子項(xiàng)目中聲明依賴,是不會從父項(xiàng)目中繼承下來的茬暇;只有在子項(xiàng)目中寫了該依賴項(xiàng)首昔,并且沒有指定具體版本,才會從父項(xiàng)目中繼承該項(xiàng)糙俗,并且
version 和 scope 都讀取自父 pom; 另外如果子項(xiàng)目中指定了版本號勒奇,那么會使用子項(xiàng)目中指定的jar版本。
SQL查詢語句中select from where group by having order by的執(zhí)行順序
1.查詢中用到的關(guān)鍵詞主要包含六個(gè)巧骚,并且他們的順序依次為:
select>from>where>group by>having>order by
其中select和from是必須的赊颠,其他關(guān)鍵詞是可選的,這六個(gè)關(guān)鍵詞的執(zhí)行順序與sql語句的書寫順序并不是一樣的劈彪,而是按照下面的順序來執(zhí)行:
from>where>group by>having>select>order by
from:需要從哪個(gè)數(shù)據(jù)表檢索數(shù)據(jù)
where:過濾表中數(shù)據(jù)的條件
group by:如何將上面過濾出的數(shù)據(jù)分組
having:對上面已經(jīng)分組的數(shù)據(jù)進(jìn)行過濾的條件
select:查看結(jié)果集中的哪個(gè)列竣蹦,或列的計(jì)算結(jié)果
order by:按照什么樣的順序來查看返回的數(shù)據(jù)
final和finally的區(qū)別:
final修飾的類不能被繼承;final修飾的變量粉臊,可以保證在使用中不被改變草添;final修飾的變量必須賦初始值,且只能賦值一次扼仲,不可修改远寸;final修飾的方法也不能被重寫。
finally主要是用來關(guān)閉資源(數(shù)據(jù)庫連接屠凶,網(wǎng)絡(luò)連接驰后,磁盤文件等),不管是否發(fā)生異常矗愧,資源都必須進(jìn)行關(guān)閉灶芝。通常寫在try…catch…后面,無論try…catch…塊中出現(xiàn)什么異常唉韭,finally的語句塊都將會執(zhí)行夜涕,除非關(guān)閉JVM,它才不會執(zhí)行属愤。
Hashmap和Hashtable的區(qū)別女器?
底層都是數(shù)組+鏈表實(shí)現(xiàn)
Hashmap:
1.可以存儲null鍵和null值,線程不安全
2.初始size為16住诸,擴(kuò)容:newsize =oldsize*2驾胆,size一定為2的n次冪
Hashtable:
1.無論是key還是value都不能為null涣澡,線程安全,實(shí)現(xiàn)線程安全的方式是在修改數(shù)據(jù)時(shí)鎖住整個(gè)Hashtable丧诺,效率低
2.初始size為11入桂,擴(kuò)容:newsize=oldsize*2+1
java異常中throw和throws的區(qū)別
throws:用來聲明一個(gè)方法可能產(chǎn)生的所有異常,不做任何處理而是將異常往上傳驳阎,誰調(diào)用我我就拋給誰抗愁。
? 用在方法聲明后面,跟的是異常類名
? 可以跟多個(gè)異常類名搞隐,用逗號隔開
? 表示拋出異常驹愚,由該方法的調(diào)用者來處理
? throws表示出現(xiàn)異常的一種可能性,并不一定會發(fā)生這些異常
throw:則是用來拋出一個(gè)具體的異常類型劣纲。
? 用在方法體內(nèi)逢捺,跟的是異常對象名
? 只能拋出一個(gè)異常對象名
? 表示拋出異常,由方法體內(nèi)的語句處理
? throw則是拋出了異常癞季,執(zhí)行throw則一定拋出了某種異常
多線程sleep()和wait()的區(qū)別
sleep()
? 1劫瞳、屬于Thread類,表示讓一個(gè)線程進(jìn)入睡眠狀態(tài)绷柒,等待一定的時(shí)間之后志于,自動醒來進(jìn)入到可運(yùn)行狀態(tài),不會馬上進(jìn)入運(yùn)行狀態(tài)
2废睦、sleep方法沒有釋放鎖
? 3伺绽、sleep必須捕獲異常
? 4、sleep可以在 任何地方使用
? 1嗜湃、屬于Object奈应,一旦一個(gè)對象調(diào)用了wait方法,必須要采用notify()和notifyAll()方法喚醒該進(jìn)程
2购披、wait方法釋放了鎖
? 3杖挣、wait不需要捕獲異常
? 4、wait刚陡,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用
sleep(1000)和wait(1000)的區(qū)別:
Thread.Sleep(1000)
意思是在未來的1000毫秒內(nèi)本線程不參與CPU競爭惩妇,1000毫秒過去之后,這時(shí)候也許另外一個(gè)線程正在使用CPU筐乳,那么這時(shí)候操作系統(tǒng)是不會重新分配CPU的歌殃,直到那個(gè)線程掛起或結(jié)束,即使這個(gè)時(shí)候恰巧輪到操作系統(tǒng)進(jìn)行CPU分配蝙云,那么當(dāng)前線程也不一定就是總優(yōu)先級最高的那個(gè)挺份,CPU還是可能被其他線程搶占去。
wait(1000)
表示將鎖釋放1000毫秒贮懈,到時(shí)間后如果鎖沒有被其他線程占用匀泊,則再次得到鎖,然后wait方法結(jié)束朵你,執(zhí)行后面的代碼各聘,如果鎖被其他線程占用,則等待其他線程釋放鎖抡医。注意躲因,設(shè)置了超時(shí)時(shí)間的wait方法一旦過了超時(shí)時(shí)間,并不需要其他線程執(zhí)行notify也能自動解除阻塞忌傻,但是如果沒設(shè)置超時(shí)時(shí)間的wait方法必須等待其他線程執(zhí)行notify大脉。
Spring|@Autowired與new的區(qū)別
@Autowired相當(dāng)于setter,在注入之前水孩,對象已經(jīng)實(shí)例化镰矿,是在這個(gè)接口注解的時(shí)候?qū)嵗模?/p>
而new只是實(shí)例化一個(gè)對象,而且new的對象不能調(diào)用注入的其他類
@Autowired是從IOC容器中獲取已經(jīng)初始化的對象俘种,此對象中@Autowired的屬性也已經(jīng)通過容器完成了注入秤标,整個(gè)生命周期都交由容器管控。然而通過new出來的對象宙刘,生命周期不受容器管控苍姜,自然也無法完成屬性的自動注入。
IOC:依賴注入或者叫做控制反轉(zhuǎn)悬包。
正常情況下我們使用一個(gè)對象時(shí)都是需要new Object()的衙猪。而ioc是把需要使用的對象提前創(chuàng)建好,放到spring的容器里面布近。
所有需要使用的類都會在spring容器中登記垫释,告訴spring你是個(gè)什么東西,你需要什么東西吊输,然后spring會在系統(tǒng)運(yùn)行到適當(dāng)?shù)臅r(shí)候饶号,把你要的東西主動給你,同時(shí)也把你交給其他需要你的東西季蚂。所有的類的創(chuàng)建茫船、銷毀都由
spring來控制,也就是說控制對象生存周期的不再是引用它的對象扭屁,而是spring算谈。DI(依賴注入)其實(shí)就是IOC的另外一種說法,其實(shí)它們是同一個(gè)概念的不同角度描述料滥。
場景:
正常情況下我們使用一個(gè)對象時(shí)都是需要new Object() 的然眼。而ioc是把需要使用的對象提前創(chuàng)建好,放到spring的容器里面葵腹。需要使用的時(shí)候直接使用就行高每,而且可以設(shè)置單例或多例屿岂,非常靈活。
我們在service層想調(diào)用另外一個(gè)service的方法鲸匿,不需要去new了爷怀,直接把它交給spring管理,然后用注解的方式引入就能使用带欢。
IOC三種注入方式
(1)XML:Bean實(shí)現(xiàn)類來自第三方類庫运授,例如DataSource等。需要命名空間等配置乔煞,例如:context吁朦,aop,mvc渡贾。
(2)注解:在開發(fā)的類使用@Controller逗宜,@Service等注解
(3)Java配置類:通過代碼控制對象創(chuàng)建邏輯的場景。例如:自定義修改依賴類庫剥啤。
UNION與UNION ALL的區(qū)別锦溪?
如果使用UNION ALL,不會合并重復(fù)的記錄行
效率 UNION 高于 UNION ALL