JavaSE *Linux集合 知識點Link

Linux碉堡了入門:https://blog.csdn.net/qq_41781322/article/details/79520181

java碉堡SE知識大全:https://blog.csdn.net/qq_35336425/article/details/82825542

java八種基本數據類型及包裝類詳解

https://blog.csdn.net/qq_37688023/article/details/85106894

談一談IO流體系:

https://www.cnblogs.com/ylspace/p/8128112.html

 

談一談Java集合體系:

https://www.cnblogs.com/linliquan/p/11323172.html

 

談一談java的反射體系:

https://blog.csdn.net/yangyuscript/article/details/79257055

 

談一談java的序列化:

https://www.cnblogs.com/zhengshao/p/8882613.html

https://www.runoob.com/java/java-serialization.html (菜鳥教程!)

 

 

 

 

 

 

 

Java 面向對象都有哪些特性以及你對這些特性的理解?

1)繼承:繼承是從已有類得到繼承信息創建新類的過程。提供繼承信息的類被稱爲父類(超類、基類);得到繼承
信息的類被稱爲子類(派生類)。繼承讓變化中的軟件系統有了一定的延續性,同時繼承也是封裝程序中可變因素的重要
手段。
2) 封裝:通常認爲封裝是把數據和操作數據的方法綁定起來,對數據的訪問只能通過已定義的接口。面向對象
的本質就是將現實世界描繪成一系列完全自治、封閉的對象。我們在類中編寫的方法就是對實現細節的一種封裝;我們
編寫一個類就是對數據和數據操作的封裝。可以說,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程接
口。
3) 多態性:多態性是指允許不同子類型的對象對同一消息作出不同的響應。簡單的說就是用同樣的對象引用調
用同樣的方法但是做了不同的事情。多態性分爲編譯時的多態性和運行時的多態性。如果將對象的方法視爲對象向外界
提供的服務,那麼運行時的多態性可以解釋爲:當A 系統訪問 B 系統提供的服務時,B系統有多種提供服務的方式, 但一
切對 A 系統來說都是透明的。方法重載(overload)實現的是編譯時的多態性(也稱爲前綁定),而方法重寫
(override)實現的是運行時的多態性(也稱爲後綁定)。運行時的多態是面向對象最精髓的東西,要實現多態需要做兩
件事:1. 方法重寫(子類繼承父類並重寫父類中已有的或抽象的方法);2. 對象造型(用父類型引用引用子類型對象,
這樣同樣的引用調用同樣的方法就會根據子類對象的不同而表現出不同的行爲)。
4)抽象:抽象是將一類對象的共同特徵總結出來構造類的過程,包括數據抽象和行爲抽象兩方面。抽象只關注對象
有哪些屬性和行爲,並不關注這些行爲的細節是什麼。

接口和抽象類的區別

抽象類和接口均包含抽象方法,類必須實現所有的抽象方法,否則是抽象類

抽象類和接口都不能實例化,他們位於繼承樹的頂端,用來被其他類繼承和實現

兩者的區別主要體現在兩方面:語法方面和設計理念方面

語法方面的區別是比較低層次的,非本質的,主要表現在:

接口中只能定義全局靜態常量,不能定義變量。抽象類中可以定義常量和變量。

接口中所有的方法都是全局抽象方法。抽象類中可以有0個、1個或多個,甚至全部都是抽象方法。

抽象類中可以有構造方法,但不能用來實例化,而在子類實例化是執行,完成屬於抽象類的初始化操作。接口中不能定義構造方法。

一個類只能有一個直接父類(可以是抽象類),但可以充實實現多個接口。一個類使用extends來繼承抽象類,使用implements來實現接口。

一個類只能有一個直接父類(可以是抽象類),但可以充實實現多個接口。一個類使用extends來繼承抽象類,使用implements來實現接口。

抽象類體現了一種繼承關係,目的是複用代碼,抽象類中定義了各個子類的相同代碼,可以認爲父類是一個實現了部分功能的“中間產品”,而子類是“最終產品”。父類和子類之間必須存在“is-a”的關係,即父類和子類在概念本質上應該是相同的。

