欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

java代碼優(yōu)化面試題 java代碼優(yōu)化技巧

java算法面試題

三個(gè)for循環(huán),第一個(gè)和第二個(gè)有啥區(qū)別?去掉一個(gè)吧

公司專注于為企業(yè)提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、商城網(wǎng)站建設(shè)小程序定制開(kāi)發(fā),軟件定制網(wǎng)站制作等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗(yàn),我們會(huì)仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計(jì)、整合,為客戶設(shè)計(jì)出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,創(chuàng)新互聯(lián)更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。

可以用迭代器remove方法,在移除的同時(shí)添加。

不知道是你記錯(cuò)了還是題本身就這樣,我只想說(shuō):

寫這代碼的是二貨么?

1、每個(gè)循環(huán)的索引都是從0開(kāi)始,這是什么遍歷方式?

2、看這題的目的是想把用戶添加到相應(yīng)的組里,這我就不明白了,新建一個(gè)用戶的時(shí)候就沒(méi)分配組么?那用戶的GroupId哪來(lái)的?

3、這是一個(gè)dao操作,難道就不會(huì)根據(jù)GroupId直接查出用戶或者組么?

這哪是優(yōu)化代碼?分明是挖坑。

java基礎(chǔ)面試題有哪些?

下面是10道java基礎(chǔ)面試題,后附答案

1.什么是 Java 虛擬機(jī)?為什么 Java 被稱作是“平臺(tái)無(wú)關(guān)的編程語(yǔ)言”?

Java 虛擬機(jī)是一個(gè)可以執(zhí)行 Java 字節(jié)碼的虛擬機(jī)進(jìn)程。Java 源文件被編譯成能被 Java 虛擬機(jī)執(zhí)行的字節(jié)碼文件。

Java 被設(shè)計(jì)成允許應(yīng)用程序可以運(yùn)行在任意的平臺(tái),而不需要程序員為每一個(gè)平臺(tái)單獨(dú)重寫或者是重新編譯。Java 虛擬機(jī)讓這個(gè)變?yōu)榭赡埽驗(yàn)樗赖讓佑布脚_(tái)的指令長(zhǎng)度和其他特性。

2.“static”關(guān)鍵字是什么意思?Java 中是否可以覆蓋(override)一個(gè) private 或者是static 的方法?

“static”關(guān)鍵字表明一個(gè)成員變量或者是成員方法可以在沒(méi)有所屬的類的實(shí)例變量的情況下被訪問(wèn)。

Java 中 static 方法不能被覆蓋,因?yàn)榉椒ǜ采w是基于運(yùn)行時(shí)動(dòng)態(tài)綁定的,而 static 方法是編譯時(shí)靜態(tài)綁定的。static 方法跟類的任何實(shí)例都不相關(guān),所以概念上不適用。

3.JDK 和 JRE 的區(qū)別是什么?

Java 運(yùn)行時(shí)環(huán)境(JRE)是將要執(zhí)行 Java 程序的 Java 虛擬機(jī)。它同時(shí)也包含了執(zhí)行 applet 需要的瀏覽器插件。Java 開(kāi)發(fā)工具包 (JDK)是完整的 Java 軟件開(kāi)發(fā)包,包含了 JRE,編譯器和其他的工具(比如:JavaDoc,Java 調(diào)試器),可以讓開(kāi)發(fā)者開(kāi)發(fā)、編譯、執(zhí)行 Java 應(yīng)用程序。

4.是否可以在 static 環(huán)境中訪問(wèn)非 static 變量?

static 變量在 Java 中是屬于類的,它在所有的實(shí)例中的值是一樣的。當(dāng)類被 Java 虛擬機(jī)載入的時(shí)候,會(huì)對(duì) static 變量進(jìn)行初始化。如果你的代碼嘗試不用實(shí)例來(lái)訪問(wèn)非 static 的變量,編譯器會(huì)報(bào)錯(cuò),因?yàn)檫@些變量還沒(méi)有被創(chuàng)建出來(lái),還沒(méi)有跟任何實(shí)例關(guān)聯(lián)上。

