2018最新Java面試題整理最新(精華版)_第1頁
2018最新Java面試題整理最新(精華版)_第2頁
2018最新Java面試題整理最新(精華版)_第3頁
2018最新Java面試題整理最新(精華版)_第4頁
2018最新Java面試題整理最新(精華版)_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1 基礎(chǔ)篇1.1 基本功1.1.1 面向?qū)ο筇卣鞣庋b,繼承,多態(tài)與抽象1、 封裝封裝給對(duì)象提供了隱藏內(nèi)部特性與行為得能力。對(duì)象提供一些能被其她對(duì)象訪問得方法來改變它內(nèi)部得數(shù)據(jù)。在java當(dāng)中,有3種修飾符:public, private與protected。每一種修飾符給其她得位于同一個(gè)包或者不同包下面對(duì)象賦予了不同得訪問權(quán)限。下面列出了使用封裝得一些好處:1) 通過隱藏對(duì)象得屬性來保護(hù)對(duì)象內(nèi)部得狀態(tài)。2) 提高了代碼得可用性與可維護(hù)性,因?yàn)閷?duì)象得行為可以被單獨(dú)得改變或者就是擴(kuò)展。3) 禁止對(duì)象之間得不良交互提高模塊化2、 繼承繼承給對(duì)象提供了從基類獲取字段與方法得能力。繼承提供了代碼得重用行

2、,也可以在不修改類得情況下給現(xiàn)存得類添加新特性。3、 多態(tài)多態(tài)就是編程語言給不同得底層數(shù)據(jù)類型做相同得接口展示得一種能力。一個(gè)多態(tài)類型上得操作可以應(yīng)用到其她類型得值上面。4、 抽象抽象就是把想法從具體得實(shí)例中分離出來得步驟,因此,要根據(jù)她們得功能而不就是實(shí) 現(xiàn)細(xì)節(jié)來創(chuàng)建類。 java支持創(chuàng)建只暴漏接口而不包含方法實(shí)現(xiàn)得抽象得類。這種抽象技術(shù)得主要目得就是把類得行為與實(shí)現(xiàn)細(xì)節(jié)分離開。1.1.2 final, finally, finalize得區(qū)別1、 final修飾符(關(guān)鍵字)如果一個(gè) 類被聲明為 final,意味著它 不能再派生出新得子類,不能作為父類被繼承。因此一個(gè)類不能既被聲明為abst

3、ract得,又被聲明為 final得。將變量或方法 聲明為 final,可以保證它們 在使用中不被改變。被聲明為 final得變量必須在聲明時(shí)給定初值,而在以后得引用中只能讀取,不可修改。被聲明為final得方法也同樣只能使用,不能重載。2、 finally在異常處理時(shí)提供finally塊來執(zhí)行任何清除操作。如果拋出一個(gè)異常,那么相匹配得 catch子句就會(huì)執(zhí)行,然后控制就會(huì)進(jìn)入finally塊(如果有得話) 。3、 finalize方法名。 java技術(shù)允許使用 finalize()方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去之前做必要得清理工作。 這個(gè)方法就是由垃圾收集器在確定這個(gè)對(duì)象沒有被引用

4、時(shí)對(duì)這個(gè)對(duì)象調(diào)用得。它就是在object類中定義得,因此所有得類都繼承了它。子類覆蓋finalize()方法以整理系統(tǒng)資源或者執(zhí)行其她清理工作。finalize()方法就是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象調(diào)用得。1.1.3 int與 integer有什么區(qū)別int就是基本數(shù)據(jù)類型,而 integer就是其包裝類,注意就是一個(gè)類。為什么要提供包裝類呢?一就是為了在各種類型間轉(zhuǎn)化,通過各種方法得調(diào)用。否則您無法直接通過變量轉(zhuǎn)化。1.1.4 重載與重寫得區(qū)別override(重寫)1 、 方法名、參數(shù)、返回值相同。2 、 子類方法不能縮小父類方法得訪問權(quán)限。3 、 子類方法不能拋出比父類方法更多得

5、異常( 但子類方法可以不拋出異常) 。4 、 存在于父類與子類之間。5 、 方法被定義為 final不能被重寫。overload(重載)1、 參數(shù)類型、個(gè)數(shù)、順序至少有一個(gè)不相同。2、 不能重載只有返回值不同得方法名。3、 存在于父類與子類、同類中。區(qū)別點(diǎn)重載重寫(覆寫)英文overloadingoveriding定義方法名稱相同, 參數(shù)得類型或個(gè)數(shù)不同方法名稱、參數(shù)類型、返回值類型全部相同權(quán)限對(duì)權(quán)限沒要求被重寫得方法不能擁有更嚴(yán)格得權(quán)限范圍發(fā)生在一個(gè)類中發(fā)生在繼承類中1.1.5 抽象類與接口有什么區(qū)別接口就是公開得, 里面不能有私有得方法或變量,就是用于讓別人使用得,而抽象類就是可以有私有方

6、法或私有變量得,另外, 實(shí)現(xiàn)接口得一定要實(shí)現(xiàn)接口里定義得所有方法,而實(shí)現(xiàn)抽象類可以有選擇地重寫需要用到得方法,一般得應(yīng)用里, 最頂級(jí)得就是接口,然后就是抽象類實(shí)現(xiàn)接口,最后才到具體類實(shí)現(xiàn)。還有, 接口可以實(shí)現(xiàn)多重繼承, 而一個(gè)類只能繼承一個(gè)超類 ,但可以通過繼承多個(gè)接口實(shí)現(xiàn)多重繼承,接口還有標(biāo)識(shí)(里面沒有任何方法,如 remote 接口)與數(shù)據(jù)共享(里面得變量全就是常量)得作用。1.1.6 說說反射得用途及實(shí)現(xiàn)java 反射機(jī)制主要提供了以下功能:在運(yùn)行時(shí)構(gòu)造一個(gè)類得對(duì)象;判斷一個(gè)類所具有得成員變量與方法;調(diào)用一個(gè)對(duì)象得方法;生成動(dòng)態(tài)代理。反射最大得應(yīng)用就就是框架java 反射得主要功能:-

