日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

整理的一些java基础知识点,欢迎补充指正

發布時間:2023/12/16 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 整理的一些java基础知识点,欢迎补充指正 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、String能被繼承嗎?為什么?

?? ??? ?不能,String類final修飾,而final類不允許被繼承,亦不可修改,改變字符串的值時實質上是新開辟了一份內存空間,創建了一個新的字符串,字符串實質上存儲在char[]類型的數組中,

二、int和Integer的區別

? ? 1:int是基本數據類型,Integer是包裝類型

? ? 2:int初始值為0,Integer初始值為null

? ? 3:int類型數據存儲在棧中,Integer類型數據在[-128,127]時存儲在常量池中,超過此范圍存儲在堆中

三、 String, StringBuffer, StringBuilder 的區別

?? ?? ? String是不可變的字符串,可以為null

?? ?? ? StringBuffer是可變字符串,效率低,線程安全,不可以為null

?? ?? ? StringBuilder是可變字符串,效率高,線程不安全,不可以為null

四、類的實例化順序

?? ??? ?父類靜態變量、靜態初始化塊、子類靜態變量、子類靜態初始化塊,父類非靜態變量(成員變量)、父類初始化塊、父類構造函數、子類非靜態變量、子類初始化塊、子類構造函數。

? ? 初始化塊為{}包含的代碼

靜態修飾的變量及方法只執行一次,無需實例化亦可調用,可直接使用類名調用,甚至聲明一個類的對象為null時,亦可用對象調用

五、抽象類和接口的區別,類可以繼承多個類么,接口可以繼承多個接口么,類可以實現多個接口么

? ??

語法上:? ?

??? 抽象類可以有實現方法,也可以有抽象方法

? ? 接口java8后可以有實現方法,default的實現方法如果實現的兩個接口中有相同的實現方法,則實現類必須要重寫此方法 ?常量只允許有公共靜態常量

?? ?類可以繼承一個類,實現多個接口

? ? 接口可以繼承多個接口

作用上:

? ? 抽象類相當于一個模板,有公共部分的定義,也允許繼承此類的子類有自己的實現

? ? ?接口相當于一個規范

六、php和Java的區別

? ? 1:php是弱類型語言,Java是強類型語言

? ? 2:Java是面向對象編程的語言,需要編譯代碼,php是種服務器腳本語言,不需要編譯

? ? 3:Java對大小寫敏感,php僅對變量的大小寫敏感,而函數,關鍵字,類等不敏感

? ? 4:Java使用的是其它的模板引擎,而php內置模板引擎,自身就是模板語言

? ? 5:php中有關聯數組,類似于java的map

七、final, finally 和 finalize 的區別?

?? ?final 用于聲明屬性,方法和類,表示屬性不可變,方法不可被重寫,類不可被繼承。

?? ?finally 是異常處理語句結構的一部分,表示總是執行。

?? ?finalize 是 object 類的一個方法,在垃圾收集器執行的時候會調用這個對象回收的方法,供垃圾收集時其他資源的回收,比如關閉文件。

?

八、Iterator 和 ListIterator 之間有什么區別?

? ? Iterator可以用來遍歷list和set,但是只能單向遍歷,ListIterator只能遍歷List,但是可以雙向遍歷,它繼承了Iterator接口,增加了一些自己的方法,比如增加,刪除元素。

?

九、創建線程的方式

?? ?1:繼承Thread類創建線程

?? ?2:實現Runnable接口創建線程

?? ?3:使用Callable和Future創建線程

?? ?4:使用線程池例如用Executor框架

十、wait()與 sleep()的區別

?? ?? ? sleep方法來自Thread類,wait方法來自Object類,sleep方法不會釋放對象鎖,也就是睡眠后不會讓出系統資源,它需要制定一個睡眠時間,時間到達后自動喚醒;而wait方法需要需要被notify(),或notifyAll()喚醒

?

十一 、run()、start()、join()方法

?? ?? ? run只是線程類的一個普通方法,調用它并未開啟新的線程,只是在main主線程中繼續按順序執行;

?? ?? ? start是真正的開啟了新的線程,線程之間具有并發性,因此它們的父線程可以比它們先結束;

?? ?? ? join方法是要求在子線程結束之后才能繼續執行父線程

?

十二、什么是 ThreadLocal?ThreadLocal 和 Synchonized 的區別?

?

?? ?? ? ThreadLocal是線程局部變量,它們的相同之處在與實現多線程中數據隔離

區別:線程局部變量中實現數據隔離的原因是被隔離的數據本身就是只需它去訪問,不允許其它數據訪問;而Synchonized是為了實現數據的順序訪問;代碼如下