5.Java 支持的數(shù)據(jù)類型有哪些?什么是自動(dòng)拆裝箱?

Java 語(yǔ)言支持的 8 中基本數(shù)據(jù)類型是:

?byte

?short

?int

?long

?float

?double

?boolean

?char

自動(dòng)裝箱是 Java 編譯器在基本數(shù)據(jù)類型和對(duì)應(yīng)的對(duì)象包裝類型之間做的一個(gè)轉(zhuǎn)化。比如:把 int 轉(zhuǎn)化成 Integer,double 轉(zhuǎn)化成 double,等等。反之就是自動(dòng)拆箱。

6.Java 支持多繼承么?

不支持,Java 不支持多繼承。每個(gè)類都只能繼承一個(gè)類,但是可以實(shí)現(xiàn)多個(gè)接口。

7.Java 中,什么是構(gòu)造函數(shù)?什么是構(gòu)造函數(shù)重載?什么是復(fù)制構(gòu)造函數(shù)?

當(dāng)新對(duì)象被創(chuàng)建的時(shí)候,構(gòu)造函數(shù)會(huì)被調(diào)用。每一個(gè)類都有構(gòu)造函數(shù)。在程序員沒(méi)有給類提供構(gòu)造函數(shù)的情況下,Java 編譯器會(huì)為這個(gè)類創(chuàng)建一個(gè)默認(rèn)的構(gòu)造函數(shù)。

Java 中構(gòu)造函數(shù)重載和方法重載很相似。可以為一個(gè)類創(chuàng)建多個(gè)構(gòu)造函數(shù)。每一個(gè)構(gòu)造函數(shù)必須有它自己唯一的參數(shù)列表。

Java 不支持像 C++中那樣的復(fù)制構(gòu)造函數(shù),這個(gè)不同點(diǎn)是因?yàn)槿绻悴蛔约簩憳?gòu)造函數(shù)的情況下,Java 不會(huì)創(chuàng)建默認(rèn)的復(fù)制構(gòu)造函數(shù)。

8.Java 中的方法覆蓋(Overriding)和方法重載(Overloading)是什么意思?

Java 中的方法重載發(fā)生在同一個(gè)類里面兩個(gè)或者是多個(gè)方法的方法名相同但是參數(shù)不同的情況。與此相對(duì),方法覆蓋是說(shuō)子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,參數(shù)列表和返回類型。覆蓋者可能不會(huì)限制它所覆蓋的方法的訪問(wèn)。

9.接口和抽象類的區(qū)別是什么?

Java 提供和支持創(chuàng)建抽象類和接口。它們的實(shí)現(xiàn)有共同點(diǎn),不同點(diǎn)在于:

?接口中所有的方法隱含的都是抽象的。而抽象類則可以同時(shí)包含抽象和非抽象的方法。

?類可以實(shí)現(xiàn)很多個(gè)接口,但是只能繼承一個(gè)抽象類

?類如果要實(shí)現(xiàn)一個(gè)接口,它必須要實(shí)現(xiàn)接口聲明的所有方法。但是,類可以不實(shí)現(xiàn)抽象類聲明的所有方法,當(dāng)然,在這種情況下,類也必須得聲明成是抽象的。

?抽象類可以在不提供接口方法實(shí)現(xiàn)的情況下實(shí)現(xiàn)接口。

?Java 接口中聲明的變量默認(rèn)都是 final 的。抽象類可以包含非 final 的變量。

?Java 接口中的成員函數(shù)默認(rèn)是 public 的。抽象類的成員函數(shù)可以是 private, protected 或者是 public。

?接口是絕對(duì)抽象的,不可以被實(shí)例化。抽象類也不可以被實(shí)例化,但是,如果它包含 main 方法的話是可以被調(diào)用的。

