牛客網Java專項練習筆記


 

抽象類:

1.抽象類可以實現接口,且抽象類可以繼承自抽象類;

2.抽象類指abstract修飾的類,可以包含也可不包含抽象方法;

3.抽象類和接口都不能實例化。

 

接口:

1.接口聲明和外部類是一致的,都只能是public或default,注:default默認為public;

2.接口可以繼承接口;

3.接口不能被實例化;

4.接口必須為public abstract,因為接口是高度抽象的類,它的存在就是被其他類實現,沒有方法體;

5.接口中聲明的變量必須為 public static final;

6.jdk1.8新特性,接口中的方法可以用static,default修飾,且二者修飾的方法要求有方法體。

 


接口和抽象類的區別:

1.一個子類只能繼承一個抽象類(虛類),但能實現多個接口;

2.一個抽象類可以有構造方法,接口沒有構造方法;

3.一個抽象類中的方法不一定是抽象方法,即其中的方法可以有實現(有方法體),接口中的方法都是抽象方法,不能有方法體,只有聲明;

4.一個抽象類可以是public、private、protected、default, 接口只有public;

5.一個抽象類中的方法可以是public、private、protected、default, 接口中的方法只能是public和default.

 

類型轉換:

1.類型轉換發生精度丟失發生在大范圍轉換到小范圍;

2.如double 到 int     int a = (int) 8846.0;

3.byte     1字節    char      2字節 

   short    2字節    int        4字節 

   float     4字節    long     8字節 

   double 8字節    boolean 沒有;
4.java中如果碰到char、byte和short參與運算時,會自動將這些值轉換為int類型然后再進行運算;
5.低級向高級是隱式類型轉換,高級向低級必須強制類型轉換,byte<char<short<int<long<float<double。
 

 

Collection與Collections:

1.java.util.Collection 是一個集合接口,提供了對集合對象進行基本操作的通用接口方法;
2.Collection接口的意義是為各種具體的集合提供了最大化的統一操作方式;
3.java.util.Collections 是一個包裝類,包含有各種有關集合操作的靜態多態方法,不能實例化,就像一個工具類,服務於Java的Collection框架。
 

重寫和重載:

1.重寫是父類與子類之間多態性的一種體現,實現同方法名,同參數,同返回類型,不同的實現,重寫類權限要大與父類;

2.重寫兩同:方法名、形參列表相同,兩小:返回值類型、拋出異常更小,這里的“小”指的是繼承關系的子父類,不是像高贊所謂的float和int的大小之分,一大:訪問修飾符;

 

3.重載是一個類中多態性的體現,方法名相同,參數個數不同,返回類型也可以不同,與修飾符無關;

4. 如果子類構造器沒有顯示地調用超類的構造器,則將自動地調用超類默認(沒有參數)的構造器。如果超類沒有不帶參數的構造器,並且在子類的構造器中有沒有顯示地調用超類的其他構造器,則Java編譯器將報告錯誤。使用super調用構造器的語句必須是子類構造器的第一條語句。

 

 volatile:

1.保證了不同線程對這個變量進行操作時的可見性,即一個線程修改了某個變量的值,這新值對其他線程來說是立即可見的;

2.由於有些時候對 volatile的操作,不會被保存,所以不會造成阻塞,它不可用於多線程環境下的計數器。

 

加載jdbc驅動:

 

1.Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

2.DriverManager.registerDriver(new com.mysql.jdbc.Driver());

3.System.setProperty("jdbc.drivers","com.mysql.jdbc.Driver");

 

socket編程:

 

 

進程區域:

一條進程的棧區、堆區、數據區和代碼區在內存中的映射 
    1>棧區:主要用來存放局部變量, 傳遞參數, 存放函數的返回地址。.esp 始終指向棧頂, 棧中的數據越多, esp的值越小; 
    2>堆區:用於存放動態分配的對象, 當你使用 malloc和new 等進行分配時,所得到的空間就在堆中。動態分配得到的內存區域附帶有分配信息, 所以你  能夠 free和delete它們; 
    3>數據區:全局,靜態和常量是分配在數據區中的,數據區包括bss(未初始化數據區)和初始化數據區。;
注意: 
    1)堆向高內存地址生長; 
    2)棧向低內存地址生長; 
    3)堆和棧相向而生,堆和棧之間有個臨界點,稱為stkbrk。 

 


特殊賦值符號:

1.<<=左移位賦值;

2.>>=帶符號右移位;

3.>>>=無符號右移位。

 

線程:

1.start()用來啟動線程,使其進入可運行狀態,等待獲取cpu使用權;

2.CyclicBarrier讓一組線程等待其他線程;CountDownLatch讓一組線程等待某個事件發生;

3. Callable能夠拋出checked exception。

 

 Java編譯:

1.javac 將源程序編譯為字節碼;