接口並不要求實現類和接口在概念本質上一致的,僅僅是實現了接口定義的約定或者能力而已。接口定義了“做什麼”,而實現類負責完成“怎麼做”,體現了功能(規範)和實現分離的原則。接口和實現之間可以認爲是一種“has-a的關係”

 

  • 接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。

  • 類可以實現很多個接口,但是隻能繼承一個抽象類

  • 類如果要實現一個接口,它必須要實現接口聲明的所有方法。但是,類可以不實現抽象類聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。

  • 抽象類可以在不提供接口方法實現的情況下實現接口。

  • Java接口中聲明的變量默認都是final的。抽象類可以包含非final的變量。

  • Java接口中的成員函數默認是public的。抽象類的成員函數可以是private,protected或者是public。

  • 接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含main方法的話是可以被調用的。

 

Java 中實現多態的機制是什麼?

靠的是父類或接口定義的引用變量可以指向子類或具體實現類的實例對象,而程序調用的方法在運行期才動
態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個對象的方法,而不是引用變
量的類型中定義的方法。

反射的作用:   擴展:https://blog.csdn.net/yangyuscript/article/details/79257055

通過反射可以使程序代碼訪問裝載到JVM 中的類的內部信息

1) 獲取已裝載類的屬性信息

2) 獲取已裝載類的方法

3) 獲取已裝載類的構造方法信息

反射的優點:

增加程序的靈活性。

如struts中。請求的派發控制。

當請求來到時。struts通過查詢配置文件。找到該請求對應的action。已經方法。

然後通過反射實例化action。並調用響應method。

如果不適用反射,那麼你就只能寫死到代碼裏了。

所以說,一個靈活,一個不靈活。

很少情況下是非用反射不可的。大多數情況下反射是爲了提高程序的靈活性。因此一般框架中使用較多。因爲框架要適用更多的情況。對靈活性要求較高。

 

進程和線程的區別是什麼?

進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.

線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.

有哪些線程安全的類?

vector:就比arraylist多了個同步化機制(線程安全),因爲效率較低,現在已經不太建議使用。在web應用中,特別是前臺頁面,往往效率(頁面響應速度)是優先考慮的。

statck:堆棧類,先進後出

hashtable:就比hashmap多了個線程安全

enumeration:枚舉,相當於迭代器

除了這些之外,其他的都是非線程安全的類和接口。

線程安全的類其方法是同步的,每次只能一個訪問。是重量級對象,效率較低。

 

----

HashMap 和 HashTable 有什麼區別?
HashMap 是線程不安全的,HashMap 是一個接口,是 Map 的一個子接口,是將鍵映射到值得對象,不允許鍵值重複,

允許空鍵和空值;由於非線程安全,HashMap 的效率要較 HashTable 的效率高一些.
HashTable 是線程安全的一個集合,不允許 null 值作爲一個 key 值或者 Value 值;
HashTable 是 sychronize,多個線程訪問時不需要自己爲它的方法實現同步,而 HashMap 在被多個線程訪問的時
候需要自己爲它的方法實現同步;

2. 多線程併發修改一 個 集合 怎麼辦

用老的Vector/Hashtable類

 

 

總結

Java線程間具有優先級,在調用棧可以設置優先級別(1-10)

yield()方法:暫停當前正在執行的線程對象,並執行其他線程。

yield()應該做的是讓當前運行線程回到可運行狀態,以允許具有相同優先級的其他線程獲得運行機會。因此,使用yield()的目的是讓相同優先級的線程之間能適當的輪轉執行。但是,實際中無法保證yield()達到讓步目的,因爲讓步的線程還有可能被線程調度程序再次選中。

結論:yield()從未導致線程轉到等待/睡眠/阻塞狀態。在大多數情況下,yield()將導致線程從運行狀態轉到可運行狀態,但有可能沒有效果。

jion()方法:線程實例的join()方法可以使得一個線程在另一個線程結束後再執行,即也就是說使得當前線程可以阻塞其他線程執行;