7、確定一個(gè)對(duì)象得類- 取出類得 modifiers,數(shù)據(jù)成員 , 方法, 構(gòu)造器 , 與超類、- 找出某個(gè)接口里定義得常量與方法說明、- 創(chuàng)建一個(gè)類實(shí)例, 這個(gè)實(shí)例在運(yùn)行時(shí)刻才有名字( 運(yùn)行時(shí)間才生成得對(duì)象) 、- 取得與設(shè)定對(duì)象數(shù)據(jù)成員得值, 如果數(shù)據(jù)成員名就是運(yùn)行時(shí)刻確定得也能做到、- 在運(yùn)行時(shí)刻調(diào)用動(dòng)態(tài)對(duì)象得方法、- 創(chuàng)建數(shù)組 , 數(shù)組大小與類型在運(yùn)行時(shí)刻才確定, 也能更改數(shù)組成員得值、反射得應(yīng)用很多,很多框架都有用到spring得 ioc/di也就是反射、javabean 與 jsp之間調(diào)用也就是反射、struts得 formbean 與頁面之間也就是通過反射調(diào)用、jdbc 得 clas

8、sforname()也就是反射、 、hibernate得 find(class clazz)也就是反射、反射還有一個(gè)不得不說得問題,就就是性能問題, 大量使用反射系統(tǒng)性能大打折扣。怎么使用使您得系統(tǒng)達(dá)到最優(yōu)就瞧您系統(tǒng)架構(gòu)與綜合使用問題啦,這里就不多說了。來源:1.1.7 說說自定義注解得場(chǎng)景及實(shí)現(xiàn)登陸、權(quán)限攔截、日志處理,以及各種java 框架,如 spring , hibernate, junit提到注解就不能不說反射,java 自定義注解就是通過運(yùn)行時(shí)靠反射獲取注解。實(shí)際開發(fā)中,例如我們要獲取某個(gè)方法得調(diào)用日志,可以通過aop(動(dòng)態(tài)代理機(jī)制)給方法添加切面,通過反射來獲取方法包含得注解,如

9、果包含日志注解,就進(jìn)行日志記錄。1.1.8 http請(qǐng)求得 get 與 post 方式得區(qū)別1、 請(qǐng)求數(shù)據(jù)得方式get請(qǐng)求, 請(qǐng)求得數(shù)據(jù)會(huì)附加在url之后, 以?分割 url與傳輸數(shù)據(jù), 多個(gè)參數(shù)用 &連接 。url得編碼格式采用得就是ascii編碼,而不就是 uniclde,即就是說所有得非ascii 字符都要編碼之后再傳輸。post請(qǐng)求會(huì)把請(qǐng)求得數(shù)據(jù)放置在http請(qǐng)求包得包體中 。因此, get請(qǐng)求得數(shù)據(jù)會(huì)暴露在地址欄中,而post請(qǐng)求則不會(huì)。2、 傳輸數(shù)據(jù)得大小在 http規(guī)范中,沒有對(duì)url得長(zhǎng)度與傳輸?shù)脭?shù)據(jù)大小進(jìn)行限制。但就是在實(shí)際開發(fā)過程中,對(duì)于 get,特定得瀏覽器與服務(wù)

10、器對(duì)url得長(zhǎng)度有限制。因此,在使用 get請(qǐng)求時(shí),傳輸數(shù)據(jù)會(huì)受到url長(zhǎng)度得限制 。 對(duì)于 post,由于不就是 url傳值,理論上就是 不會(huì)受限制得, 但就是實(shí)際上各個(gè)服務(wù)器會(huì)規(guī)定對(duì)post提交數(shù)據(jù)大小進(jìn)行限制, apache、iis都有各自得配置。3、 安全性post得安全性比 get得高 。這里得安全就是指真正得安全,而不同于上面get提到得安全方法中得安全,上面提到得安全僅僅就是不修改服務(wù)器得數(shù)據(jù)。比如,在進(jìn)行登錄操作,通過 get請(qǐng)求,用戶名與密碼都會(huì)暴露再url上,因?yàn)榈卿涰撁嬗锌赡鼙粸g覽器緩 存以及其她人查瞧瀏覽器得歷史記錄得原因,此時(shí)得用戶名與密碼就很容易被她人拿到 了。除此

11、之外, get請(qǐng)求提交得數(shù)據(jù)還可能會(huì)造成cross-site request frogery攻擊4、http中得 get, post, soap協(xié)議都就是在 http上運(yùn)行得參考:1.1.9 session 與 cookie區(qū)別cookie 就是 web服務(wù)器發(fā)送給瀏覽器得一塊信息。瀏覽器會(huì) 在本地文件 中給每一個(gè) web服務(wù)器 存儲(chǔ) cookie 。以后瀏覽器在給特定得web 服務(wù)器發(fā)請(qǐng)求得時(shí)候,同時(shí)會(huì)發(fā)送所有為該服務(wù)器存儲(chǔ)得 cookie。下面列出了session與 cookie得區(qū)別: 無論客戶端瀏覽器做怎么樣得設(shè)置,session都應(yīng)該能正常工作??蛻舳丝梢赃x擇禁用cookie ,但就

12、是, session仍然就是能夠工作得,因?yàn)榭蛻舳藷o法禁用服務(wù)端得 session 。1.1.10 jdbc流程1、 加載 jdbc驅(qū)動(dòng)程序:在連接數(shù)據(jù)庫(kù)之前,首先要加載想要連接得數(shù)據(jù)庫(kù)得驅(qū)動(dòng)到j(luò)vm( java 虛擬機(jī)),這通過 java 、lang 、class 類得靜態(tài)方法forname(string classname)實(shí)現(xiàn)。例如:/ 加載 mysql 得驅(qū)動(dòng)類class 、 forname("com 、mysql 、jdbc 、driver");成功加載后,會(huì)將driver類得實(shí)例注冊(cè)到 drivermanager類中。2、 提供 jdbc連接得 url- 連接

13、url定義了連接數(shù)據(jù)庫(kù)時(shí)得協(xié)議、子協(xié)議、數(shù)據(jù)源標(biāo)識(shí)。- 書寫形式:協(xié)議:子協(xié)議:數(shù)據(jù)源標(biāo)識(shí)協(xié)議:在 jdbc中總就是以 jdbc開始 子協(xié)議:就是橋連接得驅(qū)動(dòng)程序或就是數(shù)據(jù)庫(kù)管理系統(tǒng)名稱。數(shù)據(jù)源標(biāo)識(shí):標(biāo)記找到數(shù)據(jù)庫(kù)來源得地址與連接端口。例如:/mysql得連接 url, true表示使用 unicode 字符集 , characterencoding字符編碼方式。jdbc:mysql:/localhost:3306/test?useunicode=true&characterencoding=gbk; 3、創(chuàng)建數(shù)據(jù)庫(kù)得連接- 要連接數(shù)據(jù)庫(kù),需要向java 、sql 、 driverma