10.什么是值傳遞和引用傳遞?

對(duì)象被值傳遞,意味著傳遞了對(duì)象的一個(gè)副本。因此,就算是改變了對(duì)象副本,也不會(huì)影響源對(duì)象的值。

對(duì)象被引用傳遞,意味著傳遞的并不是實(shí)際的對(duì)象,而是對(duì)象的引用。因此,外部對(duì)引用對(duì)象所做的改變會(huì)反映到所有的對(duì)象上。

最后祝你面試順利!

java常見(jiàn)的面試題和面試技巧 誰(shuí)能告訴我 謝謝

如果說(shuō)是一個(gè)企業(yè)急需招人,我想那就得多準(zhǔn)備一些框架方面的知識(shí),畢竟做項(xiàng)目是用的框架!下面進(jìn)入主題:大概的流程是這樣吧 框架——》Java基礎(chǔ)——》數(shù)據(jù)庫(kù)相關(guān)點(diǎn)——》頁(yè)面注意技巧

一:框架——》

1,)Struts2是如何實(shí)現(xiàn)MVC的?M(模型):這個(gè)一般不由Struts來(lái)做V (視圖):視圖也不算struts的強(qiáng)項(xiàng),但是struts提供優(yōu)秀的標(biāo)簽來(lái)支持視圖的展示,利用標(biāo)簽,可以將數(shù)據(jù)合理的展示給用戶控制器:struts的重要功能,提供struts的過(guò)濾器,攔截用戶的請(qǐng)求,查找struts配置文件,為其匹配一個(gè)對(duì)應(yīng)的Action,這個(gè)Action負(fù)責(zé)調(diào)用模型,獲得數(shù)據(jù),然后對(duì)數(shù)據(jù)做部分處理,接著Action再將處理后的數(shù)據(jù),為其選擇一個(gè)視圖進(jìn)行輸出。

2) Struts工作機(jī)制?為什么要使用Struts? 工作機(jī)制: Struts的工作流程: 在web應(yīng)用啟動(dòng)時(shí)就會(huì)加載初始化ActionServlet,ActionServlet從struts-config.xml文件中讀取配置信息,把它們存放到各種配置對(duì)象當(dāng)ActionServlet接收到一個(gè)客戶請(qǐng)求時(shí),將執(zhí)行如下流程. (1)檢索和用戶請(qǐng)求匹配的ActionMapping實(shí)例,如果不存在,就返回請(qǐng)求路徑無(wú)效信息; (2)如果ActionForm實(shí)例不存在,就創(chuàng)建一個(gè)ActionForm對(duì)象,把客戶提交的表單數(shù)據(jù)保存到ActionForm對(duì)象中; (3)根據(jù)配置信息決定是否需要表單驗(yàn)證.如果需要驗(yàn)證,就調(diào)用ActionForm的validate()方法; (4)如果ActionForm的validate()方法返回null或返回一個(gè)不包含ActionMessage的ActuibErrors對(duì)象, 就表示表單驗(yàn)證成功; (5)ActionServlet根據(jù)ActionMapping所包含的映射信息決定將請(qǐng)求轉(zhuǎn)發(fā)給哪個(gè)Action,如果相應(yīng)的Action實(shí)例不存在,就先創(chuàng)建這個(gè)實(shí)例,然后調(diào)用Action的execute()方法; (6)Action的execute()方法返回一個(gè)ActionForward對(duì)象,ActionServlet在把客戶請(qǐng)求轉(zhuǎn)發(fā)給ActionForward對(duì)象指向的JSP組件; (7)ActionForward對(duì)象指向JSP組件生成動(dòng)態(tài)網(wǎng)頁(yè),返回給客戶;為什么要用: JSP、Servlet、JavaBean技術(shù)的出現(xiàn)給我們構(gòu)建強(qiáng)大的企業(yè)應(yīng)用系統(tǒng)提供了可能。但用這些技術(shù)構(gòu)建的系統(tǒng)非常的繁亂,所以在此之上,我們需要一個(gè)規(guī)則、一個(gè)把這些技術(shù)組織起來(lái)的規(guī)則,這就是框架,Struts便應(yīng)運(yùn)而生。基于Struts開(kāi)發(fā)的應(yīng)用由3類組件構(gòu)成:控制器組件、模型組件、視圖組件 Struts的validate框架是如何驗(yàn)證的? 在struts配置文件中配置具體的錯(cuò)誤提示,再在FormBean中的validate()方法具體調(diào)用。