thread.Join把指定的線程加入到當前線程,可以將兩個交替執行的線程合併爲順序執行的線程。

比如在線程B中調用了線程A的Join()方法,直到線程A執行完畢後,纔會繼續執行線程B。

詳細說明

理解線程的優先權

接下來,理解線程優先級是多線程學習很重要的一步,尤其是瞭解yield()函數的工作過程。

  1. 記住當線程的優先級沒有指定時,所有線程都攜帶普通優先級。
  2. 優先級可以用從1到10的範圍指定。10表示最高優先級,1表示最低優先級,5是普通優先級。
  3. 記住優先級最高的線程在執行時被給予優先。但是不能保證線程在啓動時就進入運行狀態。
  4. 與在線程池中等待運行機會的線程相比,當前正在運行的線程可能總是擁有更高的優先級。
  5. 由調度程序決定哪一個線程被執行。
  6. t.setPriority()用來設定線程的優先級。
  7. 記住在線程開始方法被調用之前,線程的優先級應該被設定。
  8. 你可以使用常量,如MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY來設定優先級

現在,當我們對線程調度和線程優先級有一定理解後,讓我們進入主題。

yield()方法

理論上,yield意味着放手,放棄,投降。一個調用yield()方法的線程告訴虛擬機它樂意讓其他線程佔用自己的位置。這表明該線程沒有在做一些緊急的事情。注意,這僅是一個暗示,並不能保證不會產生任何影響。

讓我們列舉一下關於以上定義重要的幾點:

  • Yield是一個靜態的原生(native)方法
  • Yield告訴當前正在執行的線程把運行機會交給線程池中擁有相同優先級的線程。
  • Yield不能保證使得當前正在運行的線程迅速轉換到可運行的狀態
  • 它僅能使一個線程從運行狀態轉到可運行狀態,而不是等待或阻塞狀態

具體的程序見參考連接

join()方法使用示例

線程實例的join()方法可以使得一個線程在另一個線程結束後再執行。如果join()方法在一個線程實例上調用,當前運行着的線程將阻塞直到這個線程實例完成了執行。例如下面代碼所示,t將阻塞t1知道t執行完畢後在執行t1;

在join()方法內可以設定超時,使得join()方法在超時後無效。當超時時,主方法和任務線程申請運行的時候是平等的。然而,當涉及sleep時,join()方法依靠操作系統計,所以你不應該假定join()方法將會等待你指定的時間。

像sleep,join通過拋出InterruptedException對中斷做出迴應。

 

同步方法和同步代碼塊

事務的特性

框架題

 

Servlet的生命週期

Servlet 的生命週期:Servlet 加載—>實例化—>服務—>銷燬。

    init():在Servlet的生命週期中,僅執行一次init()方法。它是在服務器裝入Servlet時執行的,負責初始化Servlet對象。可以配置服務器,以在啓動服務器或客戶機首次訪問Servlet時裝入Servlet。無論有多少客戶機訪問Servlet,都不會重複執行init()。
    service():它是Servlet的核心,負責響應客戶的請求。每當一個客戶請求一個HttpServlet對象,該對象的Service()方法就要調用,而且傳遞給這個方法一個“請求”(ServletRequest)對象和一個“響應”(ServletResponse)對象作爲參數。在HttpServlet中已存在Service()方法。默認的服務功能是調用與HTTP請求的方法相應的do功能。
    destroy(): 僅執行一次,在服務器端停止且卸載Servlet時執行該方法。當Servlet對象退出生命週期時,負責釋放佔用的資源。一個Servlet在運行service()方法時可能會產生其他的線程,因此需要確認在調用destroy()方法時,這些線程已經終止或完成。
 

 

 

 

Spring 

 

 

 

 