2.java將字節碼解釋為機器碼.exe。

 

代碼執行順序:

父類靜態變量->父類靜態塊->子類靜態變量->子類靜態塊->父類非靜態成員變量->父類構造代碼塊->父類構造函數->子類非靜態變量->子類構造代碼塊->子類構造函數。

 

函數或命名相關:

1.super.getClass().getName(),返回:包名+類名;

2.ArrayList list=new ArrayList();   這種是默認創建大小為10的數組,每次擴容大小為1.5倍;
   ArrayList list=new ArrayList(20);  這種是指定數組大小的創建,沒有擴充;

3.Math.floor()取目標數軸左邊的最近整數。

 

Session:

1.session用來表示用戶會話,session對象在服務端維護,一般tomcat設定session生命周期為30分鍾,超時將失效,也可以主動設置無效;

2.cookie存放在客戶端,可以分為內存cookie和磁盤cookie。內存cookie在瀏覽器關閉后消失,磁盤cookie超時后消失。當瀏覽器發送請求時,將自動發送對應cookie信息,前提是請求url滿足cookie路徑;

3.可以將sessionId存放在cookie中,也可以通過重寫url將sessionId拼接在url。因此可以查看瀏覽器cookie或地址欄url看到sessionId;

4.請求到服務端時,將根據請求中的sessionId查找session,如果可以獲取到則返回,否則返回null或者返回新構建的session,老的session依舊存在。

 

引用傳遞和值傳遞:

1.引用數據類型是引用傳遞(call by reference),基本數據類型是值傳遞(call by value);

2.值傳遞不可以改變原變量的內容和地址---》原因是java方法的形參傳遞都是傳遞原變量的副本,在方法中改變的是副本的值,而不適合原變量的;

3.引用傳遞不可以改變原變量的地址,但可以改變原變量的內容---》原因是當副本的引用改變時,原變量 的引用並沒有發生變化,當副本改變內容時,由於副本引用指向的是原變量的地址空間,所以,原變量的內容發生變化。

 

DBMS四個特性:

1.原子性:實現完整性管理子系統;

2.一致性:實現並發控制子系統;

3.持久性:實現恢復管理子系統;

4.隔離性:實現安全控制管理子系統。

 

敘述正誤:

1.vector是線程安全的ArrayList,在內存中占用連續的空間。初始時有一個初始大小,當數據條數大於這個初始大小后會重寫分配一個更大的連續空間。如果Vector定義為保存Object則可以存放任意類型;

2..try{}catch{}會增加額外的開銷;

3..接口中聲明的'變量'必須為public final static,所以為常量;

4.子類可以訪問父類受保護的成員,但不能訪問私有成員;

5.static 和 final共同修飾的類為靜態不可重寫類,而abstract 和 final不能共同修飾類,抽象類必須重寫;

6.final修飾的變量為基本數據類型時,賦值后無法改變,當final修飾引用類型變量時,在賦值后其指向地址無法改變,但對象內容還是可以改變;

7.final修飾的成員變量在賦值時有三種方式:聲明時賦值,在構造器中賦值,在初始代碼塊中賦值;

8.靜態變量只能在類主體中定義,不能在方法中定義;

9.Java的靜態方法屬於類的成員,實例方法屬於對象的成員。

 

牛油總結:

1.抽象方法只能定義在抽象類中,抽象方法和抽象類必須由abstract修飾,abstract關鍵字只能描述類和方法,不能描述變量。抽象方法只定義方法聲明,不定義方法實現。抽象類不可以被實例化(創建對象),只有通過子類繼承抽象類並覆蓋抽象類中的所有抽象方法后,該子類才可以被實例化,否則該子類還是一個抽象類。抽象類中有構造函數用於給子類對象進行初始化,同時抽象類中可以含有非抽象方法。abstract關鍵字不可以與final,private,static關鍵字共存,因為被final修飾的方法不可以被重寫,意味着子類不可以重寫該方法,如果abstract和final共同修飾父類中的方法,子類要實現抽象方法(abstract的作用),而final又不讓該方法重寫,這相互矛盾。如果private和abstract共同修飾父類中的方法,private修飾則該方法不可以被子類訪問,但是abstract修飾需要子類去實現,兩者產生矛盾。如果static和abstract共同修飾父類中的方法,static表示是靜態的方法,隨着類的加載而加載,則該方法不需要在子類中去實現,這與abstract關鍵字矛盾;

2.static用於修飾成員變量和成員函數,想要實現對象中的共性數據的對象共享,可以將這個數據進行靜態修飾,被靜態修飾的成員可以直接被類名調用,靜態隨着類的加載而加載,而且優先於對象存在。靜態方法只能訪問靜態成員(靜態方法和靜態變量),不可以訪問非靜態成員,這是因為靜態方法加載時,優先於對象存在,所以沒有辦法訪問對象中的成員。靜態方法中不能使用this和super關鍵字,因為this代表本類對象,super代表父類對象,而靜態時,有可能沒有對象存在,所以this和super無法使用;