3)spring工作機(jī)制及為什么要用? 1.spring mvc請(qǐng)所有的請(qǐng)求都提交給DispatcherServlet,它會(huì)委托應(yīng)用系統(tǒng)的其他模塊負(fù)責(zé)負(fù)責(zé)對(duì)請(qǐng)求進(jìn)行真正的處理工作。 2.DispatcherServlet查詢一個(gè)或多個(gè)HandlerMapping,找到處理請(qǐng)求的Controller. 3.DispatcherServlet請(qǐng)請(qǐng)求提交到目標(biāo)Controller 4.Controller進(jìn)行業(yè)務(wù)邏輯處理后,會(huì)返回一個(gè)ModelAndView 5.Dispathcher查詢一個(gè)或多個(gè)ViewResolver視圖解析器,找到ModelAndView對(duì)象指定的視圖對(duì)象 6.視圖對(duì)象負(fù)責(zé)渲染返回給客戶端。為什么用: AOP 讓開(kāi)發(fā)人員可以創(chuàng)建非行為性的關(guān)注點(diǎn),稱為橫切關(guān)注點(diǎn),并將它們插入到應(yīng)用程序代碼中。使用 AOP 后,公共服務(wù) (比 如日志、持久性、事務(wù)等)就可以分解成方面并應(yīng)用到域?qū)ο笊希瑫r(shí)不會(huì)增加域?qū)ο蟮膶?duì)象模型的復(fù)雜性。

IOC 允許創(chuàng)建一個(gè)可以構(gòu)造對(duì)象的應(yīng)用環(huán)境,然后向這些對(duì)象傳遞它們的協(xié)作對(duì)象。正如單詞 倒置 所表明的,IOC 就像反 過(guò)來(lái)的 JNDI。沒(méi)有使用一堆抽象工廠、服務(wù)定位器、單元素(singleton)和直接構(gòu)造(straight construction),每一個(gè)對(duì)象都是用 其協(xié)作對(duì)象構(gòu)造的。因此是由容器管理協(xié)作對(duì)象(collaborator)。

4)Hibernate工作原理及為什么要用? 原理: 1.讀取并解析配置文件 2.讀取并解析映射信息,創(chuàng)建SessionFactory 3.打開(kāi)Sesssion 4.創(chuàng)建事務(wù)Transation 5.持久化操作 6.提交事務(wù) 7.關(guān)閉Session 8.關(guān)閉SesstionFactory為什么要用: 1. 對(duì)JDBC訪問(wèn)數(shù)據(jù)庫(kù)的代碼做了封裝,大大簡(jiǎn)化了數(shù)據(jù)訪問(wèn)層繁瑣的重復(fù)性代碼。2. Hibernate是一個(gè)基于JDBC的主流持久化框架,是一個(gè)優(yōu)秀的ORM實(shí)現(xiàn)。他很大程度的簡(jiǎn)化DAO層的編碼工作3. hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來(lái)實(shí)現(xiàn)透明性。4. hibernate的性能非常好,因?yàn)樗莻€(gè)輕量級(jí)框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫(kù),從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。2. Hibernate是如何延遲加載? 1. Hibernate2延遲加載實(shí)現(xiàn):a)實(shí)體對(duì)象 b)集合(Collection)2. Hibernate3 提供了屬性的延遲加載功能當(dāng)Hibernate在查詢數(shù)據(jù)的時(shí)候,數(shù)據(jù)并沒(méi)有存在與內(nèi)存中,當(dāng)程序真正對(duì)數(shù)據(jù)的操作時(shí),對(duì)象才存在與內(nèi)存中,就實(shí)現(xiàn)了延遲加載,他節(jié)省了服務(wù)器的內(nèi)存開(kāi)銷,從而提高了服務(wù)器的性能。3.Hibernate中怎樣實(shí)現(xiàn)類之間的關(guān)系?(如:一對(duì)多、多對(duì)多的關(guān)系)類與類之間的關(guān)系主要體現(xiàn)在表與表之間的關(guān)系進(jìn)行操作,它們都市對(duì)對(duì)象進(jìn)行操作,我們程序中把所有的表與類都映射在一起,它們通過(guò)配置文件中的many-to-one、one-to-many、many-to-many。