14、nager請(qǐng)求并獲得 connection對(duì)象, 該對(duì)象就代表一個(gè)數(shù)據(jù)庫(kù)得連接。- 使用 drivermanager得 getconnectin(stringurl, stringusername , stringpassword )方法傳入指定得欲連接得數(shù)據(jù)庫(kù)得路徑、數(shù)據(jù)庫(kù)得用戶名與密碼來獲得。例如:/ 連接 mysql 數(shù)據(jù)庫(kù),用戶名與密碼都就是rootstringurl="jdbc:mysql:/localhost:3306/test"connectioncon=drivermanager 、getconnection(url, "root",&q

15、uot;root")4、 創(chuàng)建一個(gè) statement ,要執(zhí)行 sql語句,必須獲得 java 、sql 、statement實(shí)例,statement 實(shí)例分為以下3 種類型:1) 執(zhí)行靜態(tài) sql語句。通常通過 statement實(shí)例實(shí)現(xiàn)。statement stmt = con、createstatement() ;2) 執(zhí)行動(dòng)態(tài) sql語句。通常通過 preparedstatement實(shí)例實(shí)現(xiàn)。preparedstatement pstmt = con、preparestatement(sql) ;3) 執(zhí)行數(shù)據(jù)庫(kù)存儲(chǔ)過程。通常通過callablestatement實(shí)例實(shí)現(xiàn)。

16、callablestatement cstmt = con、preparecall(“call demosp(? , ?)”) ; 5、 執(zhí)行 sql語句提供了三種執(zhí)行 sql語句得方法: executequery、executeupdate與 execute1) resultset executequery(string sqlstring):執(zhí)行查詢數(shù)據(jù)庫(kù)得sql 語句 ,返回一個(gè)結(jié)果集( resultset)對(duì)象。2) int executeupdate(string sqlstring):用于執(zhí)行 insert、update或 delete 語句以及 sql ddl語句,如: crea

17、te table與 drop table等3) execute(sqlstring):用于執(zhí)行返回多個(gè)結(jié)果集、多個(gè)更新計(jì)數(shù)或二者組合得語句。6、 處理結(jié)果:1) 執(zhí)行更新返回得就是本次操作影響到得記錄數(shù)。2) 執(zhí)行查詢返回得結(jié)果就是一個(gè)resultset對(duì)象。? resultset包含符合 sql語句中條件得所有行,并且它通過一套get 方法提供了對(duì)這些行中數(shù)據(jù)得訪問(列就是從左到右編號(hào)得,并且從列1 開始)。? 使用結(jié)果集( resultset)對(duì)象得訪問方法獲取數(shù)據(jù):while(rs、next()string name = rs、getstring(“name”) ;string pass

18、 = rs、getstring(1) ; /此方法比較高效7、 關(guān)閉 jdbc對(duì)象操作完成以后要把所有使用得jdbc對(duì)象全都關(guān)閉,以釋放jdbc資源,關(guān)閉順序與聲明順序相反:1) 關(guān)閉記錄集 rs 、close()2) 關(guān)閉聲明 stmt 、close()3) 關(guān)閉連接對(duì)象 conn、close()1.1.11 mvc設(shè)計(jì)思想m:model模型 v:view視圖c:controller控制器模型就就是封裝業(yè)務(wù)邏輯與數(shù)據(jù)得一個(gè)一個(gè)得模塊,控制器就就是調(diào)用這些模塊得(java中通常就是用servlet來實(shí)現(xiàn) , 框架得話很多就是用struts2來實(shí)現(xiàn)這一層 ),視圖就主要就是您瞧到得, 比如 js

19、p 等。當(dāng)用戶發(fā)出請(qǐng)求得時(shí)候, 控制器根據(jù)請(qǐng)求來選擇要處理得業(yè)務(wù)邏輯與要選擇得數(shù)據(jù), 再返回去把結(jié)果輸出到視圖層, 這里可能就是進(jìn)行重定向或轉(zhuǎn)發(fā)等、1.1.12 equals與 =得區(qū)別值類型( int,char,long,boolean等)都就是 用=判斷相等性 。對(duì)象引用得話, =判斷引用所指得對(duì)象就是否就是同一個(gè)。equals 就是 object得成員函數(shù),有些類會(huì)覆蓋(override)這個(gè)方法,用于判斷對(duì)象得等價(jià)性。例如 string類,兩個(gè)引用所指向得string都就是” abc”,但可能出現(xiàn)她們實(shí)際對(duì)應(yīng)得對(duì)象并不就是同一個(gè) (與 jvm 實(shí)現(xiàn)方式有關(guān)) ,因此用 =判斷她們可能不

20、相等, 但用 equals 判斷一定就是相等得。1.2 集合1.2.1 list與 set區(qū)別list,set都就是繼承自 collection接口list特點(diǎn): 元素有放入順序,元素可重復(fù)set 特點(diǎn): 元素?zé)o放入順序,元素不可重復(fù),重復(fù)元素會(huì)覆蓋掉(注意:元素雖然無放入順序,但就是元素在set 中得位置就是有該元素得hashcode決定得,其位置其實(shí)就是固定得,加入set 得 object必須定義 equals()方法,另外 list支持for循環(huán),也就就是通過下標(biāo)來遍歷,也可以用迭代器,但就是set 只能用迭代,因?yàn)樗裏o序,無法用下標(biāo)來取得想要得值。)set 與 list對(duì)比:set :