package test;public class Test implements Runnable{private ThreadLocal<Integer> local =??new???ThreadLocal<Integer>() {??//定義每個窗口已經賣出去的票,初始值為0public Integer initialValue() {return 1;}};//Integer count =10;private int count = 10;//總票數@Overridepublic synchronized void??run() {// TODO Auto-generated method stubwhile (count>0&&local.get()<=5) {System.out.println(Thread.currentThread().getName()+"賣出"+(count--)+"號票"+",已經賣出去"+local.get()+"張票");local.set(local.get()+1);}}public static void main(String[] args) {// TODO Auto-generated method stubTest runnable = new Test();Thread thread1 = new???Thread(runnable,"*********窗口一");Thread thread2 = new Thread(runnable,"窗口二");thread1.start();thread2.start();}}

十三、實現Runable接口和繼承Thread類的區別

?

?? ?? ? Thread類本身實現了Runable接口,所有并不是普遍認為的資源共享問題,只是類只能單繼承,而接口可以多實現,區別在于擴展。

?

?

十四、防止表單重復提交

?? ?? ? 如果是在前臺跳轉中,用戶多次點擊提交按鈕造成表單重復提交,可以利用js使提交按鈕在點擊之后為不可用狀態;

?? ?? ? 如果頁面已跳轉完畢,用戶刷新頁面顯示提交是否重復提交表單,可以在控制器中利用重定向跳轉頁面。

?

十五、javaEE和javaSE的區別

??

??? ? javaEE用來開發網站,javaSE用來開發軟件

?

十六、throw和throws的區別

?

? ? throw作用于方法體中,一旦執行,必將拋出異常;throws作用于方法頭上,表示可能會拋出某個或某些異常

?

十七、java跨平臺的原因

?

? ? java語言首先被編譯器執行編譯成.class文件,也就是java字節碼,.class文件和編譯器是跨平臺的,然后編譯生成的.class文件在不同的平臺上有相對應的解釋器,因此對于編程者來說,java就實現了跨平臺。

?

十八、垃圾回收的優點和原理。并考慮垃圾回收機制。

?

? ? 在對象創建時開始,垃圾回收器就開始監視著對象的內存地址,大小,引用情況,當GC確定一些對象不被使用時,GC就有責任回收這些對象,程序員可以通過System.gc(),通知GC進行垃圾回收,但GC并不一定會執行

? ? 分代垃圾回收:不同的對象的生命周期是不同的,如session對象存活時間一般較長,而生成的string對象,存活時間較短。可能使用一次就不再使用了,因此引入了分代垃圾回收機制,劃分為新生代和老年代和持久代,新生代Minor?GC,老年代對應Full?GC(Major?GC),新生代中的對象不穩定容易產生垃圾,因此經常執行Minor?GC,老年代中存放的是年輕代中執行多次GC后仍然存活的對象,因此Full?GC不經常執行

? ? 標記垃圾回收:將被引用的對象進行標記,未被引用的對象并不會被立即清除,一直到內存耗盡時程序掛起,清理所有的未標記對象,當所有的未標記對象清理完畢后,程序繼續執行

? ? 增量垃圾回收:是為了解決標記垃圾回收的長停頓問題,將堆棧分成多個域,一次僅清理一個域中的垃圾,可減少程序的停頓時間。

?

十九、垃圾回收算法

?

? ? 標記-清除算法:將標記的對象進行清除,標記和清除的效率都不高,會造成許多的內存碎片;

? ? 標記-復制算法:將內存分為兩塊,當這一塊的內存用完啦,就將仍然存活的對象復制到另一塊內存中去,然后清除掉這一塊的所有對象;適用于新生代,死亡率高,復制的對象較少

? ? 標記-整理算法:將標記的對象清除后,讓存活的對象向內存的一端移動,去除內存碎片

?

二十、對象的四種引用類型

?

? ? 1、強引用:GC不會對此種對象進行垃圾回收

? ? 2、軟引用:GC會在內存溢出前對此類對象進行回收,存儲在SoftReference中,當軟引用存儲的對象被回收后,軟引用這個對象也需要進行回收,可以在最初構建這個軟引用對象時采用以下方法構建

ReferenceQueue queue = new??ReferenceQueue();??

?

SoftReference??ref=new??SoftReference(aMyObject, queue);

如此,當軟用對象所存儲的對象被回收后,ref所指定的對象就會被加入到ReferenceQueue中去,我們可以根據此隊列是否為null,來判斷軟引用中存儲的對象是否被回收,如果被回收,我們可以把軟引用對象的引用清除掉;

也可利用reference.get();方法判斷弱引用中存儲的對象是否被回收

while ((ref = (EmployeeRef) q.poll()) != null) {??

?????????????// 清除ref??

??????????????SoftReference ref = null;??

?????????}

? ? 3、弱引用:存儲在WeakReference中,隨時可能會被回收,無論是否會內存溢出

? ? 4、虛引用:存儲在PhantomReference,必須與引用隊列關聯使用

https://blog.csdn.net/linzhiqiang0316/article/details/88591907

?

二十五、為什么重寫equals方法時還要重寫hashcode方法

?

?? ?首先我們原生equals方法是判斷兩個對象的內存是否一致,而我們大多數情況下僅需判斷對象的數據是否相等即可;而重寫equals方法時要遵循一個原則,對象相同,則哈希碼相同;哈希碼相同,對象不一定相同。如果我們重寫equals方法后,不重寫hashcode方法,則將兩個相同數據的對象當做key存儲到set或map中時,仍然會當做兩個對象,因為map再對key去重時,調用的是equals和hashcode的雙重判斷。這倆方方必須同時滿足

??if (p.hash == hash && ((k = p.key) == key || (key != null &&??key.equals(k))))

?

二十六、object中定義了哪些方法

?

clone(),equals(),hashcode(),notify(),notifyAll(),wait(),finalize(),getClass(),toString()

?

二十七、重載和重寫的區別

?

重載是在同一個類中,對某一個方法進行重載,方法名相同,參數不同(參數類型或個數),方法返回類型及訪問權限和是否重載無關;

重寫發生在繼承中,方法名,參數,返回值類型相同,拋出的異常必須是父類中聲明的或父類異常中的子類,訪問權限不能父類更小

?

二十八、繼承和實現的區別

?

類不可以繼承多個類,不可以繼承接口,可以實現多個接口;

接口可以繼承多個接口,不可以實現接口;

?

?

二十九、接口和抽象類的區別

?

抽象類中不一定有抽象方法,但是有抽象方法的話必須設置為抽象類,可以擁有成員變量

接口中的方法默認為public abstract沒有方法體,如果要加上方法體的話可以將方法改為靜態或將訪問權限修改為default

接口中的變量默認為公共靜態常量: public static final

接口中的方法默認為: public abstract

類的訪問權限為default

?

三十、單例模式

public class Single {//餓漢式private Single() {}private static final Single single = new Single();public static Single getInstance() {return single;}}package test;public class Single {//懶漢式private Single() {}private static??Single single;public static Single getInstance() {//? ?public static synchronized Single getInstance() {if (single==null) {single = new Single();}return single;}}

?

餓漢式線程安全,懶漢式線程不安全,不過可以通過加鎖使懶漢式線程安全

?

三十一、static和final的區別

?

static表示靜態僅此一份,final表示為不可更改

?

static修飾的變量或方法可以直接通過類名調用;final修飾的變量表示為常量值不可修改,修飾的方法不能被重寫,修飾的類不能被繼承;

?

三十二、匿名內部類

?

當我們為了使用父類或接口中的某個方法時,我們需要新建一個類繼承父類或實現接口,然后new一個子類去調用方法,但是我們可能僅使用一次這個方法,因此生成一個新的類是比較麻煩的,此時我們可以使用匿名內部類。可以簡化代碼

?

三十三、基本數據類型

?

byte,int,double,float,char,boolean,short,long

?

三十四、Error和Exception的區別

?

?? ?error類一般指與虛擬機相關的問題,如系統崩潰,內存不足等問題,對于此類異常僅依靠程序本身無法恢復,建議讓程序終止;

? ? Exception類表示程序可以處理的異常,可以進行捕獲處理異常,使程序正常執行。

?

三十五、異常分為哪幾種

? ? 分為一般異常和運行時異常,一般異常是在定義時拋出的,這些異常需要被拋出或者捕獲,如果不處理將會編譯失敗;運行異常是在代碼執行階段出現的異常

?

三十六、集合類型

list可以存儲null值,元素有序,ArryList查詢快,LinkList增刪快,Vector線程安全

set,元素不能重復:HashSet無序可以放入null,TreeSet有序不允許放null

Map:HashMap允許key和value都為null,非線程同步,默認大小是16,增長方式為2的指數倍;

?? ??? ?? ? HashTable不允許鍵值為null,線程同步,默認容量為11,增長方式為old*2+1;

三十七、Collection和Collections的區別

???? ??? ?

? ? Collection是一個接口,是各種集合結構的父接口,定義了集合的基礎操作方法;

? ? Collections是一個類,是一個對集合對象進行操作的幫助類,提供啦對集合的搜索,排序,線程安全化等操作方法

?

三十八、什么是序列化,如何實現序列化

? ? 當我們需要將一個java對象存儲到本地文件或通過網絡傳輸時,需要將其轉化為字節流的形式,稱之為序列化,反之稱之為反序列化,要將對象序列化需要在其類前實現Serializable;

?

三十九、HashMap詳解

? ? HashMap的數據結構是一個基于數組的鏈表結構,在1.8中鏈表長度超過8時將會轉化為紅黑樹

1、HashMap的主要參數有哪些

? ? capacity:數組長度,默認為16;

? ? MAXIMUM_CAPACITY:極限容量,最大為2的30次方;

? ? 負載因子:通過與數組長度的成績得到閾值,默認0.75;

? ? 數組閾值:1.8中當entity超過此閾值時進行擴容,1.7中超過此閾值切添加新數據發生hash碰撞時進行擴容

? ? 鏈表閾值:超過8時轉化為紅黑樹,小于6時轉化為列表

?

2、hash的計算規則

? ? key的hashcode碼右移16位后,和原hashcode碼異或操作,得到hash

3、key所在位置的計算

將數組長度-1后,轉化為2進制,與hash進行與操作,即可得到所在位置

?

4,插入操作

1.8中,如果沒有出現hash沖突,則直接將node放入數組;

如果第一個node出現了hash沖突且key相同,意味著無需添加node,則替換此key的value;

?

如果沒有hash沖突或者無相同的key,意味著需要添加node,

?? ?? ? 如果此hash對應的數據是以紅黑樹形式存儲的話,則用樹的方式添加node

?? ?? ? 如果此hash對應的數據是以鏈表形式存儲,遍歷此鏈表

?? ??? ??? ?? ? 在遍歷過程中發現了相同的key時,替換value

?? ??? ??? ?? ? 遍歷到結尾還未發現相同key,意味著需要添加node,添加node后進行檢測

?? ??? ?? ??? ??? ??? ? 如果鏈表的深度超過了8,但數組長度未超過64,則進行數組擴容

? ? ? ? ? ? ? ? ? ? ? ? 如果超過了64,則將鏈表轉化為紅黑樹

添加node或修改node之后,檢查此時鍵值對個數長度,如果大于閾值,則進行擴容

5、拉鏈法導致的鏈表過深問題為什么不用二叉查找樹代替,而是用紅黑樹

二叉查找樹在極限情況下會所有節點在一側,這樣就又成了鏈表結構,不能解決鏈表過深的問題,而紅黑樹的特性決定了,它不會像二叉查找樹那樣出現極限情況

6、紅黑樹的理解

節點非黑即紅,根節點一定是黑色的,如果節點是紅色的,則子節點一定是黑色的(反之未必);葉子節點是黑色的空值;從任一節點到每個葉子的所有路徑都有相同數目的黑色節點

?

7、為什么擴容時要設置成2的n次冪

元素存儲到hashmap中時,是將元素key的hash值和數組長度減一的二進制進行與運算,如果數組長度是個基數的話會造成數組的部分位置不能存儲數據

8、負載因子為什么會影響hashMap性能

首先有序列表索引較快,而鏈表插入和刪除較快;而負載因子大的話,相同長度的列表中可以存儲更多數據,則鏈表長度會加長,索引效率就降低;而負載因子小的話,索引效率增加,但會造成空間浪費

9、有序map和無序map

HashMap存儲的時候是無序的,即不計入插入的先后順序,因為它是按照hash值尋找相應位置進行存放,而存放完成之后,取得時候就是有序的了

LinkedHashMap是有序的,它是HashMap的子類,通過保存對上一個和下一個元素的引用,保證了順序

?

四十、初始化和實例化

?

在實例化一個對象之前,會先對它的類進行初始化;

實例化對象之后,會對實例對象進行初始化

?

四十一、列舉出JAVA中6個比較常用的包

java.net ;java.lang;java.util;java.io;java.sql;java.awt;?javax.swing

四十二、Comparable和Comparator接口區別

?

首先,對集合當中元素排序時,調用Collections.sort()方法,可以有兩種方法排序,一種直接傳入list集合,,另一種傳入list集合以及指定比較器。

第一種是:在創建類時實現Comparable接口,并重寫了 compareTO方法;

第二種是:新建了一個類實現了Comparator接口,并重寫了compare方法

?

四十四、HashMap,TreeMap,HashTable的區別?

HashTable不允許<鍵,值>有空值,HashMap允許<鍵,值>有空值。

HashTable線程同步,但是HashMap非線程同步。

HashTable中hash數組的默認大小是11,增加方式的old*2+1,

HashMap中hash數組的默認大小是16,增長方式一定是2的指數倍。

TreeMap底層是二叉樹結構,線程不同步,將它保存的key默認按照升序排序,鍵值對可以為null。

HashTable使用Enumeration,HashMap使用Iterator。

四十五、寫幾個線程安全類,不安全的,支持排序的類名

線程安全類:Vector、Hashtable、Stack。

線程不安全的類:ArrayList、Linkedlist、HashSet、TreeSet、HashMap、TreeMap

支持排序的類有HashSet、LinkedHashSet、TreeSet等(Set接口下的實現都支持排序)

?

四十六,volatile和synchronized的區別

?

synchronized是實現了執行控制,同一時刻只能由一個線程訪問,volatile直接告訴線程,緩存中的數據不正確,直接去取,寫的時候也直接寫到主存;

synchronized可能會造成線程堵塞,volatile不會,

volatile僅能作用在變量上,synchronized可以作用在方法,變量和類上

?

四十七、三次握手與四次揮手

首先TCP報文段首部有20個字節用于存儲本報文段的一些信息,包括序號seq(發送的報文段的第一個字節的序號),確認號ack(期待對方發送的下一個報文段的第一個數據字節的序號),以及6個控制位來說明本報文段的性質

三次握手

第一次握手:客戶端發送TCP請求報文段(SYN=1,seq=x);(SYN=1的報文段不能攜帶數據,但是會消耗一個序號),此時客戶端進入同步發送狀態

第二次握手:服務端接收到請求報文之后,如果同意建立連接,發送SYN=1的確認報文,此時服務端進入同步收到狀態

第三次握手:客戶端收到服務端的確認報文后,向服務端發送確認報文,客戶端進入連接建立狀態,服務端接收到確認報文后,服務端進入連接建立狀態;此時雙方就可以發送報文數據啦

?

四次揮手:

首先客戶端發起FIN=1的連接釋放報文,停止發送數據,客戶端的狀態為終止等待1;

服務端收到釋放連接報文后,發送確認報文,服務端進入關閉等待狀態,此時客戶端不會再向服務端發送數據,但服務端可繼續向客戶端發送數據,客戶端收到確認報文后,進入終止等待2狀態;

服務端繼續向客戶端發送數據,數據發送完畢后,向客戶端發送FIN=1的連接釋放報文,此時服務端進入最后確認狀態

客戶端收到請求釋放報文后,向服務端發送確認報文,客戶端進入時間等待狀態,服務端接收到確認報文后,進入連接關閉狀態,客戶端經過一段時間的等待后也進入連接關閉狀態

?

四十八、Class.loader和Class.forName的區別

class.loader只是將.class文件放入jvm中,不進行任何的解釋;Class.forName將.class文件放入jvm后還會執行文件中的靜態方法和靜態代碼塊靜態變量

?

四十九、String類的常用方法

indexof():返回指定字符串第一次出現的位置

charAt():返回指定下標的元素字符

length():返回字符串的長度

replace():替換所有指定字符,第一個為老字符,第二個參數為新的字符

replaceAll():替換所有指定字符串

trim():去除字符串兩邊的空格

split():以特定字符串切割字符串,返回一個字符串數組

?

五十、synchronized和lock的區別

synchronized是一個java關鍵字,lock是一個接口

synchronized無法判斷是否獲取鎖的狀態,lock可以

synchronized可以自動釋放鎖,lock需要手動釋放

synchronized是非公平的鎖,lock默認不公平,可以設置為公平鎖

synchronized適合代碼少量的同步問題,lock適合大量代碼的同步問題(因為synchronized修飾的代碼會被編譯器優化,切線程不能被中斷)

https://www.cnblogs.com/takumicx/p/9338983.html

?

五十一:棧、堆、常量池

棧中存放基本數據類型,數據唯一,數據的大小和生存周期確定,存儲或修改數據時,先查找有沒有相同的數據,有的話直接引用此數據,沒有的話創建開辟新的空間存儲此數據

int a = 3;int b = a;System.out.println("a="+a+";b="+b);System.out.println(a==b);a=4;System.out.println("a="+a+";b="+b);System.out.println(a==b);

堆中存放new出的對象,數據不共享,存儲數據時直接開辟新的空間存儲數據,修改數據時在原先地址進行數據修改

?

常量池存放基本類型常量,字符串常量以及指定范圍的包裝類型常量,數據共享,注意包裝類型存儲范圍,裝箱時會調用valueof方法,因此得到的對象可能會被new

?

類的成員變量及方法的四種訪問權限

?

訪問級別

訪問修飾符

同類

同包

子類

不同包

公開

public

受保護

protect

×

默認

缺省

×

×

私有

private

×

×

×

?

?

數據庫

一、事務的特性及事務并發帶來的問題

?

?? ?? ? 原子性、隔離性、持久性、一致性

?? ?? ? 問題:臟讀:事務A利用了事務B處理之后的數據,但是事務B發生了回滾

? ? ? ? ? ? ? ? ? 不可重復讀:事務A讀取數據再次重新讀取時,原數據被事務B修改,前后讀取數據內容不同,針對更新操作

? ? ? ? ? ? ? ? ? 幻讀:事務A讀取數據再次重復讀取時,原數據被事務B刪除或插入;前后讀取數據總數不同,針對增加刪除操作

?

二、數據庫如何優化

?

? ? 1:SQL優化:

?? ?? ? 盡量少使用select * ;使用連接查詢代替子查詢

? ? 2:表結構優化:

?? ?? ? 盡量使用數字類型字段,提高比對效率;

?? ?? ? 長度不變的數據可以使用char類型;

? ? 3:其它優化

?? ?? ? 對查詢頻率高的字段適當建立索引;根據表用途的不同使用不同的數據庫引擎;讀寫分離。

?

三、常見數據庫引擎

數據庫引擎是用于存儲,處理,保護數據的核心服務

?? ? InnoDB支持事務處理、外檢以及行鎖,適用于對數據安全性,事務完整性要求較高的場景;

? ? MyISAM是mysql默認的引擎,不支持事務、行鎖、外鍵,此當修改數據時會鎖定整個表,適用于讀出記錄。注意:使用此引擎,在service層通過事務配置也可以讓其完成事務業務。

? ? MEMORY數據存儲到內存中,讀寫速度較快,但不能存儲太大的表,

?

四、視圖

視圖是有一個表或者多個表組合而成的虛擬表,它本身并不占據物理空間,它所呈現的數據仍然存儲在原表當中;

創建視圖有兩個作用,簡化操作和安全性,經常被查詢的數據可以定義為視圖,這樣下次在查詢的時候不用再每次指定條件,而通過視圖用戶只能查詢修改他們所能見到的數據。通過視圖修改數據時僅允許一個表中產生的視圖進行修改。超過一個表不允許修改,具有更好的安全性。

五、索引

索引是指對數據表中的一列或者多列進行排序的一種存儲結構,可以加快數據的查詢效率,但是索引本身也占據物理空間,且在數據進行增加、刪除、修改的時候都需要重新分配索引,又降低了數據的維護速度。分為BTREE和HASH兩種結構。

唯一索引:任意兩行不能有相同的索引值,可以防止表中存儲重復數據(主鍵索引)。

聚集索引:表中行的物理順序與鍵值的邏輯順序相同。

六,存儲過程

存儲過程是一個預編譯的SQL語句集,如果某個操作需要執行大量sql語句,可以將其加入到存儲過程中,比單純執行SQL要快。相當于把sql語句封裝到一個方法中,執行sql時調用方法即可

七、觸發器

存儲過程是一種特殊的存儲過程,存儲過程需要手動調用,觸發器是在某個事件(符合條件的增刪改)發生之前或之后自動執行的。

八、游標

游標是一種能夠從包括多條數據記錄的結果集中每次提取一條記錄進行處理的機制

?

九、SQL的執行順序:

from .. on .. join .. where ..group by ..having ..select ..order by ...limit ..

十、三大范式

第一范式:每個列都是最小單元,不可再分。比如:所選課程列包含多個課程,不符合要求,應該分成每個課程的單列

第二范式:不存在對主碼的部分依賴,即應當通過主碼確定唯一的一行數據:所以可設置主碼只有一個

第三范式:在第二范式基礎上,非主屬性不能互相依賴,既不存在對主碼的傳遞依賴

十一、SQL語言的分類

DML:數據操作語言,用于數據的增刪改查,排序操作

DDL:數據定義語言,用于創建視圖,索引、表格,此操作是隱性提交的,不能回滾

DCL:數據控制語言,用于授予或回收用戶訪問數據庫的某種權限

十二、數據庫的交叉并補操作,mysql不支持后兩種

UNION:查詢結果連接后去重?補

UNION ALL:查詢結果連接? 并

INTERSECT:查詢相同的?交

MINUS:查詢不同的? 差

?

Mybatis

?

一、緩存

? ? 一級緩存的作用域為同一個SqlSession,二級緩存的作用域是同一個namespace中,且當SqlSession關閉時,才會執行二級緩存

?

二、增刪改查的返回值

增加返回增加的條數;

刪除返回被操作的記錄條數;

修改也是返回被操作的記錄條數

?

三、插入數據之后返回主鍵id

在定義xml映射器時設置屬性useGeneratedKeys值為true,并分別指定屬性keyProperty和keyColumn為對應的數據庫記錄主鍵字段與Java對象的主鍵屬性。

?

四、工作原理

1、加載mybatis配置文件,得到文件的字符流(配置文件中配置著數據源,別名,類型轉換這些基礎配置),

?

2、通過SqlSessionFactoryBulider讀取文件的字符流得到SqlSessionFactory

?

3、通過SqlSessionFactory得到SqlSession

?

4、通過SqlSession可以調用Mapper接口中的方法

?

5、通過接口中的方法調用與其對應的MapperStatement對象

?

6、MapperStatement對象被解析(sql參數轉化,動態sql拼接),生成jdbc?Statement對象

?

7、JDBC執行sql

?

8、通過MappedStatement中的結果映射關系,將返回結果轉化為JavaBean或HashMap進行返回

?

五、鎖機制

共享鎖:SELECT .....? LOCK IN SHARE MODE;事務對數據加了共享鎖之后,允許其它事務繼續加共享鎖讀取數據,不允許添加排它鎖,不允許進行寫操作

排它鎖:SELECT .... FOR UPDATE,對數據加了排它鎖之后,可以進行讀和寫,其它事務不能在對此數據封裝任何形式的鎖。對于InnoDB引擎來說,增刪改操作會自動給涉及的數據加上排它鎖

注意:共享鎖在事務結束之后才會釋放,但是事務的共享鎖可以升級為排它鎖,前提是事務操控的數據未被其它事務加鎖;因此當有兩個事務同時對同一個數據開啟了共享鎖之后,又同時想把共享鎖轉化為排它鎖時就會發生死鎖,所以引入了更新鎖。共享鎖和排它鎖不兼容,與共享鎖兼容

更新鎖:加了更新鎖之后,表示此事務目前只是讀操作,但未來可能執行寫操作;其它事務可以執行讀操作,但是必須等加了更新鎖的事務結束后才能執行寫操作

更新鎖與共享鎖兼容,與排它鎖不兼容,與自身不兼容

意向鎖:表示此表中的數據是否已經被加了鎖

計劃鎖:限制DDL操作,進行DDL操作過程中,不允許sqlsession連接該表,在進行DML過程中,不允許使用DDL語言

悲觀鎖:每次都假設出現最壞的情況,即認為拿數據后會進行修改,所以會對此數據上鎖,比如表鎖,行鎖,頁鎖,排它鎖。

樂觀鎖:每次都是假設最好的情況,即認為拿數據時不會進行修改,只在更新數據的時候檢查下在此期間數據有沒有被其它人修改過,判斷有沒有別修改可以采用版本號機制或者CAS算法。版本控制:在數據表格中新加一個版本字段,進行更新操作時,判斷當前行數據版本字段的值是否和初始時發生了改變;CAS算法:有3個操作數,內存上的值V,舊的預期值A,要更新的信息B,當且僅當A=V時,進行修改

?

?

Java?Web

?

一、什么是servlet

servlet是運行在web服務器或應用服務器上的程序,可以接收來自網頁表單的用戶輸入,呈現來自數據庫的數據,可以動態生成網頁

二、servlet的生命周期?

servlet類加載完成實例化,通過init()進行初始化,調用service()處理客戶端的請求,調用destroy()方法終止,最后Servlet通過垃圾回收器進行回收

三、jsp內置對象及作用?

request?獲取客戶端傳輸過來的信息

response?向客戶端響應信息

out? ? 向客戶端輸出數據

session? ? 保存會話對象,存儲在服務器端,瀏覽器關閉即會失效

application?? ? 在服務器上存儲數據,只要程序未停止就會一直保存

pagecontext? ? 保存了其它的所有對象

page? ? 代表當前jsp頁面本身

exception? ? 表示jsp引擎在執行時會拋出的異常

config? ? 保存當前jsp的配置信息

?

四、jsp動態引入和靜態引入的區別

動態引入是通過jsp動作引入的,可以傳遞參數,適用于引入動態頁面,動作的標志為jsp:

靜態引入是通過jsp指令引入的,?適用于靜態引入,指令的標志為@

?

五、應用服務器和web服務器的區別

web服務器用來接收請求和返回響應,只能夠處理靜態頁面;因此那種需要動態處理的數據交給應用服務器處理,處理后的結果再交給web服務器進行響應

?

六、Tomcat是什么

因為可以通過HTTP提供HTML頁面等靜態內容的請求訪問,所以是一?

個WEB服務器;

因為實現了Servlet規范,所以也是一個Servlet容器,可以運行?

Servlet程序;

因為可以通過Servlet容器,調用Servlet處理動態請求,所以也是?

一個應用服務器;

七、jsp和servlet的區別和聯系:

1.jsp經編譯后就變成了Servlet.

(JSP的本質就是Servlet,JVM只能識別java的類,不能識別JSP的代碼,Web容器將JSP的代碼編譯成JVM能夠識別的java類)

2.jsp更擅長表現于頁面顯示,servlet更擅長于邏輯控制.

3.Servlet中沒有內置對象,

?

Spring框架

?

一、什么是spring框架,有哪些主要模塊

spring框架是一個為java應用程序的開發提供了綜合,廣泛的基礎性支持的java平臺,幫助開發者解決了一些基礎性的問題,使得開發人員可以專注于應用程序的開發,包含的模塊有數據訪問,web,AOP,測試等功能模塊

二、使用spring框架有哪些好處

首先,我們可以不用把精力放在基礎配置上,其次它提供許多模塊,我們可以根據自己的需求添加需要的模塊功能加以整合,它提供的控制反轉和依賴注入的機制,讓我們更容易設計出高內聚低耦合的項目。

?

三、控制反轉IOC和依賴注入DI

在傳統項目中我們生成一個對象時,需要自己new生成,在spring中,是通過容器為我們創建和管理對象的,這叫做控制反轉,而依賴注入是指我們在一個類中需要另一個類的對象時,不需要自己new,僅需通過生命,容器就會為我們自動注入。因此,控制反轉是依賴注入的前提,依賴注入是控制反轉的體現。

依賴注入的本質就是自動裝配,裝配是依賴注入的具體行為。

四、spring裝配的類型

no,bytype,byname,construct(根據構造函數中的參數類型),autodetect(自動探測,有構造函數根據構造函數進行裝配,沒有構造函數根據bytype進行裝配)

五,依賴注入的方式有哪些?

set方法注入,

構造器注入,

接口注入

?

六、BeanFactory和ApplicationContext和FactoryBean的區別

BeanFactory是一個factory,管理著所有的bean,在容器啟動時不會去實例化bean,當從容器中取bean時才會去實例化

FactoryBean是一個bean,使用它我們可以自定義一個bean的配置信息加入容器中

ApplicationContext是BeanFactory的實現類,擁有BeanFactory的所有功能,還提供了些其它的功能,比如支持AOP,自動裝配。在項目啟動時就將所有的bean實例化了,不過可以設置lazy-init=true讓bean延遲實例化

?

六,spring有幾種配置方式

基于XML配置,基于注解的配置,基于Java的配置

?

七、Spring支持的幾種bean的作用域

singleton:默認,每個容器中只有一個bean的實例,

prototype:為每一個bean請求提供一個實例

request:為每一個網絡請求創建一個實例,在請求完成之后,bean會失效并被垃圾回收器回收

session:確保每個session中有一個bean的實例,在session過期后,bean會隨之失效

global-session:所有的session共享一個bean

?

八、spring框架中的單例bean是線程安全的嗎

spring框架并沒有對單例的bean進行任何多線程的封裝處理,所以并非線程安全的,但是spring中封裝的大部分bean是無狀態的bean(dao層對象),因此線程是安全的;而對于有狀態的bean(modelAndView),可以通過改變它的作用域為prototype來使其線程安全。

?

九、@Autowired和@Resource的區別

?

@Autowired默認根據類型進行裝配,如果想要使用name裝配,可以結合@Quanlifier一起使用

@Resource默認根據name裝配,

?? ??? ?如果指定type,則按照類型匹配,找不到或找到多個,都會拋出異常

?? ?? ? 如果指定name,則按照name匹配,找不到則拋出異常

?? ?? ? 如果同時指定name和type,則按照兩者進行尋找

十、spring中用到了哪些設計模式

BeanFactory管理著所有的bean,采用了工廠模式;

bean的創建默認為單例模式;

代理模式:在使用Spring AOP功能時使用了動態代理

模板方法:用來解決代碼重復的問題,如RestTemplate,和JpaTemplate

觀察者模式:當一個對象狀態發生改變時,所有依賴于它的對象都會得到通知記性更新,如spring中listener的實現--ApplicationListener

十一、Spring事務的種類

通過TransactionTemplate或 PlatformTransactionManager實現編程式事務管理

通過AOP或@Transaction實現聲明式事務管理,

編程式事務管理可以將事務級別作用到代碼塊,但是需要在邏輯代碼中添加相應的事務管理代碼

聲明式事務管理更加簡單易用,但是事務級別只能作用于方法

?

事務實現: https://blog.csdn.net/weixin_40486739/article/details/89286590

?

十二、spring事務的傳播行為

?

1、PROPAGATION_REQUIRED:如果當前存在事務,就加入該事務,不存在,則開啟新事務

2、PROPAGATION_SUPPORTS:如果當前存在事務,就加入該事物,不存在則以非事務執行

3、PROPAGATION_MANDATORY:如果當前存在事務,就加入該事務,不存在,拋出異常

4、PROPAGATION_REQUIRES_NEW:無論當前存不存在事務,都創建新事務

5、PROPAGATION_NOT_SUPPORTED:以非事務執行,若當前存在事務,則將事務掛起

6、PROPAGATION_NEVER:以非事務執行,若當前存在事務,則拋出異常

7、PROPAGATION_NESTED:如當前存在事務,則在當前事務內開啟子事務,不存在,則開啟新事務(父事務回滾,子事務回滾;子事務回滾,父事務不受影響)

https://blog.csdn.net/u010963948/article/details/82761383

?

十三、Spring隔離級別

1、ISOLATION_DEFAULT:采用后端數據庫的級別,mysql為可重復讀,oracle為讀已提交級別

2、 ISOLATION_READ_UNCOMMITTED:最低隔離級別,讀未提交,可能會發生,臟讀,幻讀,不可重復讀

3、 ISOLATION_READ_COMMITTED:讀已提交,避免臟讀,不能避免幻讀和不可重復讀

4、 ISOLATION_REPEATABLE_READ:可重復讀,即一個事務內兩次讀取數據時,如果前后數據不一致,此事務讀時禁止其他事務寫數據;避免了臟讀,不可重復讀,可能會造成幻讀

5、ISOLATION_SERIALIZABLE:串行化,在事務執行時間不允許其它事務對數據做出的增刪改操作,安全性最高,效率最低

?

十四、java反射機制

?

反射機制指的是程序在運行時能夠獲得傳過來的類的所有屬性和方法,調用傳輸過來的對象的所有屬性和方法。可以根據傳入的對象動態的進行操作,使操作更加靈活,代碼具有更好擴展性,缺點是消耗了更多的性能

?

?

十五、spring應用上下文

?

首先我們進行依賴注入時,是通過spring容器獲取對象,但是我們需要將需要注入的對象以及對象之間的依賴關系通過spring的應用上下文來告訴spring時容器

ioc是一種思想,spring實現了ioc,但實現了ioc的還有其它框架

?

十六、Bean的生命周期

?

1、spring對bean進行實例化

2、將屬性和對其它bean的引用進行注入

3、如果bean實現了BeanNameAware接口,將bean的id傳遞給setBeanName方法(此接口讓bean自己可以獲取自己在spring容器中的id)

4、如果bean實現了BeanFactoryAware接口,將調用BeanFactory容器實例傳入。(可以獲取到他們的BeanFactory)

5、如果實現了ApplicationContextAware接口,將調用setApplicationContext方法,將上下文的引用傳入

6、如果實現了BeanPostProcessor接口,將調用postProcessBeforeInitialization方法(在對象實例化前進行操作)

7、如果實現了InitializingBean接口,或者在bean中聲明了init-method則調用他們的初始化方法對bean進行初始化(如果兩個都指定,則先執行接口中指定的方法,再執行配置中指定的初始化方法)

8、如果實現了BeanPostProcessor接口,將調用postProcessAfterInitialization方法(在對象實例化前進行操作)

9、此時Bean 已經準備就緒.可以被應用程序使用了. 它們將一直駐留在應用上下文中.直到該應用上下文補銷毀

10、如果實現了DisposableBean接口,spring將調用它的destroy()接口,如果Bean 使用destroy-method 聲明了銷毀方法,方法也會被調用。(調用順序同7)

?

十七、spring的AOP支持

1、使用@Asepect注解,在類中定義切點及各種通知

2、經典的基于代理的AOP實現,在一個類中實現各種通知的接口,在配置文件中配置切點,切面

https://blog.csdn.net/summer_yuxia/article/details/75104949

?

十八、什么是線程安全

線程安全是指在多線程訪問數據時,采用加鎖機制,當一個線程訪問該類的某個數據時,提供數據保護,不允許其它線程訪問此數據直至當前線程訪問結束,由此可以避免數據污染

?

十九、線程池的好處

1、提高效率:創建線程和銷毀線程都是比較消耗系統資源的,線程池為我們提供了一定數量的線程,可以避免頻繁的創建和銷毀線程

2、方便管理:將線程放在線程池中,對線程的數量及使用情況進行統一管理,避免在程序中額外的創建線程

二十、線程池的無界隊列和有界隊列

首先理解三個名詞,

corePoolSize:線程池的基本線程數量,注意在剛創建線程池時不會創建線程,當有任務提交時才開始創建線程。

maxiMumSize:線程池的最大線程數,可以調用setMaxiMumSize方法定義

poolSize:線程池中當前的線程數量

有界隊列:當線程數poolsize小于corepoolSize時,提交的runable任務會直接創建分配一個線程,立刻執行

大于時,將線程任務放在blockqueue中,如果阻塞隊列已滿,如果poolsize<maximumSize,則創建一個新的線程,如果已經=,則執行reject策略

無界隊列:當poolSize<corePoolSize時,提交的runable任務會直接分配一個線程,不小于,則將線程任務放入無界隊列中進行等待,直至內存耗盡

二十一、線程池的種類

1、newCachedThreadPool:緩存線程池,線程池中線程不固定,無最大線程數

2、newFixedThreadPool:定長線程池,線程池中線程數量一定,超過corepoolsize時,線程任務在無界隊列中等待

3、newSingleThreadExecutor:單例線程池,線程池中線程數固定為1,其它的線程任務在無界隊列中進行等待

4、newScheduleThreadPool:定長定時線程池,創建指定數量的線程池,線程的執行可指定延遲執行時間,以及周期

5、newSingleScheduledExector:單例定時線程,創建一個線程的線程池,線程的執行可指定延遲時間,以及周期

?

二十二、如何給定線程池的線程數量

1、首先cpu密集型程序是指,對業務邏輯的處理計算比較多,io密集型應用是指經常做文件的讀寫操作,

2,設系統的cpu數量為n,則理論上對于cpu密集型創建的線程數為n+1,對于io密集型創建的線程數為2n+1

?

?

?

?

總結

以上是生活随笔為你收集整理的整理的一些java基础知识点,欢迎补充指正的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。