3.final關鍵字可以修飾類,方法,變量(成員變量內,局部變量,靜態變量),被final修飾的類是一個最終類,不可以被繼承,被final修飾的方法是一個最終方法,不可以被覆蓋,但是可以被繼承。被final修飾的變量只能是一個常量,只能賦值一次。內部類被定義在類中的局部位置上時,只能訪問局部被final修飾的局部變量。

 

異常捕獲和拋出:

1.在異常處理中,若try中的代碼可能產生多種異常則可以對應多個catch語句,若catch中的參數類型有父類子類關系,此時應該將父類放在后面,子類放在前面;

2.throws用於在方法上聲明該方法不需要處理的異常類型,用在方法上后面跟異常類名 可以是多個異常類;

3.throw用於拋出具體異常類的對象,用在方法內 后面跟異常對象只能是一個異常類型實體;

4.拋InterruptedException的代表方法有:

  • java.lang.Object 類的 wait 方法

  • java.lang.Thread 類的 sleep 方法

  • java.lang.Thread 類的 join 方法。

 

ArrayList和LinkedList:

1.ArrayList基於數組實現的,查找快,增刪慢;

2.LinkedList基於鏈表實現的,查找慢,增刪快。

 

訪問控制修飾符:

 

 

forward和redirect的區別:

1.從地址欄顯示來說:

forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然后把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪里來的,所以它的地址欄還是原來的地址.

redirect是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以地址欄顯示的是新的URL;

2.從數據共享來說:

forward:轉發頁面和轉發到的頁面可以共享request里面的數據.

redirect:不能共享數據;

3.從運用地方來說:

forward:一般用於用戶登陸的時候,根據角色轉發到相應的模塊.

redirect:一般用於用戶注銷登陸時返回主頁面和跳轉到其它的網站等;

4.從效率來說:

forward:高.

redirect:低;

5.Forward和Redirect代表了兩種請求轉發方式:直接轉發和間接轉發。對應到代碼里,分別是RequestDispatcher類的forward()方法和HttpServletRequest類的sendRedirect()方法;

 對於間接方式,服務器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL發出請求,從而達到轉發的目的。它本質上是兩次HTTP請求,對應兩個request對象;

 對於直接方式,客戶端瀏覽器只發出一次請求,Servlet把請求轉發給Servlet、HTML、JSP或其它信息資源,由第2個信息資源響應該請求,兩個信息資源共享同一個request對象。

 

類加載:

1. 什么是類加載器?

把類加載的過程放到Java虛擬機外部去實現,讓應用程序決定如何去獲取所需要的類。實現這個動作的代碼模塊稱為“類加載器”。  

2有哪些類加載器,分別加載哪些類

類加載器按照層次,從頂層到底層,分為以下三種: 
 (1)啟動類加載器 : 它用來加載 Java 的核心庫,比如String、System這些類 
 (2)擴展類加載器 : 它用來加載 Java 的擴展庫。

(3) 應用程序類加載器 : 負責加載用戶類路徑上所指定的類庫,一般來說,Java 應用的類都是由它來完成加載的。

3. 雙親委派模型

我們應用程序都是由以上三種類加載器互相配合進行加載的,還可以加入自己定義的類加載器。稱為 類加載器的雙親委派模型 ,這里類加載器之間的父子關系一般不會以繼承的關系來實現,而是都使用 組合關系 來復用父加載器的。

4. 雙親委托模型的工作原理

是當一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的類加載都是如此,因此所有的加載請求最終都應該傳送到頂層的啟動類加載器中,只有當父加載器反饋自己無法加載這個加載請求的時候,子加載器才會嘗試自己去加載。

5. 使用雙親委派模型好處?(原因)

第一:可以避免重復加載,當父親已經加載了該類的時候,子類不需要再次加載。

第二:考慮到安全因素,如果不使用這種委托模式,那我們就可以隨時使用自定義的String來動態替代java核心api中定義類型,這樣會存在非常大的安全隱患,而雙親委托的方式,就可以避免這種情況,因為String已經在啟動時被加載,所以用戶自定義類是無法加載一個自定義的類裝載器。

 6.JVM在判定兩個class是否相同時,不僅要判斷兩個類名是否相同,而且要判斷是否由同一個類加載器實例加載的。

 

JVM:

1.Java  運行時數據區可以分成 方法區、 堆、 棧、 程序計數器、 本地方法棧

2.:Java 對象, 線程之間共享的

3.:方法運行,每一個方法對應一個棧幀,每一個線程對應一個棧,每個棧幀包括 操作數、局部變量表、指向運行時常量池的引用,方法返回地址、附加位區 所以是線程不共享