5)Hibernate的一級(jí)緩存與二級(jí)緩存的區(qū)別?

一級(jí)緩存就是Session級(jí)別的緩存,一個(gè)Session做了一個(gè)查詢操作,它會(huì)把這個(gè)操作的結(jié)果放在一級(jí)緩存中,如果短時(shí)間內(nèi)這個(gè)session(一定要同一個(gè)session)又做了同一個(gè)操作,那么hibernate直接從一級(jí)緩存中拿,而不會(huì)再去連數(shù)據(jù)庫(kù),取數(shù)據(jù)。二級(jí)緩存就是SessionFactory級(jí)別的緩存,顧名思義,就是查詢的時(shí)候會(huì)把查詢結(jié)果緩存到二級(jí)緩存中,如果同一個(gè)sessionFactory創(chuàng)建的某個(gè)session執(zhí)行了相同的操作,hibernate就會(huì)從二級(jí)緩存中拿結(jié)果,而不會(huì)再去連接數(shù)據(jù)庫(kù)。(這個(gè)題想簡(jiǎn)答就可以了,但是如果想深入去多問(wèn)幾個(gè)問(wèn)什么這里提供一個(gè)連接,寫得較為詳細(xì):1)

另外一個(gè)關(guān)鍵點(diǎn)是:你要知道什么信息和什么操作,該調(diào)用什么級(jí)別的緩存!

6)如何優(yōu)化Hibernate?(這個(gè)問(wèn)題有些觸及到這個(gè)框架的弱點(diǎn)了,那就得想辦法應(yīng)付)

1.使用雙向一對(duì)多關(guān)聯(lián),不使用單向一對(duì)多 2.靈活使用單向一對(duì)多關(guān)聯(lián) 3.不用一對(duì)一,用多對(duì)一取代 4.配置對(duì)象緩存,不使用集合緩存 5.一對(duì)多集合使用Bag,多對(duì)多集合使用Set 6. 繼承類使用顯式多態(tài) 7. 表字段要少,表關(guān)聯(lián)不要怕多,自己再補(bǔ)充一點(diǎn),上面說(shuō)到的都是關(guān)于數(shù)據(jù)庫(kù)設(shè)計(jì) 帶來(lái)的優(yōu)勢(shì),從而起到優(yōu)化框架的效果,但是真正在實(shí)際操作中,我們只有盡量控制不使用懶加載“l(fā)azy

=true”,如果在涉及的盡量使用Hql語(yǔ)句

7)struts的核心是什么?(參考了這個(gè)回答:2)