事務(transcation)的介紹

    事務就是用戶定義的一系列執行SQL語句的操作, 這些操作要麼完全地執行,要麼完全地都不執行, 它是一個不可分割的工作執行單元。
    事務的使用場景:
    在日常生活中,有時我們需要進行銀行轉賬,這個銀行轉賬操作背後就是需要執行多個SQL語句,假
    如這些SQL執行到一半突然停電了,那麼就會導致這個功能只完成了一半,這種情況是不允許出現,
    要想解決這個問題就需要通過事務來完成。

事務的四大特性:

    原子性(Atomicity)

    一致性(Consistency)

    隔離性(Isolation)

    持久性(Durability)

    原子性:

    一個事務必須被視爲一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼
    全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性

    一致性:

數據庫總是從一個一致性的狀態轉換到另一個一致性的狀態。(在前面的例子中,一致性確保了,即
使在轉賬過程中系統崩潰,支票賬戶中也不會損失200美元,因爲事務最終沒有提交,所以事務中所做
的修改也不會保存到數據庫中。)

    隔離性:

通常來說,一個事務所做的修改操作在提交事務之前,對於其他事務來說是不可見的。(在前面的例
子中,當執行完第三條語句、第四條語句還未開始時,此時有另外的一個賬戶彙總程序開始運行,則
其看到支票帳戶的餘額並沒有被減去200美元。)

    持久性:

一旦事務提交,則其所做的修改會永久保存到數據庫。

說明:事務能夠保證數據的完整性和一致性,讓用戶的操作更加安全。

        事務的特性:
        原子性: 強調事務中的多個操作時一個整體
        一致性: 強調數據庫中不會保存不一致狀態
        隔離性: 強調數據庫中事務之間相互不可見
        持久性: 強調數據庫能永久保存數據,一旦提交就不可撤銷
        MySQL數據庫默認採用自動提交(autocommit)模式, 也就是說修改數據(insert、update、delete)的操 作會自動的觸發事務,完成事務的提交或者回滾
        開啓事務使用 begin 或者 start transaction; 事務 81
        回滾事務使用 rollback;
        pymysql 裏面的 conn.commit() 操作就是提交事務
        pymysql 裏面的 conn.rollback() 操作就是回滾事務
 

SpringMvc面試題:

SpringMVC的運作流程?

(1)用戶發送請求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到請求後,調用HandlerMapping處理器映射器,請求獲取Handle;
(3)處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet;
(4)DispatcherServlet 調用 HandlerAdapter處理器適配器;
(5)HandlerAdapter 經過適配調用 具體處理器(Handler,也叫後端控制器);
(6)Handler執行完成返回ModelAndView;
(7)HandlerAdapter將Handler執行結果ModelAndView返回給DispatcherServlet;
(8)DispatcherServlet將ModelAndView傳給ViewResolver視圖解析器進行解析;
(9)ViewResolver解析後返回具體View;
(10)DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)
(11)DispatcherServlet響應用戶。

Springmvc的優點:

(1)可以支持各種視圖技術,而不僅僅侷限於JSP;

(2)與Spring框架集成(如IoC容器、AOP等);

(3)清晰的角色分配:前端控制器(dispatcherServlet) , 請求到處理器映射(handlerMapping), 處理器適配器(HandlerAdapter), 視圖解析器(ViewResolver)。

(4) 支持各種請求資源的映射策略。

Spring MVC的主要組件?

(1)前端控制器 DispatcherServlet(不需要程序員開發)

作用:接收請求、響應結果,相當於轉發器,有了DispatcherServlet 就減少了其它組件之間的耦合度。

(2)處理器映射器HandlerMapping(不需要程序員開發)

作用:根據請求的URL來查找Handler

(3)處理器適配器HandlerAdapter

注意:在編寫Handler的時候要按照HandlerAdapter要求的規則去編寫,這樣適配器HandlerAdapter纔可以正確的去執行Handler。

(4)處理器Handler(需要程序員開發)

(5)視圖解析器 ViewResolver(不需要程序員開發)

作用:進行視圖的解析,根據視圖邏輯名解析成真正的視圖(view)

(6)視圖View(需要程序員開發jsp)

View是一個接口, 它的實現類支持不同的視圖類型(jsp,freemarker,pdf等等)