4.方法區(靜態區):被虛擬機加載的類信息、靜態(static)變量,常量(final),即時編譯器編譯后的代碼等數據。運行常量池是方法區的一部分,class文件除了有類的版本、字段、接口、方法等描述信息之外,還有一項信息常量池保存編譯期生成的字面量和符號引用。 線程之間共享的

5.程序計數器:指出某一個時候執行某一個指令、執行完畢之后要返回的位置,當執行的Java方法的時候,這里保存的當前執行的地址,如果執行的是本地方法的時候,那么程序計數器為空。線程不共享。

 

request:

1.request.getAttribute()方法返回request范圍內存在的對象,而request.getParameter()方法是獲取http提交過來的數據;

2.getAttribute是返回對象,getParameter返回字符串。

 

Java並發:

1.CopyOnWriteArrayList適用於寫少讀多的並發場景;
2.ReadWriteLock即為讀寫鎖,他要求寫與寫之間互斥,讀與寫之間互斥, 讀與讀之間可以並發執行。在讀多寫少的情況下可以提高效率;
3.ConcurrentHashMap是同步的HashMap,讀寫都加鎖;
4.volatile只保證多線程操作的可見性,不保證原子性。

 

集合:

 

Servlet周期:

1.init()--> 初始化;

2.service()  -->  處理請求;

3.destory () --> 銷毀(停止)。
 

Java易錯知識點:

1.靜態內部類才可以聲明靜態方法;

2.靜態方法不可以使用非靜態變量;

3.抽象方法不可以有函數體。

 

int類型轉化問題:

1.intValue()是把Integer對象類型變成int的基礎數據類型; 
2.parseInt()是把String 變成int的基礎數據類型; 
3.Valueof()是把String 轉化成Integer對象類型;(現在JDK版本支持自動裝箱拆箱了。)

 

JavaScript中typeof運算符結果可能為:

1.typeof Symbol()    //"symbol"

2.typeof Number()    //"number"

3.typeof String()    //"string"

4.typeof Function()    //"function"

5.typeof Object()    //"object"

6.typeof Boolean()    //"boolean"

7.typeof null    //"object"

8.typeof undefined    //"undefined"

 

死鎖原因及產生必要條件:

原因:

(1) 因為系統資源不足;
(2) 進程運行推進的順序不合適;
(3) 資源分配不當等。

必要條件:

(1) 互斥條件:一個資源每次只能被一個進程使用;
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放;
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪;
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。

 

Socket編程:

1.客戶端通過new Socket(IP地址,端口號)方法創建通信的Socket對象;

2.服務器端通過new ServerSocket(端口號)創建TCP連接對象 accept接納客戶端請求。

 

sleep和wait的區別:

1.這兩個方法來自不同的類分別是Thread和Object;

2.最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得敏感詞線程可以使用同步控制塊或者方法;

3.wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用;

4.而sleep可以在 任何地方使用 synchronized(x){ x.notify() //或者wait() };

5.sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常。

 

HttpServlet容器響應Web客戶請求流程:

1)Web客戶向Servlet容器發出Http請求;

2)Servlet容器解析Web客戶的Http請求;

3)Servlet容器創建一個HttpRequest對象,在這個對象中封裝Http請求信息;

4)Servlet容器創建一個HttpResponse對象;

5)Servlet容器調用HttpServlet的service方法,這個方法中會根據request的Method來判斷具體是執行doGet還是doPost,把HttpRequest和HttpResponse對象作為service方法的參數傳給HttpServlet對象;

6)HttpServlet調用HttpRequest的有關方法,獲取HTTP請求信息;

7)HttpServlet調用HttpResponse的有關方法,生成響應數據;

8)Servlet容器把HttpServlet的響應結果傳給Web客戶。
doGet() 或 doPost() 是創建HttpServlet時需要覆蓋的方法。

 

運算優先級:

口訣:淡雲一筆安洛三福 單目>算數運算符>移位>比較>按位>邏輯>三目>賦值

單目運算符:+,-,++,--,~(注~n=-n-1)

算數運算符:+,-,*,/,%

移位運算符:<<,>>

關系運算符:>,<,>=,<=,==,!=

位運算符:&,|,~,^,

邏輯運算符:&&,||

三目運算符:表達式1?表達式2:表達式3

賦值運算符:=等。

 

 

Java與C++的差別:

 

匿名內部類:

匿名內部類的創建格式為: new 父類構造器(參數列表)|實現接口(){

                                             //匿名內部類的類體實現

                                        }

  1. 使用匿名內部類時,必須繼承一個類或實現一個接口;

  2. 匿名內部類由於沒有名字,因此不能定義構造函數;

  3. 匿名內部類中不能含有靜態成員變量和靜態方法。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM