牛客刷題遇到的小知識點

  • JVM的程序計數器1和虛擬機棧2是線程隔離的,方法區3和堆4是共享的。
  • 1:當前線程執行到字節碼的那個位置,執行本地方法時,爲空;2:存儲局部變量,操作數棧,動態鏈接,方法出口等,一個方法->一個棧幀??,一個線程->一個棧;3:JVM加載的所有類信息(名稱、方法信息、字段信息等),靜態變量,常量,編譯器編譯後的代碼等;4:new出來的java對象,爲對象的實例分配內存。
  • package包:必須是源文件非註釋語句的第一條。一個源文件只能指定一個包,所以只能包含一條package語句。
  • %取餘操作只適用於整型、
  • 關於類的靜態成員變量
    • 該類的對象共享其靜態成員變量的值
    • 靜態成員變量可被該類的所有方法訪問
    • 該類的靜態方法只能訪問該類的靜態成員變量
    • 該類的靜態數據成員變量的值可修改,常量成員不可修改。
  • jvm堆內存溢出OOM(“Out of Memory”)異常? JVM堆有持久代Permanent Space 和 Heap Space。持久代中一般存放 靜態數據成員,類、方法等,與GC要回收的Java對象關係不大。heap space,分爲老年代Old Generation 和年輕帶Young GC。Young Generation,執行YoungGC分爲1個Eden區+2個Survivor區。中經歷多次回收依舊存活的對象會複製到Old Generation中,這裏執行FullGC,這裏存放的對象生命週期都較長。Old GC 溢出:設置的內存參數Xmx過小或程序的內存泄露及使用不當問題, 循環上萬次的字符串處理、創建上千萬個對象、在一段代碼內申請上百M甚至上G的內存。持久代溢出:動態加載了大量Java類而導致溢出。通常由於持久代設置過小,動態加載了大量Java類而導致溢出 。
  • ConcurrentHashMap 使用segment來分段和管理鎖,segment繼承自ReentrantLock,因此ConcurrentHashMap使用ReentrantLock來保證線程安全,而不是synchronized關鍵字。
  • 【錯---Array.asList方法返回java.util.ArrayList對象。】返回的列表是Arrays.ArrayList類型,並不是java.util.ArrayList。
  • class Enclosingone {
        //非靜態內部類
        public class InsideOne {}
        //靜態內部類
        public static class InsideTwo{}
    }
    public class inertest{
         public static void main(String args []){
             EnclosingOne eo = new EnclosingOne(); 
             InsideOne obj11 = eo.new InsideOne();//非靜態內部類對象
             Enclosingone.InsideOne obj1 = new Enclosingone().new InsideOne();//非靜態內部類對象(與上兩句等價)
             Enclosingone.InsideTwo obj2 = new Enclosingone.InsideTwo();//靜態內部類對象
             //Outer.Inner a=new Outer().new Inner()(非靜態,先有Outer對象纔能有屬性)
             // 靜態:Outer.Inner a=new Outer.Inner()要把Outer.Inner看做一個整體
        }
    }
  • String s = "hello";
    String t = "hello";
    char c [ ] = {'h','e','1','1','o'};
    System.out.println(s.equals (t)); //true  s和t指向內存常量區的同一個字符串  ;
    System.out.println(t.equals (c));//false 一個返回字符串,一個返回對象 ;
    System.out.println(s==t);// true  s和t指向內存常量區的同一個字符串 ;
    System.out.println(t.equals (new String ("hello")));//true equals用於比較兩個對象的值是否相同,和內存地址無關
  • byte b1=1,b2=2,b3,b6,b8;
    final byte b4=4,b5=6,b7;// final成員變量必須在聲明的時候初始化或者在構造器中初始化,否則就會報編譯錯誤。
    //沒有在聲明時初始化final變量的稱爲空白final變量(blank final variable),它們必須在構造器中初始化,或者調用this()初始化
    b3=(b1+b2);  /*語句1 錯,自動轉爲int,所以正確寫法爲b3=(byte)(b1+b2);或者將b3定義爲int;*/
    b6=b4+b5;    /*語句2 對,b4、b5爲final類型,不會自動提升,所以和的類型視左邊變量類型而定,即b6可以是任意數值類型*/
    b8=(b1+b4);  /*語句3 錯,雖然b4不會自動提升,但b1仍會自動提升,所以結果需要強轉,b8=(byte)(b1+b4);*/
    b7=(b2+b5);  /*語句4,錯,final變量不可以被再次賦值*/
    System.out.println(b3+b6);
  • forward和redirect的描述:
    • forward時,瀏覽器不知道服務器發送的內容是從何處來,瀏覽器地址欄中還是原來的地址
    • 執行執行redirect時,服務器端告訴瀏覽器重新去請求地址
    • forward是內部重定向,redirect是外部重定向
  • A派生出子類B,B派生出子類C,並且在java源代碼中有如下聲明:
    A a0=new A();//Java雖是單繼承,但是繼承具有傳遞性,多態的三種表現形式:繼承重寫,重載,向上轉型。
    A a1=new B();//向上轉型。
    A a2=new C();//創建了一個B的對象,並將A的對象變量(引用)指向B的對象,即父類引用指向子類對象,是可以的。
  • 抽象類是不能實例化,實例化必將加載類,因爲不知道抽象方法的方法體大小,所以不能實例化。
  • final類,不希望被繼承被擴展或者被修改。final方法是可以被繼承的,但是不可以被覆蓋。
  • 採用MVC即是分層模式來設計web應用程序,【可維護性強、可擴展性強、代碼重複少】可以清晰發現問題,增強可維護性,而且面向接口的編程使程序的可擴展性增強,通過MVC統一的處理請求,可以減少代碼的重複,但是代碼量,這個不好說。
  • servlet中init,service,destroy方法

        Servlet是線程不安全的,在Servlet類中可能會定義共享的類變量,這樣在併發的多線程訪問的情況下,不同的線程對成員變量的修改會引發錯誤。定義局部變量,而不是類變量或者對象的成員變量。由於方法中的局部變量是在棧中,彼此各自都擁有獨立的運行空間而不會互相干擾,因此才做到線程安全。

  • 自動拆裝箱(JDK1.5+)
  1. 基本型和基本型封裝型進行“==”運算符的比較,基本型封裝型將會自動拆箱變爲基本型後再進行比較,因此Integer(0)會自動拆箱爲int類型再進行比較,顯然返回true;
  2. 兩個Integer類型進行“==”比較,如果其值在-128至127,那麼返回true,否則返回false, 這跟Integer.valueOf()的緩衝對象有關,這裏不進行贅述。
  3. 兩個基本型的封裝型進行equals()比較,首先equals()會比較類型,如果類型相同,則繼續比較值,如果值也相同,返回true
  4. 基本型封裝類型調用equals(),但是參數是基本類型,這時候,先會進行自動裝箱(基本型變成對應的基本封裝類型),再進行3中的比較
int a=257;
Integer b=257;
Integer c=257;
Integer b2=57;
Integer c2=57;
System.out.println(a==b);//true
//System.out.println(a.equals(b));  //編譯出錯,基本型不能調用equals() 封裝類型可以調用
System.out.println(b.equals(257.0));//false 類型不一樣
System.out.println(b==c);//false 越界
System.out.println(b2==c2);//true 

  • public Method[] getDeclaredMethods()  返回類或接口聲明的所有方法,包括public, protected, default (package) 訪問和private方法的Method對象,但不包括繼承的方法。???沒懂
  • public Method[] getMethods()返回類的所有public方法,包括其繼承類的公用方法,當然也包括它所實現接口的方法。
  • Child extends Parent,那麼一定有
  • 如果Child是interface,那麼Parent必然是interface
    如果Child是interface,那麼Parent必然是interface
    如果Child是class,並且沒有顯示聲明任何構造函數,那麼此時仍然會調用Parent的構造函數















發佈了47 篇原創文章 · 獲贊 16 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章