Java核心技術1

Java方法參數的使用狀況:

  1. 一個方法不能修改一個基本數據

對象析構與finalize方法

Java有自動的垃圾回收器,不須要人工回收內存,例如,文件或使用了系統資源的另外一個對象的句柄。在這種狀況下,當資源的再也不須要時,將其回收和再利用將顯得十分重要。能夠爲任何一個類添加 finalize 方法。finalize 方法將在垃圾回收器清除對象以前調用 。在實際應用中,不要依賴於使用finalize 方法回收任何短缺的資源 , 這是由於很難知道這個方法何時纔可以調用。(這點實際上是和net機制是同樣的)html

Java包概念其實就是net中命名空間java

  1. 靜態導入,這樣就可使用靜態方法和靜態域,好比out.println() import static java . lang . System . * ;

Javadoc生成文檔

 

繼承

  1. 經過super調用父類方法,至關於net中的base
  2. 靜態綁定是 private 方法 、 static 方法或 final 方法,除此是動態綁定
  3. 在 Java 中 ,不須要將方法聲明爲虛擬方法 。動態綁定是默認的處理方式 。若是不但願讓一個方法具備虛擬特徵 ,能夠將它標記爲 final
  4. 每次調用方法都要進行搜索,時間開銷至關大。所以,虛擬機預先爲每一個類建立了一個方法表( method table ) , 其中列出了全部方法的簽名和實際調用的方法。這樣一來 ,在真正調用方法的時候 , 虛擬機僅查找這個表就好了。
  5. 在 C # 中 ,若是沒有特別地說明(virtual) ,全部的方法都不具備多態性 。這兩種作法可能都有些偏激 。
  6. 綜上所述 : • 只能在繼承層次內進行類型轉換 。 • 在將超類轉換成子類以前 ,應該使用instanceof 進行檢查。segmentfault

  7. abstract中能夠包含具體實現,不能被實例化,同C#是同樣的。數組

Java 中它容許在運行時肯定數組的大小數據結構

對象中的數據稱爲實例域 ( instance field ) , 操縱數據的過程稱爲方法 ( method )app

泛型數組列表

  1. 數組列表(ArryList)的容量與數組的大小有一個很是重要的區別。若是爲數組分配 100 個元素的存儲空間,數組就有100 個空位置可使用 。而容量爲 100 個元素的數組列表只是擁有保存 100 個元素的潛力 ( 實際上,從新分配空間的話 , 將會超過100 ) , 可是在最初 ,甚至完成初始化構造以後 ,數組列表根本就不含有任何元素 。jvm

  2. 一旦可以確認數組列表的大小再也不發生變化,就能夠調用 trimToSize 方法 。這個方法將存儲區域的大小調整爲當前元素數量所須要的存儲空間數目。垃圾回收器將回收多餘的存儲空間。spa

包裝器

有時,須要將 int 這樣的基本類型轉換爲對象。全部的基本類型都冇一個與之對應的類。。例如,Integer 類對應基本類型 int.一般,這些類稱爲包裝器( wrapper ).net

裝箱和拆箱是編譯器承認的,而不是虛擬機。編譯器在生成類的字節碼時,插人必要的方法調用。虛擬機只是執行這些字節碼 。線程

 

繼承的設計技巧

  1. 將公共操做和域放在超類
  2. 不要使用受保護的域
  3. 使用繼承實現「is-a」關係(父子關係)
  4. 除非全部繼承的方法都有意義,不然不要使用繼承

  5. 在覆蓋方法事,不要改變預期的行爲 假如我就是要這樣設計,Holiday類繼承GregorianCalendar類,那麼我只能把共有方法add覆蓋成合理的代碼,或者什麼都不作,或者拋出一個異常。可是add方法變味了,變的不像我當初設計的那樣了。這裏做者的意思是:不要這樣,在覆蓋父類中的方法時,不要偏離最初的設計想法。

  6. 使用多態,而非類型信息

  7. 不要過多地使用反射

接口

有了抽象類爲何還要引入接口?

使用抽象類表示通用屬性存在這樣一個問題:每一個類只能擴展於一個類。 接口能夠提供多重繼承的大多數好處,同時還能避免多重繼承的複雜性和低效性。

jdk1.8新特性

  1. 接口中支持靜態方法

    public interface InterfaceA {
        static void getName() {
            System.out.println("6666");
        }
     }
  2. 默認方法

    public interface InterfaceA {
        default void getName() {
            System.out.println("6666");
        }
     }
  3. 默認方法解決衝突

  4. 超類優先

  5. 接口衝突

 

