1. 程式人生 > >今天開始整理面試和以前學的java等知識點和題目2018-9-20

今天開始整理面試和以前學的java等知識點和題目2018-9-20

2.求n階層

方法一:for迴圈

方法二;遞迴

public class Factorail {          /**      * 求5的階乘? 5*4*3*2*1 = ?      */    public static int test(int number){        if(number == 1){            return 1;        }else{            return number * test(number - 1);        }            }     public static void main(String[] args) {          System.out.println(test(5));     } }

3.水仙花數

4.java抽象類與介面的區別

5.JAVA執行緒同步的方法

6.JAVA氣泡排序

public static void bubbleSort(int []arr) {

int[] arr = {12,23,34,56,56,56,78};

for(int i =0;i<arr.length-1;i++) { 

for(int j=0;j<arr.length-i-1;j++) {//-1為了防止溢位

if(arr[j]>arr[j+1]) {

int temp = arr[j];                 

arr[j]=arr[j+1];   

 

arr[j+1]=temp;}}}}

7.選擇排序

擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法。

public static void selectSort(int[]a)

{

int minIndex=0;

int temp=0;

if((a==null)||(a.length==0))

return;

for(int i=0;i<a.length;i++)

{

minIndex=i;//無序區的最小資料陣列下標

for(int  j=i+1;j<a.length;j++)

{

//在無序區中找到最小資料並儲存其陣列下標

if(a[j]<a[minIndex])

{

minIndex=j;

}

}

//將最小元素放到本次迴圈的前端

temp=a[i];

a[i]=a[minIndex];

a[minIndex]=temp;

}

}

8.希爾排序