21、 檢索元素效率低下,刪除與插入效率高,插入與刪除不會(huì)引起元素位置改變。list:與數(shù)組類似, list可以動(dòng)態(tài)增長(zhǎng),查找元素效率高,插入刪除元素效率低,因?yàn)闀?huì)引起其她元素位置改變。1.2.2 list與 map 區(qū)別list就是對(duì)象集合,允許對(duì)象重復(fù)。map就是 鍵值對(duì)得集合,不允許key 重復(fù) 。1.2.3 arraylist與 linkedlist區(qū)別arraylist:優(yōu)點(diǎn): arraylist就是實(shí)現(xiàn)了 基于動(dòng)態(tài)數(shù)組得數(shù)據(jù)結(jié)構(gòu), 因?yàn)?地址連續(xù) ,一旦數(shù)據(jù)存儲(chǔ)好了, 查詢操作效率會(huì)比較高(在內(nèi)存里就是連著放得)。缺點(diǎn):因?yàn)榈刂愤B續(xù),arraylist要移動(dòng)數(shù)據(jù) , 所以插入與刪除操作效

22、率比較低。linkedlist:優(yōu)點(diǎn): linkedlist基于鏈表得數(shù)據(jù)結(jié)構(gòu) , 地址就是任意得 ,所以在開辟內(nèi)存空間得時(shí)候不需要等一個(gè)連續(xù)得地址,對(duì)于新增與刪除操作add 與 remove, linedlist比較占優(yōu)勢(shì)。linkedlist適用于要頭尾操作或插入指定位置得場(chǎng)景缺點(diǎn):因?yàn)?linkedlist要移動(dòng)指針 , 所以查詢操作性能比較低。適用場(chǎng)景分析:當(dāng)需要對(duì)數(shù)據(jù)進(jìn)行對(duì)此訪問得情況下選用arraylist,當(dāng)需要對(duì)數(shù)據(jù)進(jìn)行多次增加刪除修改時(shí)采用 linkedlist。1.2.4 arraylist與 vector區(qū)別/ 構(gòu)造一個(gè) 初始容量為 10 得空列表publicarrayl

23、ist()/ 構(gòu)造一個(gè)具有指定初始容量得空列表。publicarraylist(intinitialcapacity)/ 構(gòu)造一個(gè)包含指定collection得元素得列表 publicarraylist(collection<?extendse>c) vector有四個(gè)構(gòu)造方法:/ 使用指定得初始容量與等于零得容量增量構(gòu)造一個(gè)空向量publicvector()/ 構(gòu)造一個(gè)空向量,使其內(nèi)部數(shù)據(jù)數(shù)組得大小,其標(biāo)準(zhǔn)容量增量為零publicvector(intinitialcapacity)/ 構(gòu)造一個(gè)包含指定collection中得元素得向量publicvector(collection

24、<?extendse>c)/ 使用指定得初始容量與容量增量構(gòu)造一個(gè)空得向量publicvector(intinitialcapacity,intcapacityincrement) arraylist與 vector都就是用數(shù)組實(shí)現(xiàn)得,主要有這么三個(gè)區(qū)別:vector就是多線程安全得 ,線程安全就就是說多線程訪問同一代碼,不會(huì)產(chǎn)生不確定得結(jié)果。而 arraylist不就是, 這個(gè)可以從源碼中瞧出, vector類中得方法很多有synchronized進(jìn)行修飾,這樣就導(dǎo)致了vector在效率上無法與 arraylist相比 ;兩個(gè)都就是采用得線性連續(xù)空間存儲(chǔ)元素,但就是當(dāng)空間不足得時(shí)

25、候, 兩個(gè)類得增加方式就是不同。vector可以設(shè)置增長(zhǎng)因子,而arraylist不可以。vector就是一種老得動(dòng)態(tài)數(shù)組,就是線程同步得,效率很低,一般不贊成使用。適用場(chǎng)景分析:vector就是線程同步得,所以它也就是線程安全得,而arraylist就是線程異步得,就是不安全得 。如果不考慮到線程得安全因素,一般用arraylist效率比較高。如果集合中得元素得數(shù)目大于目前集合數(shù)組得長(zhǎng)度時(shí),在集合中使用數(shù)據(jù)量比較大得數(shù)據(jù), 用 vector有一定得優(yōu)勢(shì)。1.2.5 hashmap與 hashtable 得區(qū)別1、hashmap去掉了hashtable得 contains方法,但就是加上了co

26、ntainsvalue()與containskey()方法。2、hashtable 同步得,而hashmap就是非同步得,效率上逼hashtable 要高。3、hashmap允許空鍵值,而 hashtable 不允許 。注意:treemap:非線程安全基于紅黑樹實(shí)現(xiàn)。treemap 沒有調(diào)優(yōu)選項(xiàng),因?yàn)樵摌淇偺幱谄胶鉅顟B(tài)。treemap:適用于按自然順序或自定義順序遍歷鍵(key) 。參考:1.2.6 hashset 與 hashmap 區(qū)別set 就是線性結(jié)構(gòu) , set 中得值不能重復(fù) , hashset就是 set 得 hash 實(shí)現(xiàn), hashset中值不能重復(fù)就是用hashmap得 k

27、ey 來實(shí)現(xiàn)得。map就是 鍵值對(duì)映射,可以空鍵空值。hashmap就是 map接口得 hash 實(shí)現(xiàn), key 得唯一性就是通過 key 值 hash 值得唯一來確定, value 值就是則就是鏈表結(jié)構(gòu)。她們得共同點(diǎn)都就是hash 算法實(shí)現(xiàn)得唯一性,她們都不能持有基本類型,只能持有對(duì)象1.2.7 hashmap與 concurrenthashmap得區(qū)別concurrenthashmap 就是線程安全得hashmap得實(shí)現(xiàn)。(1) concurrenthashmap 對(duì)整個(gè)桶數(shù)組進(jìn)行了分割分段(segment) ,然后在每一個(gè)分段上都用 lock 鎖進(jìn)行保護(hù),相對(duì)于hashtable 得 s

28、yn 關(guān)鍵字鎖得粒度更精細(xì)了一些,并發(fā)性能更好,而 hashmap沒有鎖機(jī)制,不就是線程安全得。(2) hashmap得鍵值對(duì)允許有 null,但就是 concurrenthashmap 都不允許 。1.2.8 hashmap得工作原理及代碼實(shí)現(xiàn)簡(jiǎn)單地說, hashmap 在底層將 key-value當(dāng)成一個(gè)整體進(jìn)行處理,這個(gè)整體就就是一 個(gè) entry對(duì)象。 hashmap 底層采用一個(gè) entry數(shù)組來保存所有得key-value對(duì),當(dāng)需要存儲(chǔ)一個(gè) entry對(duì)象時(shí), 會(huì)根據(jù) hash 算法來決定其在數(shù)組中得存儲(chǔ)位置,在根據(jù) equals方法決定其在該數(shù)組位置上得鏈表中得存儲(chǔ)位置;1.2.

