Java 阶段面试 知识点合集 - 我们到底能走多远系列(15)
我們到底能走多遠(yuǎn)系列(15)
扯淡:這些知識(shí)點(diǎn)來(lái)源是通過(guò)面試涉及到的,面的公司不多,知識(shí)點(diǎn)涉及也不多,我每次面試后都在備忘錄里寫下有用的東西,集合起來(lái)分享一下,因?yàn)槭侵R(shí)點(diǎn),所以就不出什么面試題目啦。不涉及任何公司,也不談?wù)撁娼?jīng),純粹是學(xué)習(xí)而已。
《我們到底能走多遠(yuǎn)系列》的階段性目標(biāo)已經(jīng)達(dá)到啦,15個(gè),先給自己鼓勵(lì)一下吧。
有目的性學(xué)習(xí)的確會(huì)讓人不偷懶,能讓人在短時(shí)間里努力,自我激勵(lì)的方式很多,每天花點(diǎn)時(shí)間做一件事對(duì)你肯定有幫助,好吧先講一個(gè)故事,口癢了,哈哈。
可能很多朋友都聽過(guò)了,沒(méi)關(guān)系,再聽一遍,你就可以熟練的講給你的朋友們聽了。
從前有兩個(gè)和尚他們分別住在河對(duì)岸的兩個(gè)廟里,每天他們都會(huì)來(lái)河邊打水,每天都會(huì)見面,時(shí)間一長(zhǎng)他們就相當(dāng)于那啥,心靈相通,成了好朋友,但他們誰(shuí)也沒(méi)跨過(guò)河去看望過(guò)對(duì)方。這樣年復(fù)一年,一日,住在東岸的和尚沒(méi)來(lái)打水,西岸的和尚就疑惑了,一天不打水,他喝什么呢?第二天,西岸的和尚還是沒(méi)來(lái),連續(xù)半個(gè)月東岸的和尚都沒(méi)見到西岸的和尚,于是他就想他朋友是不是病了。于是就挑著水去到西岸的廟里,他看到他的朋友一點(diǎn)沒(méi)事,就問(wèn)他:你怎么不來(lái)河里打水了呢,沒(méi)有水,你喝什么呢?西岸的和尚把他朋友領(lǐng)到園子里,指著角落里的一口井說(shuō),這是我挖的一口井,有了井,就不用再去河邊打水了。東岸的和尚又問(wèn)了:我們平時(shí)在廟里怎么忙,幾乎沒(méi)有空閑的時(shí)間,你怎么可能有時(shí)間挖一口井呢?回答:我每天就在那個(gè)地方掘一下,年復(fù)一年,它就成了井。
你在掘你的井嗎?
?
主題:
關(guān)于數(shù)據(jù)結(jié)構(gòu):有不正確的地方或改進(jìn)的地方希望你能指出來(lái),我會(huì)感謝你給我進(jìn)步的機(jī)會(huì)。
1,stack
來(lái)自《Introduction to Algorithms》的圖:
遵循先進(jìn)后出(FILO)的原則,下面是模擬的代碼:
2,queue
來(lái)自《Introduction to Algorithms》的圖:
遵循先進(jìn)先出(FIFO)的原則,下面是模擬的代碼:
代碼使用標(biāo)志符的方式來(lái)控制內(nèi)部的數(shù)組不溢出和為空是不能取出數(shù)據(jù)。
package code.structures;public class Queue {private String[] s;// 用數(shù)組來(lái)模擬private int head; // 隊(duì)列頭private int tail; // 隊(duì)列尾private int length; // 隊(duì)列長(zhǎng)度private boolean isFull; // 滿信號(hào)private boolean isEmpty; // 空信號(hào)public Queue(int index) {this.s = new String[index];this.head = 0;this.tail = 0;length = index;isFull = false;isEmpty = true;}// 放數(shù)據(jù)public boolean enQueue(String str) {if (isFull) { // 已滿的隊(duì)列就不能再放數(shù)據(jù)啦System.out.println("queue is full");return false;}// 放在隊(duì)列的尾部s[tail] = str;tail++; // 移動(dòng)尾部// 頭尾相連if (tail == length) {tail = 0;}// 在放數(shù)據(jù)的時(shí)候出現(xiàn)頭尾相同時(shí),就認(rèn)為是滿了if (head == tail) {isFull = true;}// 因?yàn)槭欠艛?shù)據(jù),所以不可能出現(xiàn)空隊(duì)列if (isEmpty) {isEmpty = false;}return true;}// 拿數(shù)據(jù)public String deQueue() {if (isEmpty) {// 空隊(duì)列就不處理了System.out.println("queue is empty");return null;}// 從頭部取得數(shù)據(jù)String str = s[head];head++;if (head == length) {head = 0;}// 取數(shù)據(jù)的時(shí)候出現(xiàn)頭尾相同,就認(rèn)為出現(xiàn)空隊(duì)列if (head == tail) {isEmpty = true;}// 因?yàn)槭侨?shù)據(jù),所以不可能出現(xiàn)一個(gè)滿隊(duì)列if (isFull) {isFull = false;}return str;}public boolean isEmpty(){return isEmpty;}public boolean isFull(){return isFull;} }3,ArrayList和LinkedList
我們不看他們的源碼,但也有必要知道他們大概的實(shí)現(xiàn)方式:ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。這就是他們區(qū)別的關(guān)鍵之處,我想著相當(dāng)于是一個(gè)數(shù)組和一個(gè)鏈表在比較。
ArrayList基于數(shù)組的,看他的構(gòu)造方法:
public ArrayList(int initialCapacity) {super();if (initialCapacity < 0)throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity// 傳入ArrayList大小,就幫你創(chuàng)建一個(gè)這樣大小的Object數(shù)組this.elementData = (E[])new Object[initialCapacity];}public ArrayList() {this(10);//默認(rèn)的話,就是10大小的數(shù)組}關(guān)于ArrayList的動(dòng)態(tài)數(shù)組的實(shí)現(xiàn),是依靠啦一個(gè)方法:?System.arraycopy方法。
看下面兩個(gè)源碼方法就會(huì)明白:
public void ensureCapacity(int minCapacity) {modCount++;int oldCapacity = elementData.length;if (minCapacity > oldCapacity) {Object oldData[] = elementData;// 新數(shù)組長(zhǎng)度是老數(shù)組的1.5倍int newCapacity = (oldCapacity * 3)/2 + 1;if (newCapacity < minCapacity)newCapacity = minCapacity;// 創(chuàng)建出新的數(shù)組elementData = (E[])new Object[newCapacity];// 把老數(shù)據(jù)拷貝到新數(shù)組里去System.arraycopy(oldData, 0, elementData, 0, size);}}public boolean add(E o) {ensureCapacity(size + 1); // 確定是否需要增長(zhǎng)數(shù)組elementData[size++] = o;return true;}ArrayList的remove方法,決定了它暴露了頻繁刪除數(shù)據(jù)性能不高的原因:
public E remove(int index) {RangeCheck(index);modCount++;E oldValue = elementData[index];//刪除的數(shù)據(jù)作為返回值int numMoved = size - index - 1;if (numMoved > 0)// 用一個(gè)自我拷貝,移動(dòng)了刪除點(diǎn)后的全部數(shù)據(jù),所以會(huì)影響效率System.arraycopy(elementData, index+1, elementData, index,numMoved);// copy數(shù)據(jù)后,最后一位的數(shù)據(jù)還在,需要把它刪除elementData[--size] = null; // Let gc do its workreturn oldValue;}而LinkedList是基于列表的,它的remove只需要斷開一個(gè)連接,連上一個(gè)連接,無(wú)論我們刪除那一個(gè)數(shù)據(jù)需要的時(shí)間是相同的。但是考慮到LinkedList的檢索需要更多的時(shí)間因?yàn)?#xff0c;最差的結(jié)果里,需啊喲遍歷整個(gè)Link。
所以:
1.對(duì)于隨機(jī)訪問(wèn)get和set,ArrayList覺(jué)得優(yōu)于LinkedList。
2.對(duì)于新增和刪除操作add和remove,LinedList比較占優(yōu)勢(shì)。
3.若只對(duì)單條數(shù)據(jù)插入或刪除,ArrayList的速度反而優(yōu)于 LinkedList。但若是批量隨機(jī)的插入刪除數(shù)據(jù),LinkedList的速度大大優(yōu)于ArrayList.
?
3.HashMap和HashTable
1.HashMap 線程非安全 null可為key
2.HashTable 線程安全 null不可為key
3.HashTable有一個(gè)contains(Object value),功能和containsValue(Object value)功能一樣。
?
4.SQL基礎(chǔ)幾點(diǎn)
1,case語(yǔ)句的使用
select classId, count(case when sex = "男" then 1 end) from Test group by classTd;2,group by :
select后面的所有列中,沒(méi)有使用聚合函數(shù)的列,必須使用group by!
3,having:
篩選滿足條件的組,條件經(jīng)常包含聚合組函數(shù).
4,left join 相當(dāng)于 left out join ,right join 相當(dāng)于 right out join 也就是說(shuō)什么外連接就是左連接和右連接嘛(不知道準(zhǔn)不準(zhǔn)確),join 相當(dāng)于 inner join。
還有個(gè)full join,鏈表全部需要查出來(lái)嘛。
left join和right join相當(dāng)于是求有交集的兩個(gè)集合的一個(gè)集合的值。
inner join相當(dāng)于是純粹的交集。
full join 你懂的還剩下并集。
5,代碼規(guī)范
可讀性:代碼是否可讀易讀,對(duì)于一個(gè)團(tuán)隊(duì)來(lái)說(shuō),編碼標(biāo)準(zhǔn)是否一致,編碼風(fēng)格是否一致;
?功能性:代碼正確得實(shí)現(xiàn)了業(yè)務(wù)邏輯;
?可維護(hù)性:代碼邏輯是有層次的,是容易修改的;
?高效性:代碼實(shí)現(xiàn)在時(shí)間和空間的使用上是高效的;
?
就這么多吧,sql方面還有很多需要學(xué)習(xí)的地方,發(fā)現(xiàn)以前寫的出的sql現(xiàn)在覺(jué)得很困難了,各位,有沒(méi)有學(xué)習(xí)提高sql的方法,或推薦的書。以前系統(tǒng)學(xué)過(guò)sql后幾個(gè)月沒(méi)用,就一下生疏了,然后重復(fù)撿起來(lái),再生疏,難點(diǎn)復(fù)雜點(diǎn)的sql頭緒會(huì)很亂,有好的訓(xùn)練方法嗎?
?
讓我們繼續(xù)前行
----------------------------------------------------------------------
?
努力不一定成功,但不努力肯定不會(huì)成功。
共勉
轉(zhuǎn)載于:https://www.cnblogs.com/killbug/archive/2012/11/13/2769017.html
總結(jié)
以上是生活随笔為你收集整理的Java 阶段面试 知识点合集 - 我们到底能走多远系列(15)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java中截取文件名不要后缀
- 下一篇: 【ASP.NET Web API教程】3