FilterDispatcher也是Struts2的核心技術(shù)。FilterDispatcher核心控制器執(zhí)行以下操作:(1)讀取靜態(tài)數(shù)據(jù)信息(2)決定需要轉(zhuǎn)發(fā)或者導(dǎo)航的Action配置(3)創(chuàng)建Action的Context(4)創(chuàng)建Action代理(5)內(nèi)存清理和性能優(yōu)化攔截器:Interceptor 攔截器本身是一個(gè)普通的Java對(duì)象,它能動(dòng)態(tài)攔截Action調(diào)用,在Action執(zhí)行前后執(zhí)行攔截器本身提供的各種個(gè)樣的Web項(xiàng)目需求。 也可以阻止Action的執(zhí)行,同時(shí)也可以提取Action中可以復(fù)用的部分。(1)在Action調(diào)用之前提供系統(tǒng)處理流程邏輯控制(2)和Action交互時(shí),提供Ation執(zhí)行時(shí)的一些初始信息(3)在Action結(jié)束后,一些事后的處理流程邏輯(4)修改Action中返回的Result信息(5)捕獲異常棧是用ognl表達(dá)式存值的最初地方,即一個(gè)存值的棧 自己再補(bǔ)充一點(diǎn):struts的標(biāo)簽庫(kù)也算一個(gè)。

8)ssh 的工作流程(這個(gè)問(wèn)題留作作業(yè),它們之間的相互實(shí)現(xiàn),相互調(diào)用從原理上理解就行了)

java程序員面試時(shí)被問(wèn)到:如何在j2ee項(xiàng)目中處理高并發(fā)量訪問(wèn)? 該怎么回答? 請(qǐng)仔細(xì)看題干再回答

一般需從三點(diǎn)入手。

一、程序本身支持高并發(fā)。

簡(jiǎn)單來(lái)說(shuō)就是要優(yōu)化我們的代碼。

1、避免使用錯(cuò)誤的方式,盡量不用instanceof做條件判斷,不要將數(shù)組聲明為:public static final 。

2、使用java中效率高的類,比如盡量使用HashMap 和ArrayList ,除非必要,否則不推薦使用HashTable和Vector ,后者由于使用同步機(jī)制,而導(dǎo)致了性能的開(kāi)銷。

3、盡量指定類的final修飾符 帶有final修飾符的類是不可派生的。在Java核心API中,有許多應(yīng)用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。另外,如果指定一個(gè)類為final,則該類所有的方法都是final。Java編譯器會(huì)尋找機(jī)會(huì)內(nèi)聯(lián)(inline)所有的final方法(這和具體的編譯器實(shí)現(xiàn)有關(guān))。此舉能夠使性能平均提高50% 。

4、盡量重用對(duì)象,避免頻繁的使用new對(duì)象。對(duì)于整個(gè)應(yīng)用只需要存在一個(gè)實(shí)例的類,我們可以使用單例模式。對(duì)于工具類可以使用靜態(tài)方法的方式訪問(wèn)。

用new關(guān)鍵詞創(chuàng)建類的實(shí)例時(shí),構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會(huì)被自動(dòng)調(diào)用。但如果一個(gè)對(duì)象實(shí)現(xiàn)了Cloneable接口,我們可以調(diào)用它的clone()方法。clone()方法不會(huì)調(diào)用任何類構(gòu)造函數(shù)。

在使用設(shè)計(jì)模式(Design Pattern)的場(chǎng)合,如果用Factory模式創(chuàng)建對(duì)象,則改用clone()方法創(chuàng)建新的對(duì)象實(shí)

例非常簡(jiǎn)單。例如,

Java代碼??收藏代碼

下面是Factory模式的一個(gè)典型實(shí)現(xiàn):???

public?static?Credit?getNewCredit()?{??

return?new?Credit();??

}???

改進(jìn)后的代碼使用clone()方法,如下所示:??

private?static?Credit?BaseCredit?=?new?Credit();??

public?static?Credit?getNewCredit()?{??

return?(Credit)?BaseCredit.clone();??

}

上面的思路對(duì)于數(shù)組處理同樣很有用。

5、特別是String 對(duì)象的使用中,出現(xiàn)字符串連接情況時(shí)應(yīng)用StringBuffer 代替。由于系統(tǒng)不僅要花時(shí)間生成對(duì)象,以后可能還需花時(shí)間對(duì)這些對(duì)象進(jìn)行垃圾回收和處理。因此,生成過(guò)多的對(duì)象將會(huì)給程序的性能帶來(lái)很大的影響。

6、StringBuffer 的使用:StringBuffer表示了可變的、可寫的字符串。

它有三個(gè)構(gòu)造方法 :

StringBuffer?();????????????//默認(rèn)分配16個(gè)字符的空間??

StringBuffer?(int?size);??//分配size個(gè)字符的空間??

StringBuffer?(String?str);??//分配16個(gè)字符+str.length()個(gè)字符空間

你可以通過(guò)StringBuffer的構(gòu)造函數(shù)來(lái)設(shè)定它的初始化容量,這樣可以明顯地提升性能。這里提到的構(gòu)造函數(shù)是StringBuffer(int length),length參數(shù)表示當(dāng)前的StringBuffer能保持的字符數(shù)量。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer對(duì)象創(chuàng)建之后設(shè)置它的容量。首先我們看看StringBuffer的缺省行為,然 后再找出一條更好的提升性能的途徑。

StringBuffer在內(nèi)部維護(hù)一個(gè)字符數(shù)組,當(dāng)你使用缺省的構(gòu)造函數(shù)來(lái)創(chuàng)建StringBuffer對(duì)象的時(shí)候,因?yàn)闆](méi)有設(shè)置初始化字符長(zhǎng)度,StringBuffer的容量被初始化為16個(gè)字符,也就是說(shuō)缺省容量就是16個(gè)字符。當(dāng)StringBuffer達(dá)到最大容量 的時(shí)候,它會(huì)將自身容量增加到當(dāng)前的2倍再加2,也就是(2*舊值+2)。如果你使用缺省值,初始化之后接著往里面追 加字符,在你追加到第16個(gè)字符的時(shí)候它會(huì)將容量增加到34(2*16+2),當(dāng)追加到34個(gè)字符的時(shí)候就會(huì)將容量增加到 70(2*34+2)。無(wú)論何事只要StringBuffer到達(dá)它的最大容量它就不得不創(chuàng)建一個(gè)新的字符數(shù)組然后重新將舊字符和 新字符都拷貝一遍――這也太昂貴了點(diǎn)。所以總是給StringBuffer設(shè)置一個(gè)合理的初始化容量值是錯(cuò)不了的,這樣會(huì)帶來(lái) 立竿見(jiàn)影的性能增益。

StringBuffer初始化過(guò)程的調(diào)整的作用由此可見(jiàn)一斑。所以,使用一個(gè)合適的容量值來(lái)初始化StringBuffer永遠(yuǎn)都是一個(gè)最佳的建議。

7、盡量使用局部變量,調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧(Stack)中,速度較快。其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。另外,依賴于具體的編譯器/JVM,局部變量還可能得到進(jìn)一步優(yōu)化。請(qǐng)參見(jiàn)《盡可能使用堆棧變量》。

8、不要重復(fù)初始化變量 ?默認(rèn)情況下,調(diào)用類的構(gòu)造函數(shù)時(shí), Java會(huì)把變量初始化成確定的值:所有的對(duì)象被設(shè)置成null,整數(shù)變量(byte、short、int、long)設(shè)置成0,float和double變量設(shè)置成0.0,邏輯值設(shè)置成false。當(dāng)一個(gè)類從另一個(gè)類派生時(shí),這一點(diǎn)尤其應(yīng)該注意,因?yàn)橛胣ew關(guān)鍵詞創(chuàng)建一個(gè)對(duì)象時(shí),構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)都會(huì)被自動(dòng)調(diào)用。

