面試題(一)北京巨集林

qq_33148349發表於2018-08-04

今天去面試,有很多不會的地方,總結出來以方便自己以後的複習。
問答題:
一..抽象類和介面的區別;
1 .介面只能包含抽象方法,抽象類可以包含普通方法。
2. 介面只能定義靜態常量屬性,抽象類既可以定義普通屬性,也可以定義靜態常量屬性。
3 .介面不包含構造方法,抽象類裡可以包含構造方法。
4.抽象類不能被例項化,但不代表它不可以有建構函式,抽象類可以有建構函式,備繼承類擴充
5.介面是核心,其定義了要做的事情,包含了許多的方法,但沒有定義這些方法應該如何做。
6. 如果許多類實現了某個介面,那麼每個都要用程式碼實現那些方法
7.如果某一些類的實現有共通之處,則可以抽象出來一個抽象類,讓抽象類實現介面的公用的程式碼,而那些個性化的方法則由各個子類去實現。
所以,抽象類是為了簡化介面的實現,他不僅提供了公共方法的實現,讓你可以快速開發,又允許你的類完全可以自己實現所有的方法,不會出現緊耦合的問題。
二、闡述arrayList、vector.LinkedList的儲存效能和特性。
ArrayList 和Vector他們底層的實現都是一樣的,都是使用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及陣列元素移動等記憶體操作,所以索引資料快而插入資料慢。
Vector中的方法由於新增了synchronized修飾,因此Vector是執行緒安全的容器,但效能上較ArrayList差,因此已經是Java中的遺留容器。
LinkedList使用雙向連結串列實現儲存(將記憶體中零散的記憶體單元通過附加的引用關聯起來,形成一個可以按序號索引的線性結構,這種鏈式儲存方式與陣列的連續儲存方式相比,記憶體的利用率更高),按序號索引資料需要進行前向或後向遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入速度較快。
Vector屬於遺留容器(Java早期的版本中提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties都是遺留容器),已經不推薦使用,但是由於ArrayList和LinkedListed都是非執行緒安全的,如果遇到多個執行緒操作同一個容器的場景,則可以通過工具類Collections中的synchronizedList方法將其轉換成執行緒安全的容器後再使用(這是對裝潢模式的應用,將已有物件傳入另一個類的構造器中建立新的物件來增強實現)。
三、實現執行緒有幾種方式。
有四種方式。
四、Session,Cookie的區別
答案如下
程式設計題
1.對於一個有序陣列,我們通常採用二分查詢的方式來定位某一元素,請編寫二分查詢的演算法,在陣列中查詢指定元素。

鏈:https://www.nowcoder.com/questionTerminal/78758d46ebf4492690262d2c6f809a7f?toCommentId=386378

//Java.
public class Solution{
//if not found, return -1;
public int binary_search(int[] array, int n){
if (array == null || array.length < 1)
return -1; //不需要尋找.
int top = 0, button = array.length - 1;
while (top <= button){
int mid = top + (button - top) / 2;
if (n < array[mid]){ //n在陣列左邊.
button = mid - 1;
}else if (n > array[mid]){ //n在陣列右邊.
top = mid + 1;
}else {
return mid; //find.
}
}
}
}

對於一個字串,請設計一個高效演算法,找到第一次重複出現的字元。

#!/usr/bin/env python3

def find_str_repeat(s):
        d = {}
        for i in range(len(s)):
                if d.get(s[i]):
                        return s[i]
                else:
                        d[s[i]]= i
        return False

def find_str_repeat1(s):
        d = {}
        for i in s:
                if d.get(i):
                        return i
                else:
                        d[i] = i
        return False

if __name__ == "__main__":
        s = "qywyer23tdd"
        print(find_str_repeat(s))
        print(find_str_repeat1(s))

JAVA實現一種排序
連結
寫一個Singleton出來
class Singleton {
private static Singleton s;
private Singleton(){
System.out.println(“A Singleton Model example”);
}
public static Singleton getSigleton()
{
if(s==null)s=new Singleton();
return s;
}
}

資料庫相關
一.儲存過程和函式的區別
本質上沒區別。只是函式有如:只能返回一個變數的限制。而儲存過程可以返回多個。而函式是可以嵌入在sql中使用的,可以在select中呼叫,而儲存過程不行。執行的本質都一樣。
函式限制比較多,比如不能用臨時表,只能用表變數.還有一些函式都不可用等等.而儲存過程的限制相對就比較少
1. 一般來說,儲存過程實現的功能要複雜一點,而函式的實現的功能針對性比較強。
2. 對於儲存過程來說可以返回引數,而函式只能返回值或者表物件。
3. 儲存過程一般是作為一個獨立的部分來執行(EXEC執行),而函式可以作為查詢語句的一個部分來呼叫(SELECT呼叫),由於函式可以返回一個表物件,因此它可以在查詢語句中位於FROM關鍵字的後面。
4. 當儲存過程和函式被執行的時候,SQL Manager會到procedure cache中去取相應的查詢語句,如果在procedure cache裡沒有相應的查詢語句,SQL Manager就會對儲存過程和函式進行編譯。
Procedure cache中儲存的是執行計劃 (execution plan) ,當編譯好之後就執行procedure cache中的execution plan,之後SQL SERVER會根據每個execution plan的實際情況來考慮是否要在cache中儲存這個plan,評判的標準一個是這個execution plan可能被使用的頻率;其次是生成這個plan的代價,也就是編譯的耗時。儲存在cache中的plan在下次執行時就不用再編譯了。
二、oracle中truncate和delete命令有何區別?
lianjie :
三、Oracle中Char和varchar2資料型別有什麼區別?有資料“test”分別存放到char(10)和vchar2(10)的欄位中,其儲存長度有何區別?
char是定長字元型別,而varchar是變長字元型別。
有資料”test”分別存放到char(10)和varchar2(10)型別的欄位中,其儲存長度及型別?
用char(10)進行儲存時,儲存被補齊10個空格,其長度為10個位元組,而varchar2的儲存長度為4個位元組
四,寫出你最常用SQL語句的關鍵字
aa

相關文章