- 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+)
- 基本型和基本型封裝型進行“==”運算符的比較,基本型封裝型將會自動拆箱變爲基本型後再進行比較,因此Integer(0)會自動拆箱爲int類型再進行比較,顯然返回true;
- 兩個Integer類型進行“==”比較,如果其值在-128至127,那麼返回true,否則返回false, 這跟Integer.valueOf()的緩衝對象有關,這裏不進行贅述。
- 兩個基本型的封裝型進行equals()比較,首先equals()會比較類型,如果類型相同,則繼續比較值,如果值也相同,返回true
- 基本型封裝類型調用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的構造函數