希爾排序(Shell's Sort)是插入排序的一種又稱“縮小增量排序”(Diminishing Increment Sort),是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。

希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序演算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個檔案恰被分成一組,演算法便終止。 

public static void main(String [] args)

{

int[]a={49,38,65,97,76,13,27,49,78,34,12,64,1};

System.out.println("排序之前:");

for(int i=0;i<a.length;i++)

{

System.out.print(a[i]+" ");

}

//希爾排序

int d=a.length;

while(true)

{

d=d/2;

for(int x=0;x<d;x++)

{

for(int i=x+d;i<a.length;i=i+d)

{

int temp=a[i];

int j;

for(j=i-d;j>=0&&a[j]>temp;j=j-d)

{

a[j+d]=a[j];

}

a[j+d]=temp;

}

}

if(d==1)

{

break;

}

}

System.out.println();

System.out.println("排序之後:");

for(int i=0;i<a.length;i++)

{

System.out.print(a[i]+" ");

}

}

快速排序(Quicksort)是對氣泡排序的一種改進。

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列

class Quick

{

publicvoid sort(int arr[],int low,int high)

 {

int l=low;

int h=high;

int povit=arr[low];

while(l<h)

 {

while(l<h&&arr[h]>=povit)

 h--;

if(l<h){

int temp=arr[h];

 arr[h]=arr[l];

 arr[l]=temp;

 l++;

 }

while(l<h&&arr[l]<=povit)

 l++;

if(l<h){

int temp=arr[h];

 arr[h]=arr[l];

 arr[l]=temp;

 h--;

 }

 }

 print(arr);

 System.out.print("l="+(l+1)+"h="+(h+1)+"povit="+povit+"\n");

if(l>low)sort(arr,low,l-1);

if(h<high)sort(arr,l+1,high);

 }

}

/*//////////////////////////方式二////////////////////////////////*/

更高效點的程式碼:

public<TextendsComparable<?superT>>

T[]quickSort(T[]targetArr,intstart,intend)

{

inti=start+1,j=end;

Tkey=targetArr[start];

SortUtil<T>sUtil=newSortUtil<T>();

if(start>=end)return(targetArr);

/*從i++和j--兩個方向搜尋不滿足條件的值並交換

*

*條件為:i++方向小於key,j--方向大於key

*/

while(true)

{

while(targetArr[j].compareTo(key)>0)j--;

while(targetArr[i].compareTo(key)<0&&i<j)i++;

if(i>=j)break;

sUtil.swap(targetArr,i,j);

if(targetArr[i]==key)

{

j--;

}else{

i++;

}

}

/*關鍵資料放到‘中間’*/

sUtil.swap(targetArr,start,j);

if(start<i-1)

{

this.quickSort(targetArr,start,i-1);

}

if(j+1<end)

{

this.quickSort(targetArr,j+1,end);

}

returntargetArr;

}

/*//////////////方式三:減少交換次數,提高效率/////////////////////*/

private<TextendsComparable<?superT>>

voidquickSort(T[]targetArr,intstart,intend)

{

inti=start,j=end;

Tkey=targetArr[start];

while(i<j)

{

/*按j--方向遍歷目標陣列,直到比key小的值為止*/

while(j>i&&targetArr[j].compareTo(key)>=0)

{

j--;

}

if(i<j)

{

/*targetArr[i]已經儲存在key中,可將後面的數填入*/

targetArr[i]=targetArr[j];

i++;

}

/*按i++方向遍歷目標陣列,直到比key大的值為止*/

while(i<j&&targetArr[i].compareTo(key)<=0)

/*此處一定要小於等於零,假設陣列之內有一億個1,0交替出現的話,而key的值又恰巧是1的話,那麼這個小於等於的作用就會使下面的if語句少執行一億次。*/

{

i++;

}

if(i<j)

{

/*targetArr[j]已儲存在targetArr[i]中,可將前面的值填入*/

targetArr[j]=targetArr[i];

j--;

}

}

/*此時i==j*/

targetArr[i]=key;

/*遞迴呼叫,把key前面的完成排序*/

this.quickSort(targetArr,start,i-1);

/*遞迴呼叫,把key後面的完成排序*/

this.quickSort(targetArr,j+1,end);

}

10.插入排序

/**

*插入排序

*@paramarr

*@return

*/

private static int[] insertSort(int[]arr){

if(arr == null || arr.length < 2){

return arr;

}

for(inti=1;i<arr.length;i++){

for(intj=i;j>0;j--){

if(arr[j]<arr[j-1]){

//TODO:

int temp=arr[j];

arr[j]=arr[j-1];

arr[j-1]=temp;

}else{

//接下來是無用功

break;

}

}

}

return arr;

}

11.JAVA類載入機制與雙委派模型

12.其他

13.加密解密演算法

14.

子網掩碼主要作用:

1  用於遮蔽IP地址的一部分以區別網路標識和主機標識,並說明該IP地址是在區域網上,還是在遠端網上。

2  是用於將一個大的IP網路劃分為若干小的子網路。

15.三次握手?為什麼不是兩次?

16.time_wait

17.TCP/UDP區別

18事物ACID,髒讀,幻讀

19.B/B+數

20JAVA HashMap原理

21 JavaHashMap原理,和HashTable區別ConcurrentHashMap和他們的區別

22 java程式碼中執行緒安全級別

23valotile關鍵字如何使用?

24 Spring MVC工作流程

25紅黑樹

http://www.cnblogs.com/skywang12345/p/3245399.html

25 REST四種請求(get,delete,put,post)

Map底層結構是平衡二叉樹(如紅黑樹);HashMap底層結構是陣列加連結串列,實際上是“連結串列雜湊。  Set底層結構是紅黑樹;HashSet底層資料結構是散列表。  List底層結構是陣列;ArrayList和Vector底層結構是陣列;LinkList底層結構是連結串列。 

27資料庫索引

索引問題就是一個查詢問題。  (0)索引起源:大多數時候,我們不知道某一條記錄在第幾個位置,只知道主鍵(primary key)的值。這時為了讀取資料,可以一條條比對記錄。但是這樣做效率太低。  (1)索引介紹:資料庫索引,是資料庫管理系統中一個排序的資料結構,這些資料結構以某種方式引用(指向)資料,以協助快速查詢、更新資料庫表中資料。  (2)底層實現:索引的實現通常使用B樹及其變種B+樹。  (3)代價:為表設定索引要付出代價的:一是增加了資料庫的儲存空間,二是在插入和修改資料時要花費較多的時間進行索引的維護(因為索引也要隨之變動)。  (4)結構:  Image  (5)建立索引可以大大提高系統的效能。  第一,通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。  第二,可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。  第三,可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。  第四,在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。  第五,通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。  (6)在哪些列上適合建立索引?  在經常需要搜尋的列上,可以加快搜索的速度;  在經常用在連線的列上,這些列主要是一些外來鍵,可以加快連線的速度;  在經常需要排序的列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,  加快排序查詢時間;  在經常使用在WHERE子句中的列上面建立索引,加快條件的判斷速度。  (7)哪列不應該建立索引?  第一,對於那些在查詢中很少使用或者參考的列不應該建立索引。  第二,對於那些只有很少資料值的列也不應該增加索引。  第三,對於那些定義為text, image和bit資料型別的列不應該增加索引。這是因為,這些列的資料量要麼相當大,要麼取值很少。  第四,當修改效能遠遠大於檢索效能時,不應該建立索引。這是因為,修改效能和檢索效能是互相矛盾的。當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。因此,當修改效能遠遠大於檢索效能時,不應該建立索引。  (8)資料庫設計器中建立三種索引:唯一索引、主鍵索引和聚集索引。  唯一索引  唯一索引是不允許其中任何兩行具有相同索引值的索引。  當現有資料中存在重複的鍵值時,大多數資料庫不允許將新建立的唯一索引與表一起儲存。資料庫還可能防止新增將在表中建立重複鍵值的新資料。例如,如果在employee表中職員的姓(lname)上建立了唯一索引,則任何兩個員工都不能同姓。  主鍵索引  主鍵索引指的就是主鍵,主鍵既是約束,也是索引,主鍵是索引的一種,是唯一索引的特殊型別。建立主鍵的時候,資料庫預設會為主鍵建立一個唯一索引。  該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對資料的快速訪問。  聚集索引  在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引。  如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的資料訪問速度。  (9)主鍵索引和唯一索引的區別?  主鍵建立後一定包含一個唯一性索引,唯一性索引並不一定就是主鍵。  唯一性索引列允許空值,而主鍵列不允許為空值。  主鍵可以被其他表引用為外來鍵,而唯一索引不能。  一個表最多隻能建立一個主鍵,但可以建立多個唯一索引。  主鍵更適合那些不容易更改的唯一標識,如自動遞增列、身份證號等。 

28 Vector和ArrayList 區別

29 String,StringBuffer與StringBuilder的區別??

30資料庫優化設計

31XML解析——Java中XML的四種解析方式

32 Spring AOP詳解

33Spring IOC原理

34 堆和棧的區別:   一、堆疊空間分配區別:   1、棧(作業系統):由作業系統自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧;   2、堆(作業系統): 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由OS回收,分配方式倒是類似於連結串列。   二、堆疊快取方式區別:   1、棧使用的是一級快取, 他們通常都是被呼叫時處於儲存空間中,呼叫完畢立即釋放;   2、堆是存放在二級快取中,生命週期由虛擬機器的垃圾回收演算法來決定(並不是一旦成為孤兒物件就能被回收)。所以呼叫這些物件的速度要相對來得低一些。   三、堆疊資料結構區別:   堆(資料結構):堆可以被看成是一棵樹,如:堆排序;   棧(資料結構):一種先進後出的資料結構。

35java八種資料型別

36java讀取檔案

37java連結資料庫

38java遍歷集合中的元素

39迭代與遞迴的區別?

40java虛擬機器:垃圾回收機制,新生代、老年代、永久代的區別,永久代中主要儲存什麼?

41jdk8新特性

42java設計模式

43悲觀鎖和樂觀鎖

44java中鎖的機制

45sql聯合查詢

46資料庫索引

47jdk自帶執行緒池

48其他