SpringMVC常用的註解有哪些?

@RequestMapping:用於處理請求 url 映射的註解,可用於類或方法上。用於類上,則表示類中的所有響應請求的方法都是以該地址作爲父路徑。

@RequestBody:註解實現接收http請求的json數據,將json轉換爲java對象。

@ResponseBody:註解實現將conreoller方法返回對象轉化爲json對象響應給客戶。

如何解決POST請求中文亂碼問題,GET的又如何處理呢?

(1)解決post請求亂碼問題:

在web.xml中配置一個CharacterEncodingFilter過濾器,設置成utf-8;

    <filter>

        <filter-name>CharacterEncodingFilter</filter-name>

        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

        <init-param>

            <param-name>encoding</param-name>

            <param-value>utf-8</param-value>

        </init-param>

    </filter>

    <filter-mapping>

        <filter-name>CharacterEncodingFilter</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>

(2)get請求中文參數出現亂碼解決方法有兩個:

①修改tomcat配置文件添加編碼與工程編碼一致,如下:

    <ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

②另外一種方法對參數進行重新編碼:

String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

ISO8859-1是tomcat默認編碼,需要將tomcat編碼後的內容按utf-8編碼。
 

Round 2:

 

 

 

說下原生JDBC操作數據庫的流程

 

 

 

關係型數據庫中連接池的機制是什麼?

 

 

http的常見狀態碼有哪些(至少5個)

web開發種如何輸出某種編碼的字符串?(請寫出關鍵的代碼)

 

實現失去焦點檢測出用戶名的ajax功能.

用戶名<input type="text" id="username"/><span id="msg"></span>

 

 

 

編程題

Java實現

判斷是否是水仙花數

import java.util.Scanner;

public class C4 {

public static void main(String[] args) {

Scanner x=new Scanner(System.in);

System.out.println("請輸入這個數:");

int d=x.nextInt();

int a=d/100;

int b=d/10%10;

int c=d%10;

if(a*100+b*10+c==a*a*a+b*b*b+c*c*c) {

System.out.println( +d+"此數爲水仙花數");

 

}

else {

System.out.println(+d+"此數不是水仙花數" );

}

}

}

所謂水仙花數就是一個三位數,它各位的立方之和加起來的數值等於本身,比如說,153,153 = 1 + 125 + 27 ;

 

 

實現

public class ShuiXianHua{
static int aaa,aa,a;
public static void main(String args[]){
floweer();
}

public static flower(){
int x=0,y=0,z=0;
for(int i=100;i<1000;i++){
x=i/100;
y=(i%100)/10;
z=(i%100)%10;
if(x*x*x+y*y*y+z*z*z==i){
System.out.println(i+"");
}
}
}
}

 

String a="aa"與 String a=new String("aa")的區別?

String a = "aa"; 先在內存中找是不是有"aa" 這個對象,

如果有,就讓a指向那個"aa".如果內存裏沒有"aa",就創建一個新的對象保存"aa".

String a=new String ("aa") 就是不管內存裏是不是已經有"aa"這個對象,

都新建一個對象保存"aa"
String a = new String("aa");是在堆裏面建立的對象 String,a和"aa"
ab="aa";是查找棧裏有沒有"aa",如果有就用ab引用它,如果沒有就把“aa”存進棧


String r ="dsds"; ---------------------生成一個對象 "dsds"
String r =new String ("dsd"); ---------------生成兩個對象,"dsd"和new String ("dsd")

因爲new String("dsd")的參數"dsd"本身就是一個字符串對象,new String("dsd")又返回一個字符串對象。

 

看代碼:

 

 

這就像如果有:

String s1 = "hello"

String s2 = "hello";

System.out.println(s1==s2);


結果爲true,因爲他們的地址值是一致的,都指向常量池中的字符串常量


String s1 = new String("hello");

String s2 = new String("hello");

System.out.println(s1==s2);


結果則是false,因爲他們都在堆中建立了對象,而對象之間的地址值不同

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章