9、在JAVA + ORACLE 的應(yīng)用系統(tǒng)開(kāi)發(fā)中,java中內(nèi)嵌的SQL語(yǔ)句盡量使用大寫的形式,以減輕ORACLE解析器的解析負(fù)擔(dān)。

10、Java 編程過(guò)程中,進(jìn)行數(shù)據(jù)庫(kù)連接、I/O流操作時(shí)務(wù)必小心,在使用完畢后,即使關(guān)閉以釋放資源。因?yàn)閷?duì)這些大對(duì)象的操作會(huì)造成系統(tǒng)大的開(kāi)銷,稍有不慎,會(huì)導(dǎo)致嚴(yán)重的后果。

11、由于JVM的有其自身的GC機(jī)制,不需要程序開(kāi)發(fā)者的過(guò)多考慮,從一定程度上減輕了開(kāi)發(fā)者負(fù)擔(dān),但同時(shí)也遺漏了隱患,過(guò)分的創(chuàng)建對(duì)象會(huì)消耗系統(tǒng)的大量?jī)?nèi)存,嚴(yán)重時(shí)會(huì)導(dǎo)致內(nèi)存泄露,因此,保證過(guò)期對(duì)象的及時(shí)回收具有重要意義。JVM回收垃圾的條件是:對(duì)象不在被引用;然而,JVM的GC并非十分的機(jī)智,即使對(duì)象滿足了垃圾回收的條件也不一定會(huì)被立即回收。所以,建議我們?cè)趯?duì)象使用完畢,應(yīng)手動(dòng)置成null。

12、在使用同步機(jī)制時(shí),應(yīng)盡量使用方法同步代替代碼塊同步。

13、盡量減少對(duì)變量的重復(fù)計(jì)算

例如:

for(int?i?=?0;i??list.size;?i?++)?{??

…??

}??

應(yīng)替換為:??

for(int?i?=?0,int?len?=?list.size();i??len;?i?++)?{??

…??

}

14、盡量采用lazy loading 的策略,即在需要的時(shí)候才開(kāi)始創(chuàng)建。

例如:????

String?str?=?“aaa”;??

if(i?==?1)?{??

list.add(str);??

}??

應(yīng)替換為:??

if(i?==?1)?{??

String?str?=?“aaa”;??

list.add(str);??

}

15、慎用異常

異常對(duì)性能不利。拋出異常首先要?jiǎng)?chuàng)建一個(gè)新的對(duì)象。Throwable接口的構(gòu)造函數(shù)調(diào)用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調(diào)用跟蹤信息。只要有異常被拋出,VM就必須調(diào)整調(diào)用堆棧,因?yàn)樵谔幚磉^(guò)程中創(chuàng)建了一個(gè)新的對(duì)象。 異常只能用于錯(cuò)誤處理,不應(yīng)該用來(lái)控制程序流程。

16、不要在循環(huán)中使用try...catch,應(yīng)把其放置在最外層。

17、合理的使用Java類 java.util.Vector。

簡(jiǎn)單地說(shuō),一個(gè)Vector就是一個(gè)java.lang.Object實(shí)例的數(shù)組。Vector與數(shù)組相似,它的元素可以通過(guò)整數(shù)形式的索引訪問(wèn)。但是,Vector類型的對(duì)象在創(chuàng)建之后,對(duì)象的大小能夠根據(jù)元素的增加或者刪除而擴(kuò)展、縮小。請(qǐng)考慮下面這個(gè)向Vector加入元素的例子:

Java代碼??收藏代碼

Object?obj?=?new?Object();??

Vector?v?=?new?Vector(100000);??

for(int?I=0;??

I100000;?I++)?{?v.add(0,obj);?}

當(dāng)前文章:java代碼優(yōu)化面試題 java代碼優(yōu)化技巧
本文URL:http://chinadenli.net/article28/ddihscp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站用戶體驗(yàn)做網(wǎng)站電子商務(wù)外貿(mào)建站網(wǎng)站營(yíng)銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司