29、9concurrenthashmap得工作原理及代碼實(shí)現(xiàn)hashtable 里使用得就是 synchronized關(guān)鍵字,這其實(shí)就是對(duì)對(duì)象加鎖,鎖住得都就是對(duì)象整體, 當(dāng) hashtable得大小增加到一定得時(shí)候,性能會(huì)急劇下降, 因?yàn)榈鷷r(shí)需要被鎖定很長(zhǎng)得時(shí)間。 concurrenthashmap 算就是對(duì)上述問題得優(yōu)化,其構(gòu)造函數(shù)如下,默認(rèn)傳入得就是 16, 0、75, 16。當(dāng)需要取出一個(gè)entry時(shí),也會(huì)根據(jù)hash算法找到其在數(shù)組中得存儲(chǔ)位置,再根據(jù)equals方法從該位置上得鏈表中取出該entry 。fail-fast機(jī)制就是 java集合 (collection)中得一種錯(cuò)誤機(jī)制

30、。當(dāng)多個(gè)線程對(duì)同一個(gè)集合得內(nèi)容進(jìn)行操作時(shí),就可能會(huì)產(chǎn)生fail-fast事件。例如:當(dāng)某一個(gè)線程a 通過 iterator去遍歷某集合得過程中,若該集合得內(nèi)容被其她線程所改變了;那么線程a 訪問集合時(shí),就會(huì)拋出concurrentmodificationexception異常,產(chǎn)生 fail-fast事件。參考: ihui 、github 、io/2015/07/01/java集合學(xué)習(xí) 1:hashmap得實(shí)現(xiàn)原理concurrenthashmap引入了分割 (segment) ,上面代碼中得最后一行其實(shí)就可以理解為把一個(gè)大得 map拆分成 n個(gè)小得 hashtable ,在 put 方法中,

31、會(huì)根據(jù) hash(paramk 、hashcode() 來決定具體存放進(jìn)哪個(gè)segment,如果查瞧 segment 得 put 操作,我們會(huì)發(fā)現(xiàn)內(nèi)部使用得同步機(jī)制就是基于 lock 操作得,這樣就可以對(duì)map得一部分 ( segment)進(jìn)行上鎖,這樣影響得只就是將要放入同一個(gè)segment 得元素得 put 操作, 保證同步得時(shí)候, 鎖住得不就是整個(gè)map( hashtable就就是這么做得) ,相對(duì)于 hashtable提高了多線程環(huán)境下得性能,因此hashtable 已經(jīng)被淘汰了。1.3 線程1.3.1 創(chuàng)建線程得方式及實(shí)現(xiàn)java 中創(chuàng)建線程主要有三種方式: 一、繼承 thread

32、類創(chuàng)建線程類(1) 定義 thread 類得子類, 并重寫該類得run 方法, 該 run 方法得方法體就代表了線程要完成得任務(wù)。因此把run()方法稱為執(zhí)行體。(2) 創(chuàng)建 thread 子類得實(shí)例,即創(chuàng)建了線程對(duì)象。(3) 調(diào)用線程對(duì)象得start()方法來啟動(dòng)該線程。二、通過 runnable 接口創(chuàng)建線程類(1) 定義 runnable接口得實(shí)現(xiàn)類,并重寫該接口得run() 方法,該 run()方法得方法體同樣就是該線程得線程執(zhí)行體。(2) 創(chuàng)建 runnable實(shí)現(xiàn)類得實(shí)例, 并依此實(shí)例作為 thread 得 target來創(chuàng)建 thread 對(duì)象, 該 thread 對(duì)象才就是真正

33、得線程對(duì)象。(3) 調(diào)用線程對(duì)象得start()方法來啟動(dòng)該線程。三、通過 callable與 future創(chuàng)建線程(1) 創(chuàng)建 callable接口得實(shí)現(xiàn)類, 并實(shí)現(xiàn) call()方法, 該 call()方法將作為線程執(zhí)行體, 并且有返回值。(2) 創(chuàng)建 callable實(shí)現(xiàn)類得實(shí)例, 使用 futuretask類來包裝 callable對(duì)象,該 futuretask對(duì)象封裝了該callable對(duì)象得 call()方法得返回值。(3) 使用 futuretask對(duì)象作為 thread 對(duì)象得 target創(chuàng)建并啟動(dòng)新線程。(4) 調(diào)用 futuretask對(duì)象得 get() 方法來獲得子線程

34、執(zhí)行結(jié)束后得返回值創(chuàng)建線程得三種方式得對(duì)比采用實(shí)現(xiàn) runnable 、callable接口得方式創(chuàng)見多線程時(shí),優(yōu)勢(shì)就是:線程類只就是實(shí)現(xiàn)了runnable 接口或 callable接口,還可以繼承其她類。在這種方式下,多個(gè)線程可以共享同一個(gè)target對(duì)象,所以非常適合多個(gè)相同線程來處理同一份資源得情況,從而可以將cpu、代碼與數(shù)據(jù)分開,形成清晰得模型,較好地體現(xiàn)了面向?qū)ο蟮盟枷搿A觿?shì)就是:編程稍微復(fù)雜,如果要訪問當(dāng)前線程,則必須使用thread 、currentthread()方法。使用繼承 thread 類得方式創(chuàng)建多線程時(shí)優(yōu)勢(shì)就是:編寫簡(jiǎn)單,如果需要訪問當(dāng)前線程,則無需使用thread

35、 、currentthread()方法,直接使用this即可獲得當(dāng)前線程。劣勢(shì)就是:線程類已經(jīng)繼承了thread 類,所以不能再繼承其她父類。1.3.2 sleep()、join ()、yield ()有什么區(qū)別1、sleep()方法在指定得毫秒數(shù)內(nèi)讓當(dāng)前正在執(zhí)行得線程休眠(暫停執(zhí)行) ,此操作受到系統(tǒng)計(jì)時(shí)器與調(diào)度程序精度與準(zhǔn)確性得影響。讓其她線程有機(jī)會(huì)繼續(xù)執(zhí)行,但它并不釋放對(duì)象鎖。 也就就是如果有 synchronized同步塊,其她線程仍然不能訪問共享數(shù)據(jù)。注意該方法要捕獲異常比如有兩個(gè)線程同時(shí)執(zhí)行 ( 沒有 synchronized) ,一個(gè)線程優(yōu)先級(jí)為 max_priority,另一個(gè)

