阿里、華為、騰訊java技術(shù)面試題精選,具體內(nèi)容如下
jvm的類加載機(jī)制是什么?有哪些實(shí)現(xiàn)方式?
類加載機(jī)制:
類的加載指的是將類的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中,將其放在運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法去內(nèi),然后在堆區(qū)創(chuàng)建一個(gè)java.lang.class對(duì)象,用來封裝在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)。類的加載最終是在堆區(qū)內(nèi)的class對(duì)象,class對(duì)象封裝了類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu),并且向java程序員提供了訪問方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)的接口。
類加載有三種方式:
1)命令行啟動(dòng)應(yīng)用時(shí)候由jvm初始化加載
2)通過class.forname()方法動(dòng)態(tài)加載
3)通過classloader.loadclass()方法動(dòng)態(tài)加載
jvm的常見垃圾回收算法?
1)標(biāo)記-清楚算法:前后線標(biāo)記處所有需要回收的對(duì)象,在標(biāo)記完成后統(tǒng)一回收有被標(biāo)記的對(duì)象。
2)復(fù)制算法:將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當(dāng)一塊內(nèi)存用完了,將其存在另外一塊上面,然后再把已使用過的內(nèi)存空間一次清理掉。
3)標(biāo)記-整理算法:標(biāo)記過程與“標(biāo)記-清除”算法一樣,但后續(xù)步驟不是直接對(duì)可回收對(duì)象進(jìn)行清理,而是讓所一端移動(dòng),然后直接清理掉端邊界以外的內(nèi)存。
4)分代收集算法:一般是把java堆分為新生代和老年代,根據(jù)各個(gè)年代的特點(diǎn)采用最適當(dāng)?shù)氖占惴āP律及l(fā)現(xiàn)有大批對(duì)象死去,選用復(fù)制算法。老年代中因?yàn)閷?duì)象存活率高,必須使用“標(biāo)記-清理”或“標(biāo)記-整理”算法來進(jìn)行回收。
jvm調(diào)優(yōu)的常見命令行工具有哪些?jvm常見的調(diào)優(yōu)參數(shù)有哪些?
(1)jvm調(diào)優(yōu)的常見命令工具包括:
1)jps命令用于查詢正在運(yùn)行的jvm進(jìn)程,
2)jstat可以實(shí)時(shí)顯示本地或遠(yuǎn)程jvm進(jìn)程中類裝載、內(nèi)存、垃圾收集、jit編譯等數(shù)據(jù)
3)jinfo用于查詢當(dāng)前運(yùn)行這的jvm屬性和參數(shù)的值。
4)jmap用于顯示當(dāng)前java堆和永久代的詳細(xì)信息
5)jhat用于分析使用jmap生成的dump文件,是jdk自帶的工具
6)jstack用于生成當(dāng)前jvm的所有線程快照,線程快照是虛擬機(jī)每一條線程正在執(zhí)行的方法,目的是定位線程出現(xiàn)長時(shí)間停頓的原因。
(2)jvm常見的調(diào)優(yōu)參數(shù)包括:
-xmx
指定java程序的最大堆內(nèi)存, 使用java -xmx5000m -version判斷當(dāng)前系統(tǒng)能分配的最大堆內(nèi)存
-xms
指定最小堆內(nèi)存, 通常設(shè)置成跟最大堆內(nèi)存一樣,減少gc
-xmn
設(shè)置年輕代大小。整個(gè)堆大小=年輕代大小 + 年老代大小。所以增大年輕代后,將會(huì)減小年老代大小。此值對(duì)系統(tǒng)性能影響較大,sun官方推薦配置為整個(gè)堆的3/8。
-xss
指定線程的最大棧空間, 此參數(shù)決定了java函數(shù)調(diào)用的深度, 值越大調(diào)用深度越深, 若值太小則容易出棧溢出錯(cuò)誤(stackoverflowerror)
-xx:permsize
指定方法區(qū)(永久區(qū))的初始值,默認(rèn)是物理內(nèi)存的1/64, 在java8永久區(qū)移除, 代之的是元數(shù)據(jù)區(qū), 由-xx:metaspacesize指定
-xx:maxpermsize
指定方法區(qū)的最大值, 默認(rèn)是物理內(nèi)存的1/4, 在java8中由-xx:maxmetaspacesize指定元數(shù)據(jù)區(qū)的大小
-xx:newratio=n
年老代與年輕代的比值,-xx:newratio=2, 表示年老代與年輕代的比值為2:1
-xx:survivorratio=n
eden區(qū)與survivor區(qū)的大小比值,-xx:survivorratio=8表示eden區(qū)與survivor區(qū)的大小比值是8:1:1,因?yàn)閟urvivor區(qū)有兩個(gè)(from, to)
concurrenthashmap加鎖機(jī)制是什么,詳細(xì)說一下?
hashtable容器在競(jìng)爭(zhēng)激烈的并發(fā)環(huán)境下表現(xiàn)出效率低下的原因,是因?yàn)樗性L問hashtable的線程都必須競(jìng)爭(zhēng)同一把鎖,那假如容器里有多把鎖,每一把鎖用于鎖容器其中一部分?jǐn)?shù)據(jù),那么當(dāng)多線程訪問容器里不同數(shù)據(jù)段的數(shù)據(jù)時(shí),線程間就不會(huì)存在鎖競(jìng)爭(zhēng),從而可以有效的提高并發(fā)訪問效率,這就是concurrenthashmap所使用的鎖分段技術(shù),首先將數(shù)據(jù)分成一段一段的存儲(chǔ),然后給每一段數(shù)據(jù)配一把鎖,當(dāng)一個(gè)線程占用鎖訪問其中一個(gè)段數(shù)據(jù)的時(shí)候,其他段的數(shù)據(jù)也能被其他線程訪問。
g1收集器簡(jiǎn)介?以及它的內(nèi)存劃分怎么樣的?
(1)簡(jiǎn)介:
garbage-first(g1,垃圾優(yōu)先)收集器是服務(wù)類型的收集器,目標(biāo)是多處理器機(jī)器、大內(nèi)存機(jī)器。它高度符合垃圾收集暫停時(shí)間的目標(biāo),同時(shí)實(shí)現(xiàn)高吞吐量。oracle jdk 7 update 4 以及更新發(fā)布版完全支持g1垃圾收集器
(2)g1的內(nèi)存劃分方式:
它是將堆內(nèi)存被劃分為多個(gè)大小相等的 heap 區(qū),每個(gè)heap區(qū)都是邏輯上連續(xù)的一段內(nèi)存(virtual memory). 其中一部分區(qū)域被當(dāng)成老一代收集器相同的角色(eden, survivor, old), 但每個(gè)角色的區(qū)域個(gè)數(shù)都不是固定的。這在內(nèi)存使用上提供了更多的靈活性
在重寫equals方法時(shí),需要遵循哪些約定,具體介紹一下?
重寫equals方法時(shí)需要遵循通用約定:自反性、對(duì)稱性、傳遞性、一致性.、非空性
1)自反性
對(duì)于任何非null的引用值x,x.equals(x)必須返回true。---這一點(diǎn)基本上不會(huì)有啥問題
2)對(duì)稱性
對(duì)于任何非null的引用值x和y,當(dāng)且僅當(dāng)x.equals(y)為true時(shí),y.equals(x)也為true。
3)傳遞性
對(duì)于任何非null的引用值x、y、z。如果x.equals(y)==true,y.equals(z)==true,那么x.equals(z)==true。
4) 一致性
對(duì)于任何非null的引用值x和y,只要equals的比較操作在對(duì)象所用的信息沒有被修改,那么多次調(diào)用x.eqals(y)就會(huì)一致性地返回true,或者一致性的返回false。
5)非空性
所有比較的對(duì)象都不能為空。
synchronized優(yōu)化后的鎖機(jī)制簡(jiǎn)單介紹一下,包括自旋鎖、偏向鎖、輕量級(jí)鎖、重量級(jí)鎖?
自旋鎖:
線程自旋說白了就是讓cup在做無用功,比如:可以執(zhí)行幾次for循環(huán),可以執(zhí)行幾條空的匯編指令,目的是占著cpu不放,等待獲取鎖的機(jī)會(huì)。如果旋的時(shí)間過長會(huì)影響整體性能,時(shí)間過短又達(dá)不到延遲阻塞的目的。
偏向鎖
偏向鎖就是一旦線程第一次獲得了監(jiān)視對(duì)象,之后讓監(jiān)視對(duì)象“偏向”這個(gè)線程,之后的多次調(diào)用則可以避免cas操作,
說白了就是置個(gè)變量,如果發(fā)現(xiàn)為true則無需再走各種加鎖/解鎖流程。
輕量級(jí)鎖:
輕量級(jí)鎖是由偏向所升級(jí)來的,偏向鎖運(yùn)行在一個(gè)線程進(jìn)入同步塊的情況下,當(dāng)?shù)诙€(gè)線程加入鎖爭(zhēng)用的時(shí)候,偏向鎖就會(huì)升級(jí)為輕量級(jí)鎖;
重量級(jí)鎖
重量鎖在jvm中又叫對(duì)象監(jiān)視器(monitor),它很像c中的mutex,除了具備mutex(0|1)互斥的功能,它還負(fù)責(zé)實(shí)現(xiàn)了semaphore(信號(hào)量)的功能,也就是說它至少包含一個(gè)競(jìng)爭(zhēng)鎖的隊(duì)列,和一個(gè)信號(hào)阻塞隊(duì)列(wait隊(duì)列),前者負(fù)責(zé)做互斥,后一個(gè)用于做線程同步。
偏向鎖、輕量級(jí)鎖、重量級(jí)鎖的對(duì)比:
redis和memcache區(qū)別對(duì)比?如何選擇這兩個(gè)技術(shù)?
區(qū)別:
1) redis和memcache都是將數(shù)據(jù)存放在內(nèi)存中,都是內(nèi)存數(shù)據(jù)庫。不過memcache還可用于緩存其他東西,例如圖片、視頻等等。
2)redis不僅僅支持簡(jiǎn)單的k/v類型的數(shù)據(jù),同時(shí)還提供list,set,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
3)虛擬內(nèi)存--redis當(dāng)物理內(nèi)存用完時(shí),可以將一些很久沒用到的value 交換到磁盤
4)過期策略--memcache在set時(shí)就指定,例如set key1 0 0 8,即永不過期。redis可以通過例如expire 設(shè)定,例如expire name 10
5)分布式--設(shè)定memcache集群,利用magent做一主多從;redis可以做一主多從。都可以一主一從
6)存儲(chǔ)數(shù)據(jù)安全--memcache掛掉后,數(shù)據(jù)沒了;redis可以定期保存到磁盤(持久化)
7)災(zāi)難恢復(fù)--memcache掛掉后,數(shù)據(jù)不可恢復(fù); redis數(shù)據(jù)丟失后可以通過aof恢復(fù)
8)redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
選型:
若是簡(jiǎn)單的存取key-value這樣的數(shù)據(jù)用memcache好一些
若是要支持?jǐn)?shù)據(jù)持久化,多數(shù)據(jù)類型(如集合、散列之類的),用列表類型做隊(duì)列之類的高級(jí)應(yīng)用,就用redis
redis的持久化機(jī)制是什么?各自的優(yōu)缺點(diǎn)?
redis提供兩種持久化機(jī)制rdb和aof機(jī)制。
1)rdb持久化方式:
是指用數(shù)據(jù)集快照的方式記錄redis數(shù)據(jù)庫的所有鍵值對(duì)。
優(yōu)點(diǎn):
1.只有一個(gè)文件dump.rdb,方便持久化。
2.容災(zāi)性好,一個(gè)文件可以保存到安全的磁盤。
3.性能最大化,fork子進(jìn)程來完成寫操作,讓主進(jìn)程繼續(xù)處理命令,所以是io最大化。
4.相對(duì)于數(shù)據(jù)集大時(shí),比aof的啟動(dòng)效率更高。
缺點(diǎn):
1.數(shù)據(jù)安全性低。
2)aof持久化方式:
是指所有的命令行記錄以redis命令請(qǐng)求協(xié)議的格式保存為aof文件。
優(yōu)點(diǎn):
1.數(shù)據(jù)安全,aof持久化可以配置appendfsync屬性,有always,每進(jìn)行一次命令操作就記錄到aof文件中一次。
2.通過append模式寫文件,即使中途服務(wù)器宕機(jī),可以通過redis-check-aof工具解決數(shù)據(jù)一致性問題。
3.aof機(jī)制的rewrite模式。
缺點(diǎn):
1.文件會(huì)比rdb形式的文件大。
2.數(shù)據(jù)集大的時(shí)候,比rdb啟動(dòng)效率低。
mysql的數(shù)據(jù)庫表鎖、行鎖、頁級(jí)鎖?
表級(jí),直接鎖定整張表,在你鎖定期間,其它進(jìn)程無法對(duì)該表進(jìn)行寫操作。如果你是寫鎖,則其它進(jìn)程則讀也不允許
行級(jí),,僅對(duì)指定的記錄進(jìn)行加鎖,這樣其它進(jìn)程還是可以對(duì)同一個(gè)表中的其它記錄進(jìn)行操作。
頁級(jí),表級(jí)鎖速度快,但沖突多,行級(jí)沖突少,但速度慢。所以取了折衷的頁級(jí),一次鎖定相鄰的一組記錄。
數(shù)據(jù)庫的四大特征,數(shù)據(jù)庫的隔離級(jí)別?
數(shù)據(jù)庫的四大特征:
(1)原子性(atomicity)
原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾。
(2)一致性(consistency)
一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。
(3)隔離性(isolation)
隔離性是當(dāng)多個(gè)用戶并發(fā)訪問數(shù)據(jù)庫時(shí),比如操作同一張表時(shí),數(shù)據(jù)庫為每一個(gè)用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個(gè)并發(fā)事務(wù)之間要相互隔離。
4)持久性(durability)
持久性是指一個(gè)事務(wù)一旦被提交了,那么對(duì)數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的。
數(shù)據(jù)庫的隔離級(jí)別:
1)serializable (串行化):可避免臟讀、不可重復(fù)讀、幻讀的發(fā)生。2)repeatable read (可重復(fù)讀):可避免臟讀、不可重復(fù)讀的發(fā)生。3)read committed (讀已提交):可避免臟讀的發(fā)生。4)read uncommitted (讀未提交):最低級(jí)別,任何情況都無法保證。
set集合從原理上如何保證不重復(fù)
1)在往set中添加元素時(shí),如果指定元素不存在,則添加成功。也就是說,如果set中不存在(e==null ? e1==null : e.queals(e1))的元素e1,則e1能添加到set中。
2)具體來講:當(dāng)向hashset中添加元素的時(shí)候,首先計(jì)算元素的hashcode值,然后用這個(gè)(元素的hashcode)%(hashmap集合的大小)+1計(jì)算出這個(gè)元素的存儲(chǔ)位置,如果這個(gè)位置位空,就將元素添加進(jìn)去;如果不為空,則用equals方法比較元素是否相等,相等就不添加,否則找一個(gè)空位添加。
hashmap和hashtable的主要區(qū)別是什么?,兩者底層實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)是什么?
hashmap和hashtable的區(qū)別:
二者都實(shí)現(xiàn)了map 接口,是將惟一鍵映射到特定的值上;主要區(qū)別在于:
1)hashmap 沒有排序,允許一個(gè)null 鍵和多個(gè)null 值,而hashtable 不允許;
2)hashmap 把hashtable 的contains 方法去掉了,改成containsvalue 和
containskey,因?yàn)閏ontains 方法容易讓人引起誤解;
3)hashtable 繼承自dictionary 類,hashmap 是java1.2 引進(jìn)的map 接口的實(shí)現(xiàn);
4)hashtable 的方法是synchronize 的,而hashmap 不是,在多個(gè)線程訪問hashtable 時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而hashmap 就必須為之提供外同步。hashtable 和hashmap 采用的hash/rehash 算法大致一樣,所以性能不會(huì)有很大的差異。
hashmap和hashtable的底層實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu):
hashmap和hashtable的底層實(shí)現(xiàn)都是數(shù)組+鏈表結(jié)構(gòu)實(shí)現(xiàn)的
hashmap何時(shí)擴(kuò)容,擴(kuò)容的算法是什么?
hashmap何時(shí)擴(kuò)容:
當(dāng)向容器添加元素的時(shí)候,會(huì)判斷當(dāng)前容器的元素個(gè)數(shù),如果大于等于閾值---即當(dāng)前數(shù)組的長度乘以加載因子的值的時(shí)候,就要自動(dòng)擴(kuò)容
擴(kuò)容的算法是什么:
擴(kuò)容(resize)就是重新計(jì)算容量,向hashmap對(duì)象里不停的添加元素,而hashmap對(duì)象內(nèi)部的數(shù)組無法裝載更多的元素時(shí),對(duì)象就需要擴(kuò)大數(shù)組的長度,以便能裝入更多的元素。當(dāng)然java里的數(shù)組是無法自動(dòng)擴(kuò)容的,方法是使用一個(gè)新的數(shù)組代替已有的容量小的數(shù)組
java的虛擬機(jī)jvm的兩個(gè)內(nèi)存:棧內(nèi)存和堆內(nèi)存的區(qū)別是什么?
java把內(nèi)存劃分成兩種:一種是棧內(nèi)存,一種是堆內(nèi)存。兩者的區(qū)別是:
1)棧內(nèi)存:在函數(shù)中定義的一些基本類型的變量和對(duì)象的引用變量都在函數(shù)的棧內(nèi)存中分配。 當(dāng)在一段代碼塊定義一個(gè)變量時(shí),java就在棧中為這個(gè)變量分配內(nèi)存空間,當(dāng)超過變量的作用域后,java會(huì)自動(dòng)釋放掉為該變量所分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作他用。
2)堆內(nèi)存:堆內(nèi)存用來存放由new創(chuàng)建的對(duì)象和數(shù)組。在堆中分配的內(nèi)存,由java虛擬機(jī)的自動(dòng)垃圾回收器來管理。
java中對(duì)異常是如何進(jìn)行分類的?
異常整體分類:
1)java異常結(jié)構(gòu)中定義有throwable類。 exception和error為其子類。
2)其中exception表示由于網(wǎng)絡(luò)故障、文件損壞、設(shè)備錯(cuò)誤、用戶輸入非法情況導(dǎo)致的異常;
3)而error標(biāo)識(shí)java運(yùn)行時(shí)環(huán)境出現(xiàn)的錯(cuò)誤,例如:jvm內(nèi)存耗盡。
數(shù)據(jù)庫設(shè)計(jì)中常講的三范式是指什么?
1)第一范式1nf(域的原子性)
如果數(shù)據(jù)庫表中的所有字段值都是不可分解的原子值,就說明該數(shù)據(jù)庫表滿足了第一范式
2)第二范式2nf(表中除主鍵外的字段都完全依賴主鍵)
第二范式是在第一范式基礎(chǔ)上建立的。第二范式有兩個(gè)重點(diǎn):(1)表中必須有主鍵;(2)其他非主屬性必須完全依賴主鍵,不能只依賴主鍵的一部分(主要針對(duì)聯(lián)合主鍵而言)。
3)第三范式3nf(表中除主鍵外的字段都完全直接依賴,不能是傳遞依賴)
不能是傳遞依賴,即不能存在:非主鍵列 a 依賴于非主鍵列 b,非主鍵列 b 依賴于主鍵的情況。第二范式和第三范式區(qū)分的關(guān)鍵點(diǎn):2nf:非主鍵列是否完全依賴于主鍵,還是依賴于主鍵的一部分;3nf:非主鍵列是直接依賴于主鍵,還是直接依賴于非主鍵列。
java中的線程池共有幾種?
java四種線程池
第一種:newcachedthreadpool
創(chuàng)建一個(gè)可根據(jù)需要?jiǎng)?chuàng)建新線程的線程池,但是在以前構(gòu)造的線程可用時(shí)將重用它們。
第二種:newfixedthreadpool
創(chuàng)建一個(gè)指定工作線程數(shù)量的線程池
第三種:newscheduledthreadpool
創(chuàng)建一個(gè)線程池,它可安排在給定延遲后運(yùn)行命令或者定期地執(zhí)行。
第四種:newsinglethreadexecutor
創(chuàng)建一個(gè)使用單個(gè) worker 線程的 executor,以無界隊(duì)列方式來運(yùn)行該線程。
volatile和synchronized區(qū)別
volatile和synchronized簡(jiǎn)介:
在java中,為了保證多線程讀寫數(shù)據(jù)時(shí)保證數(shù)據(jù)的一致性,可以采用兩種方式:
1)使用synchronized關(guān)鍵字
2)使用volatile關(guān)鍵字:用一句話概括volatile,它能夠使變量在值發(fā)生改變時(shí)能盡快地讓其他線程知道。
兩者的區(qū)別:
1)volatile本質(zhì)是在告訴jvm當(dāng)前變量在寄存器中的值是不確定的,需要從主存中讀取,synchronized則是鎖定當(dāng)前變量,只有當(dāng)前線程可以訪問該變量,其他線程被阻塞住.
2)volatile僅能使用在變量級(jí)別,synchronized則可以使用在變量,方法.
3)volatile僅能實(shí)現(xiàn)變量的修改可見性,而synchronized則可以保證變量的修改可見性和原子性.
4)volatile不會(huì)造成線程的阻塞,而synchronized可能會(huì)造成線程的阻塞.
spring的特性
1.方便解耦,簡(jiǎn)化開發(fā)
通過spring提供的ioc容器,我們可以將對(duì)象之間的依賴關(guān)系交由spring進(jìn)行控制,避免硬編碼所造成的過度程序耦合。
2.aop編程的支持
通過spring提供的aop功能,方便進(jìn)行面向切面的編程。
3.聲明事物的支持
在spring中,我們可以從單調(diào)煩悶的事務(wù)管理代碼中解脫出來,通過聲明式方式靈活地進(jìn)行事務(wù)的管理,提高開發(fā)效率和質(zhì)量。
4.方便程序的測(cè)試
可以用非容器依賴的編程方式進(jìn)行幾乎所有的測(cè)試工作。例如:spring對(duì)junit4支持,可以通過注解方便的測(cè)試spring程序。
5.方便集成各種優(yōu)秀框架
spring不排斥各種優(yōu)秀的開源框架,相反,spring可以降低各種框架的使用難度,spring提供了對(duì)各種優(yōu)秀框架(如struts,hibernate、hessian、quartz)等的直接支持。
6.降低java ee api的使用難度
spring對(duì)很多難用的java ee api(如jdbc,javamail,遠(yuǎn)程調(diào)用等)提供了一個(gè)薄薄的封裝層,通過spring的簡(jiǎn)易封裝,這些java ee api的使用難度大為降低。
spring aop的應(yīng)用場(chǎng)景:
aop用來封裝橫切關(guān)注點(diǎn),具體可以在下面的場(chǎng)景中使用
authentication 權(quán)限
caching 緩存
context passing 內(nèi)容傳遞
error handling 錯(cuò)誤處理
lazy loading 懶加載
debugging 調(diào)試
logging, tracing, profiling and monitoring 記錄跟蹤 優(yōu)化 校準(zhǔn)
performance optimization 性能優(yōu)化
persistence 持久化
resource pooling 資源池
synchronization 同步
transactions 事務(wù)
mybaits中#和$區(qū)別
1)${}是properties文件中的變量占位符,它可以用于標(biāo)簽屬性值和sql內(nèi)部,屬于靜態(tài)文本替換,比如${driver}會(huì)被靜態(tài)替換為com.mysql.jdbc.driver。
2)#{}是sql的參數(shù)占位符,mybatis會(huì)將sql中的#{}替換為?號(hào),在sql執(zhí)行前會(huì)使用preparedstatement的參數(shù)設(shè)置方法,按序給sql的?號(hào)占位符設(shè)置參數(shù)值,比如ps.setint(0, parametervalue),#{item.name}的取值方式為使用反射從參數(shù)對(duì)象中獲取item對(duì)象的name屬性值,相當(dāng)于param.getitem().getname()。
排序都有哪幾種方法?請(qǐng)列舉。用java 實(shí)現(xiàn)一個(gè)快速排序。
排序的方法有:
插入排序(直接插入排序、希爾排序),交換排序(冒泡排序、快速排序),選擇排序(直接選擇排序、堆排序),歸并排序,分配排序(箱排序、基數(shù)排序);
快速排序的偽代碼:
//使用快速排序方法對(duì)a[ 0 :n- 1 ]排序
從a[ 0 :n- 1 ]中選擇一個(gè)元素作為middle,該元素為支點(diǎn);
把余下的元素分割為兩段left 和right,使得left 中的元素都小于等于支點(diǎn),
而right 中的元素都大于等于支點(diǎn);
遞歸地使用快速排序方法對(duì)left 進(jìn)行排序;
遞歸地使用快速排序方法對(duì)right 進(jìn)行排序;
所得結(jié)果為left + middle + right。
快速排序的java代碼實(shí)現(xiàn)如下:
相關(guān)閱讀:java簡(jiǎn)單快速排序?qū)嵗馕?/a>
來自:互聯(lián)網(wǎng)IT技術(shù)分享
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。