內部類

  1. 一個方法能夠引用調用這個方法的對象數據域,內部類既能夠訪問自身的數據域, 也能夠訪問建立它的外圍類對象的數據域。
  2. 外圍類的引用在構造器中設置,編譯器修改了全部內部類的構造器,添加了一個外圍類的引用參數。
  3. 內部類是一種編譯器現象,與虛擬機無關。編譯器將會把內部類翻譯成用$分隔外部類名與內部類名的常規類文件,而虛擬機則對此一無所知。

    TalkingClock$TimePrinter.class

內部類:http://www.javashuo.com/article/p-qxqvuwlq-eb.html

代理類

http://www.javashuo.com/article/p-ykcbqdos-da.html

 

異常分類

  1. 全部異常都是派生自Throwable類,分爲Error和Exception
  2. Error類層次結構描述了Java運行時系統的內部錯誤和資源耗盡錯誤,應用程序不該該拋出這類錯誤。
  3. 應用程序出錯須要關注Exception
  1. 若是出現RuntimeException異常,那麼就必定是你的問題。
  2. Java語言規範將 派生於Error類或RuntimeException類的全部異常稱爲非受( unchecked ) 異常。
  3. 全部其它的異常稱爲受查異常。

若是在子類中覆蓋了超類的一個方法,子類方法中聲明的受查異常不能比超類方 法中聲明的異常更通用( 也就是說,子類方法中能夠拋出更特定的異常,或者根本不拋出任何異常。特別須要說明的是,若是超類方法沒有拋出任何受查常,子類也不能拋出任何受查異常。

帶資源的try語句 try - with - resources ) 的最簡形式爲 : try ( Resource res = . . . ) { work with res }

try塊退出時,會自動調用res.close。

堆棧軌跡

靜態的Thread.getAllStackTrace()方法,它能夠產生全部線程的堆棧軌跡。

Map<Thread,StackTraceElement[ ]> map = Thread.getAl1StackTraces();
for ( Thread t : map .keySet())
{
    StackTraceElement[ ] frames = map.get( t ) ;
    analyze frames  
}

日誌

  1. 全局日誌記錄器

    Logger.getClobal().info()

  2. 關閉/開啓全部級別記錄

    Logger.getClobal().setLevel(Level.OFF)

    Level.ALL

  3. 獲取記錄器

    private static final Logger myLogger = Logger.getLogger("com.mycompany.myapp")

  4. 修改日誌管理器配置

    配置文件地址:jre/lib/1ogging.properties

日誌管理器在VM啓動過程當中初始化,這在 main 執行以前完成。若是在main中調用 System.setProperty("java.util.logging.config.file",file) ,也會調用LogManager.readConfiguration( )來從新初始化曰志管理器。

 

泛型

前期泛型程序設計是用繼承實現的,ArrayList類只維護一個Object引用的數組:

public class ArrayList{
    private Object [ ] elementData;
    public Object get ( int i ) { }
    public void add ( Object o ) {  }
}

問題

這種方式存在的問題:

  1. 當獲取一個值時必須進行強制類型轉換
  2. 這裏沒有錯誤檢査。能夠向數組列表中添加任何類的對象對於這個調用,編譯和運行都不會出錯。然而在其餘地方,若是將 get 的結果強制類型轉換爲 String 類型,就會產生一個錯誤。

泛型約束

public static <T extends Coiparab1e> T min(T[] a)
{

}

一個類型變量或通配符能夠有多個限定,T extends Comparable & Serializable 限定類型用 「 & 」 分隔,而逗號用來分隔類型變量

Net泛型和Java泛型區別

  • 1. net泛型

https://www.cnblogs.com/DebugLZQ/archive/2012/09/03/2669383.html

  • 2. java泛型

http://www.javashuo.com/article/p-stdyutiz-ga.html

  • 3. 本質區別

https://blog.csdn.net/tianshiainiforever/article/details/51698863

  1. 不能建立參數化類型的數組
  2. 泛型類的靜態上下文中類型變量無效

Java泛型系列

  1. 基本用法與類型擦除
  2. 泛型與數組
  3. 通配符的使用

http://www.javashuo.com/article/p-rqpfykzm-dz.html

 

集合

Iterator 接口的 remove 方法將會刪除上次調用 next 方法時返回的元素。 在決定刪除某個元素以前應該先看一下這個元素是很具備實際意義的。然而,若是想要刪除指定位置上的元素,仍然須要越過這個元素。若是調用remove以前沒有調用 next 將是不合法的。若是這樣作,將會拋出一個 IllegalStateException 異常。

Iterator<String> it = c.iterator();
it.next();
it.remove();

 

鏈表

數組列表

散列表

樹集

隊列與雙端隊列

優先級隊列

優先級隊列使用了一個優雅且高效的數據結構,稱爲堆( heap )。堆(可不是jvm中的堆)是一個能夠自我調整的二叉樹,對樹執行添加( add ),和刪除 ( remore ) 操做,可讓最小的元素移動到根,而沒必要花費時間對元素進行排序。

  1. PriorityQueue
相關文章
相關標籤/搜索