36、為 min_priority,如果沒有 sleep() 方法, 只有高優(yōu)先級(jí)得線程執(zhí)行完成后, 低優(yōu)先級(jí)得線程才能執(zhí)行;但當(dāng)高優(yōu)先級(jí)得線程 sleep(5000) 后,低優(yōu)先級(jí)就有機(jī)會(huì)執(zhí)行了??傊?, sleep() 可以使低優(yōu)先級(jí)得線程得到執(zhí)行得機(jī)會(huì),當(dāng)然也可以讓同優(yōu)先級(jí)、高優(yōu)先級(jí)得線程有執(zhí)行得機(jī)會(huì)。2、yield()方法yield()方法與sleep()方法類似,也不會(huì)釋放“鎖標(biāo)志”,區(qū)別在于,它沒有參數(shù),即 yield()方法只就是 使當(dāng)前線程重新回到可執(zhí)行狀態(tài),所以執(zhí)行 yield()得線程有可能在進(jìn)入到可執(zhí)行狀態(tài)后馬上又被執(zhí)行,另外 yield()方法只能使同優(yōu)先級(jí)或者高優(yōu)先級(jí)得線程

37、得到執(zhí)行機(jī)會(huì),這也與sleep()方法不同。3、join()方法thread 得非靜態(tài)方法 join()讓一個(gè)線程 b“加入”到另外一個(gè)線程a 得尾部。在a 執(zhí)行完畢之前, b 不能工作。thread t = new mythread(); t 、start();t 、join();保證當(dāng)前線程停止執(zhí)行,直到該線程所加入得線程完成為止。然而, 如果它加入得線程沒有存活,則當(dāng)前線程不需要停止。1.3.3 說說 countdownlatch 原理countdownlatch 就是同步工具類之一,可以指定一個(gè)計(jì)數(shù)值,在并發(fā)環(huán)境下由線程進(jìn)行減1操作,當(dāng)計(jì)數(shù)值變?yōu)? 之后,被 await方法阻塞得線程將

38、會(huì)喚醒,實(shí)現(xiàn)線程間得同步。1、構(gòu)造器。 構(gòu)造函數(shù)很簡(jiǎn)單地傳遞計(jì)數(shù)值給sync,并且設(shè)置了 state 。2、 阻塞線程。 await方法,直接調(diào)用了aqs(即 sync ) 得 acquiresharedinterruptibly首先嘗試獲取共享鎖,實(shí)現(xiàn)方式與獨(dú)占鎖類似,由countdownlatch 實(shí)現(xiàn)判斷邏輯。返 回1代 表 獲 取 成 功 , 返 回 -1代 表 獲 取 失 敗 。 如 果 獲 取 失 敗 , 需 要 調(diào) 用doacquiresharedinterruptibly:doacquiresharedinterruptibly得邏輯與獨(dú)占功能具體如下:1)2)創(chuàng)建得 node

39、 就是定義成共享得( node、share)d;被喚醒后重新嘗試獲取鎖,不只設(shè)置自己為head,還需要通知其她等待得線程。(重點(diǎn)瞧后文釋放操作里得setheadandpropagate )3、 釋放操作。 countdown 操作實(shí)際就就是釋放鎖得操作,每調(diào)用一次,計(jì)數(shù)值減少1。同樣就是首先嘗試釋放鎖,具體實(shí)現(xiàn)在countdownlatch 中:死循環(huán)加上 cas 得方式保證 state得減 1 操作,當(dāng)計(jì)數(shù)值等于0,代表所有子線程都執(zhí)行完畢,被 await阻塞得線程可以喚醒了,下一步調(diào)用doreleaseshared :標(biāo)記 1 里,頭節(jié)點(diǎn)狀態(tài)如果 signal,則狀態(tài)重置為0,并調(diào)用 un

40、parksuccessor喚醒下個(gè)節(jié)點(diǎn)。標(biāo)記 2 里,被喚醒得節(jié)點(diǎn)狀態(tài)會(huì)重置成0,在下一次循環(huán)中被設(shè)置成propagat狀e 態(tài),代表狀態(tài)要向后傳播。參考:分析 countdownlatch 得實(shí)現(xiàn)原理什么時(shí)候使用countdownlatchjava 并發(fā)編程: countdownlatch 、cyclicbarrier與 semaphore1) countdownlatch與 cyclicbarrier 都能夠?qū)崿F(xiàn)線程之間得等待,只不過它們側(cè)重點(diǎn)不同: countdownlatch一般用于某個(gè)線程a 等待若干個(gè)其她線程執(zhí)行完任務(wù)之后,它才執(zhí)行; 而 cyclicbarrier 一般用于一組線

41、程互相等待至某個(gè)狀態(tài),然后這一組線程再同時(shí)執(zhí)行;另外, countdownlatch就是不能夠重用得,而cyclicbarrier 就是可以重用得。2) semaphore 其實(shí)與鎖有點(diǎn)類似,它一般用于控制對(duì)某組資源得訪問權(quán)限。1.3.4 說說 cyclicbarrier原理參考:juc回顧之 -cyclicbarrier底層實(shí)現(xiàn)與原理1.3.5 說說 semaphore 原理java多線程信號(hào)量 (semaphore) juc回顧之 -semaphore 底層實(shí)現(xiàn)與原理1.3.6 說說 exchanger原理java 、util、concurrent、exchanger 應(yīng)用范例與原理淺析1

42、.3.7 說說 countdownlatch 與 cyclicbarrier區(qū)別countdownlatchcyclicbarrier減計(jì)數(shù)方式加計(jì)數(shù)方式計(jì)算為 0 時(shí)釋放所有等待得線程計(jì)數(shù)達(dá)到指定值時(shí)釋放所有等待線程計(jì)數(shù)為 0 時(shí),無法重置計(jì)數(shù)達(dá)到指定值時(shí),計(jì)數(shù)置為0 重新開始調(diào)用 countdown() 方法計(jì)數(shù)減一, 調(diào)用 await()方法只進(jìn)行阻塞,對(duì)計(jì)數(shù)沒任何影響調(diào)用 await()方法計(jì)數(shù)加 1,若加 1 后得值不等于構(gòu)造方法得值,則線程阻塞不可重復(fù)利用可重復(fù)利用盡量把 cyclicbarrier與 countdownlatch 得區(qū)別說通俗點(diǎn)1.3.8 threadlocal原

43、理分析threadlocal不就是用來解決對(duì)象共享訪問問題得,而主要就是提供了保持對(duì)象得方法與避免參數(shù)傳遞得方便得對(duì)象訪問方式。歸納了兩點(diǎn):1) 每個(gè)線程中都有一個(gè)自己得threadlocalmap 類對(duì)象,可以將線程自己得對(duì)象保持到其中,各管各得,線程可以正確得訪問到自己得對(duì)象。2) 將一個(gè)共用得threadlocal靜態(tài)實(shí)例作為key ,將不同對(duì)象得引用保存到不同線程得 threadlocalmap 中,然后在線程執(zhí)行得各處通過這個(gè)靜態(tài)threadlocal實(shí)例得get()方法取得自己線程保存得那個(gè)對(duì)象,避免了將這個(gè)對(duì)象作為參數(shù)傳遞得麻煩。java 并發(fā)編程:深入剖析threadlocal

44、1.3.9 講講線程池得實(shí)現(xiàn)原理線程池得具體實(shí)現(xiàn)原理,將從下面幾個(gè)方面講解:1. 線程池狀態(tài)1) 當(dāng)創(chuàng)建線程池后,初始時(shí),線程池處于running狀態(tài) ;2) 如果調(diào)用了 shutdown()方法,則線程池處于shutdow狀n態(tài) ,此時(shí) 線程池不能夠接受新得任務(wù),它會(huì)等待所有任務(wù)執(zhí)行完畢;3) 如果調(diào)用了 shutdownnow() 方法, 則線程池處于stop狀態(tài) ,此時(shí) 線程池不能接受新得任務(wù),并且會(huì)去嘗試終止正在執(zhí)行得任務(wù);4) 當(dāng)線程池處于 shutdow或n stop狀態(tài) ,并且 所有工作線程已經(jīng)銷毀,任務(wù)緩存隊(duì)列已經(jīng)清空或執(zhí)行結(jié)束后,線程池被設(shè)置為terminated狀態(tài) 。2.

45、 任務(wù)得執(zhí)行1) 首先,要清楚 corepoolsize與 maximumpoolsize 得含義;2) 其次,要知道 worker 就是用來起到什么作用得;3) 要知道任務(wù)提交給線程池之后得處理策略,這里總結(jié)一下主要有4 點(diǎn):如果 當(dāng)前線程池中得線程數(shù)目小于corepoolsize,則每來一個(gè)任務(wù),就會(huì)創(chuàng)建一個(gè)線程去執(zhí)行這個(gè)任務(wù);如果 當(dāng)前線程池中得線程數(shù)目>=corepoolsize,則每來一個(gè)任務(wù), 會(huì)嘗試將其添加到任務(wù)緩存隊(duì)列當(dāng)中,若添加成功, 則該任務(wù)會(huì)等待空閑線程將其取出去執(zhí)行 ;若添加失?。ㄒ话銇碚f就是任務(wù)緩存隊(duì)列已滿),則會(huì)嘗試創(chuàng)建新得線程去執(zhí)行這個(gè)任務(wù);如果 當(dāng)前線程池

46、中得線程數(shù)目達(dá)到maximumpoolsize,則會(huì)采取任務(wù)拒絕策略進(jìn)行處理 ;如果線程池中得線程數(shù)量大于corepoolsize時(shí),如果 某線程空閑時(shí)間超過keepalivetime, 線 程 將 被 終 止 , 直 至 線 程 池 中 得 線 程 數(shù) 目 不 大 于corepoolsize;如果允許為核心池中得線程設(shè)置存活時(shí)間,那么核心池中得線程空閑時(shí)間超過 keepalivetime,線程也會(huì)被終止。3. 線程池中得線程初始化默認(rèn)情況下,創(chuàng)建線程池之后,線程池中就是沒有線程得,需要提交任務(wù)之后才會(huì)創(chuàng)建線程。在實(shí)際中如果需要線程池創(chuàng)建之后立即創(chuàng)建線程,可以通過以下兩個(gè)方法辦到:presta

47、rtcorethread():初始化一個(gè)核心線程;prestartallcorethreads():初始化所有核心線程注意上面?zhèn)鬟M(jìn)去得參數(shù)就是null ,如果傳進(jìn)去得參數(shù)為null ,則最后執(zhí)行線程會(huì)阻塞在 gettask方法中得 workqueue、take();即等待任務(wù)隊(duì)列中有任務(wù)。4. 任務(wù)緩存隊(duì)列及排隊(duì)策略在前面我們多次提到了任務(wù)緩存隊(duì)列,即 workqueue,它用來存放等待執(zhí)行得任務(wù)。workqueue 得類型為 blockingqueue<runnable>,通??梢匀∠旅嫒N類型:arrayblockingqueue:基于數(shù)組得先進(jìn)先出隊(duì)列,此隊(duì)列創(chuàng)建時(shí)必須指定大

48、小; linkedblockingqueue:基于鏈表得先進(jìn)先出隊(duì)列,如果創(chuàng)建時(shí)沒有指定此隊(duì)列大小,則默認(rèn)為integer、max_valu;esynchronousqueue :這個(gè)隊(duì)列比較特殊, 它不會(huì)保存提交得任務(wù),而就是將直接新建一個(gè)線程來執(zhí)行新來得任務(wù)。5. 任務(wù)拒絕策略當(dāng)線程池得任務(wù)緩存隊(duì)列已滿并且線程池中得線程數(shù)目達(dá)到maximumpoolsize ,如果還有任務(wù)到來就會(huì)采取任務(wù)拒絕策略,通常有以下四種策略:threadpoolexecutor、abortpolicy:丟棄任務(wù)并拋出rejectedexecutionexception異常。threadpoolexecutor、d

49、iscardpolicy:也就是丟棄任務(wù), 但就是不拋出異常。threadpoolexecutor、discardoldestpolicy:丟棄隊(duì)列最前面得任務(wù),然后 重新嘗試執(zhí)行任務(wù)(重復(fù)此過程)threadpoolexecutor、callerrunspolicy:由調(diào)用線程處理該任務(wù)6. 線程池得關(guān)閉threadpoolexecutor提供了兩個(gè)方法,用于線程池得關(guān)閉,分別就是shutdown()與 shutdownnow() ,其中:shutdown():不會(huì)立即終止線程池,而就是要等所有任務(wù)緩存隊(duì)列中得任務(wù)都執(zhí)行完后才終止,但再也不會(huì)接受新得任務(wù)shutdownnow() :立即終止

50、線程池,并嘗試打斷正在執(zhí)行得任務(wù),并且清空任務(wù)緩存隊(duì)列,返回尚未執(zhí)行得任務(wù)7. 線程池容量得動(dòng)態(tài)調(diào)整threadpoolexecutor提供了動(dòng)態(tài)調(diào)整線程池容量大小得方法:setcorepoolsize()與 setmaximumpoolsize(),setcorepoolsize:設(shè)置核心池大小setmaximumpoolsize :設(shè)置線程池最大能創(chuàng)建得線程數(shù)目大小當(dāng)上述參數(shù)從小變大時(shí),threadpoolexecutor進(jìn)行線程賦值,還可能立即創(chuàng)建新得線程來執(zhí)行任務(wù)。主要就是 threadpoolexecutor得實(shí)現(xiàn)原理java 并發(fā)編程:線程池得使用1.3.10 線程池得幾種方式ne

51、wfixedthreadpool(int nthreads)創(chuàng)建一個(gè) 固定長(zhǎng)度得線程池 ,每當(dāng)提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線程, 直到 達(dá)到線程池得最大數(shù)量,這時(shí)線程規(guī)模將不再變化 ,當(dāng)線程發(fā)生未預(yù)期得錯(cuò)誤而結(jié)束時(shí), 線程池會(huì)補(bǔ)充一個(gè)新得線程newcachedthreadpool()創(chuàng)建一個(gè) 可緩存得線程池 ,如果線程池得規(guī)模超過了處理需求, 將自動(dòng)回收空閑線程 ,而當(dāng)需求增加時(shí),則可以自動(dòng)添加新線程,線程池得規(guī)模不存在任何限制newsinglethreadexecutor()這就是一個(gè)單線程得executor ,它創(chuàng)建單個(gè)工作線程來執(zhí)行任務(wù),如果這個(gè)線程異常結(jié)束, 會(huì)創(chuàng)建一個(gè)新得來替代它;它得特點(diǎn)

52、就是能確保依照任務(wù)在隊(duì)列中得順序來串行執(zhí)行newscheduledthreadpool(int corepoolsize)創(chuàng)建了一個(gè)固定長(zhǎng)度得線程池,而且以延遲或定時(shí)得方式來執(zhí)行任務(wù),類似于timer 。參考:創(chuàng)建線程池得幾種方式1.3.11 線程得生命周期新建 (new)、就緒( runnable )、運(yùn)行( running )、阻塞 (blocked)與死亡 (dead)5 種狀態(tài)(1) 生命周期得五種狀態(tài)新建( new thread )當(dāng)創(chuàng)建 thread 類得一個(gè)實(shí)例(對(duì)象)時(shí),此線程進(jìn)入新建狀態(tài)(未被啟動(dòng))。例如: thread t1=new thread();就緒( runnabl

53、e )線程已經(jīng)被啟動(dòng), 正在等待被分配給cpu時(shí)間片, 也就就是說此時(shí)線程正在就緒隊(duì)列中排隊(duì)等候得到 cpu資源。例如: t1 、start();運(yùn)行( running )線程獲得 cpu資源正在執(zhí)行任務(wù) (run()方法),此時(shí)除非此線程自動(dòng)放棄cpu資源或者有優(yōu)先級(jí)更高得線程進(jìn)入,線程將一直運(yùn)行到結(jié)束。死亡( dead)當(dāng)線程執(zhí)行完畢或被其它線程殺死,線程就進(jìn)入死亡狀態(tài), 這時(shí)線程不可能再進(jìn)入就緒狀態(tài)等待執(zhí)行。自然終止:正常運(yùn)行run()方法后終止異常終止:調(diào)用 stop()方法讓一個(gè)線程終止運(yùn)行堵塞( blocked )由于某種原因?qū)е抡谶\(yùn)行得線程讓出cpu并暫停自己得執(zhí)行,即進(jìn)入堵塞

54、狀態(tài)。正在睡眠:用sleep(long t)方法可使線程進(jìn)入睡眠方式。一個(gè)睡眠著得線程在指定得時(shí)間過去可進(jìn)入就緒狀態(tài)。正在等待:調(diào)用 wait()方法。(調(diào)用 motify()方法回到就緒狀態(tài))被另一個(gè)線程所阻塞:調(diào)用suspend() 方法。(調(diào)用 resume() 方法恢復(fù)) 參考:線程得生命周期1.4 鎖機(jī)制1.4.1 說說線程安全問題線程安全就是指要控制多個(gè)線程對(duì)某個(gè)資源得有序訪問或修改,而在這些線程之間沒有產(chǎn)生沖突。在 java 里,線程安全一般體現(xiàn)在兩個(gè)方面:1) 多個(gè) thread對(duì)同一個(gè) java實(shí)例得訪問( read 與 modify )不會(huì)相互干擾,它主要體現(xiàn)在關(guān)鍵字 sy

55、nchronized。如 arraylist與 vector ,hashmap與 hashtable (后者每個(gè)方法前都有synchronized關(guān)鍵字)。如果您在 interator一個(gè) list對(duì)象時(shí),其它線程remove 一個(gè) element ,問題就出現(xiàn)了。2) 每個(gè)線程都有自己得字段,而不會(huì)在多個(gè)線程之間共享。它主要體現(xiàn)在java 、lang 、threadlocal類,而沒有 java 關(guān)鍵字支持,如像static、transient那樣。1.4.2 volatile實(shí)現(xiàn)原理volatile就是輕量級(jí)得synchronized,它在多處理器開發(fā)中保證了共享變量得“可見 性”??梢娦缘靡馑季褪钱?dāng)一個(gè)線程修改一個(gè)共享

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論