5.java高級部分

對於java高級以下指示介紹了最主要的幾種解釋:


--------------------------修飾符------------------------------
java48個修飾符有以下幾個不常用的:
不常用到的關鍵字有:const,goto,native,strictfp,transient,volatile。

其中const和goto爲java中的保留字。


transient 
序列化的時候不被存儲


volatile 
弱同步  volatile修飾變量。在每次被線程訪問時,都強迫從共享內存中重讀該成員變量的值。而且,當成員變量發生變化時,強迫線程將變化值回寫到共享內存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。參見:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html


srticftp 
修飾類和方法,意思是FP-strict,精確浮點,符合IEEE-754規範的。當一個class或interface用strictfp聲明,內部所有的float和double表達式都會成爲strictfp的。


native 
   是方法修飾符。Native方法是由另外一種語言(如c/c++,FORTRAN,彙編)實現的本地方法。

 

--------------------線程池-------------------
java.util.concurrent.Executors工具類

此包中所定義的 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 類的工廠和實用方法。此類支持以下各種方法: 

創建並返回設置有常用配置字符串的 ExecutorService 的方法。 
創建並返回設置有常用配置字符串的 ScheduledExecutorService 的方法。 
創建並返回“包裝的”ExecutorService 方法,它通過使特定於實現的方法不可訪問來禁用重新配置。 
創建並返回 ThreadFactory 的方法,它可將新創建的線程設置爲已知的狀態。 
創建並返回非閉包形式的 Callable 的方法,這樣可將其用於需要 Callable 的執行方法中。 

創建一個線程池,用來執行定任務。 例子: 
http://elf8848.iteye.com/blog/1538673 
Executors. newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory) 

創建一個可重用固定線程數的線程池,以共享的無界隊列方式來運行這些線程。
 
Executors. newFixedThreadPool(int nThreads) 

創建一個可根據需要創建新線程的線程池,但是在以前構造的線程可用時將重用它們,並在需要時使用提供的 ThreadFactory 創建新線程。
 
Executors. newCachedThreadPool(ThreadFactory threadFactory) 

創建一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程。
 
Executors. newSingleThreadExecutor()

 

----------------------------集合類--------------------------------

 

返回一個只包含指定對象的不可變 List。返回的列表是可序列化的。 其中包含一個obj對象
List<T> list=Collections.<T>singletonList(T obj);

返回一個只包含指定對象的不可變 set。返回的 set 是可序列化的。其中包含一個obj對象
 
Set<T> set=Collections.<T>singleton(T obj);

返回一個不可變 的映射,它只將指定鍵映射到指定值。返回的映射是可序列化的。
 
只包含指定鍵-值映射關係的不可變映射。
Map(K ,V) map=Collections.<K,V>singletonMap(K key,V value);

 

返回指定有序 set 的不可修改 視圖。
SortedSet<T> set=Collections.unmodifiableSortedSet(SortedSet<T> s)

返回指定列表的不可修改 視圖。 

List<T> list=Collections.unmodifiableList(List<? extends T> list)

返回指定映射的不可修改 視圖。 

Map<K,V> map=Collections.unmodifiableMap(Map<? extends K,? extends V> m)

 

返回指定列表支持的同步(線程安全的)列表。 
List<T>  a=Collections.synchronizedList(List<T> list) 

返回由指定映射支持的同步(線程安全的)映射。
Map<K,V>  a=Collections.synchronizedMap(Map<K,V> m) 

返回指定 set 支持的同步(線程安全的)set。
Set<T>  a=Collections.synchronizedSet(Set<T> s)

 

---List包含---
如果列表包含指定的元素,則返回 true。 
boolean contains(Object o) 
         
---Map包含---
如果此映射包含指定鍵的映射關係,則返回 true。
boolean containsKey(Object key) 
           
如果此映射將一個或多個鍵映射到指定值,則返回 true。 
boolean containsValue(Object value) 
          
測試此映射表中是否存在與指定值關聯的鍵。(此方法在功能上等同於 containsValue 方法,Hashtable,ConcurrentHashMap中有這個方法)
contains(Object value) 
          
---Set包含---
如果 set 包含指定的元素,則返回 true。 
boolean contains(Object o)

 

 

 

CopyOnWriteArrayList
CopyOnWriteArraySet
它最適合於具有以下特徵的應用程序:
set 大小通常保持很小,只讀操作遠多於可變操作,需要在遍歷期間防止線程間的衝突。 
它是線程安全的。 
因爲通常需要複製整個基礎數組,所以可變操作(add、set 和 remove 等等)的開銷很大。 
迭代器不支持可變 remove 操作。 
使用迭代器進行遍歷的速度很快,並且不會與其他線程發生衝突。在構造迭代器時,迭代器依賴於不變的數組快照。

 

 

-----------------------------類.this 類 的作用--------------------


this指的是當前正在訪問這段代碼的對象,當在內部類中使用this指的就是內部類的對象, 
爲了訪問外層類對象,就可以使用外層類名.this來訪問,一般也只在這種情況下使用這種

 

----------------------------- 類加載器部分 -----------------------

 

請看:《深入探討 Java 類加載器》

http://www.ibm.com/developerworks/cn/java/j-lo-classloader/

 

核心節選:

Java 中的類加載器大致可以分成兩類,一類是系統提供的,另外一類則是由 Java 應用開發人員編寫的。系統提供的類加載器主要有下面三個:

    引導類加載器(bootstrap class loader):它用來加載 Java 的核心庫,是用原生代碼來實現的,並不繼承自 java.lang.ClassLoader。
    擴展類加載器(extensions class loader):它用來加載 Java 的擴展庫。Java 虛擬機的實現會提供一個擴展庫目錄。該類加載器在此目錄裏面查找並加載 Java 類。
    系統類加載器(system class loader):它根據 Java 應用的類路徑(CLASSPATH)來加載 Java 類。一般來說,Java 應用的類都是由它來完成加載的。可以通過 ClassLoader.getSystemClassLoader()來獲取它。

類加載器的代理模式
 
類加載器在嘗試自己去查找某個類的字節代碼並定義它時,會先代理給其父類加載器,由父類加載器先去嘗試加載這個類,依次類推。

線程上下文類加載器
 
線程上下文類加載器(context class loader)是從 JDK 1.2 開始引入的。類 java.lang.Thread中的方法 getContextClassLoader()和 setContextClassLoader(ClassLoader cl)用來獲取和設置線程的上下文類加載器。如果沒有通過 setContextClassLoader(ClassLoader cl)方法進行設置的話,線程將繼承其父線程的上下文類加載器。Java 應用運行的初始線程的上下文類加載器是系統類加載器。在線程中運行的代碼可以通過此類加載器來加載類和資源。

類加載器與 Web 容器
 

對於運行在 Java EE™容器中的 Web 應用來說,類加載器的實現方式與一般的 Java 應用有所不同。不同的 Web 容器的實現方式也會有所不同。以 Apache Tomcat 來說,每個 Web 應用都有一個對應的類加載器實例。該類加載器也使用代理模式,所不同的是它是首先嚐試去加載某個類,如果找不到再代理給父類加載器。這與一般類加載器的順序是相反的。這是 Java Servlet 規範中的推薦做法,其目的是使得 Web 應用自己的類的優先級高於 Web 容器提供的類。這種代理模式的一個例外是:Java 核心庫的類是不在查找範圍之內的。這也是爲了保證 Java 核心庫的類型安全。

----------------------------- 序列化部分 -------------------------

 

 

----------------------------- IO部分 ------------------------------

 

ByteArrayInputStream 字節數組轉流
ByteArrayOutputStream 流轉
字節數組,其中的數據被寫入一個 byte 數組


StringReader 把String讀到Reader
 
StringWriter 把String寫到Write

OutputStreamWriter String轉流,是字符流通向字節流的橋樑

InputStreamReader 流轉String,是字節流通向字符流的橋樑

CharArrayReader 此類實現一個可用作字符輸入流的字符緩衝區。 

CharArrayWriter 此類實現一個可用作 Writer 的字符緩衝區。緩衝區會隨向流中寫入數據而自動增長。可使用 toCharArray() 和 toString() 獲取數據。

爲了獲得最高效率,可考慮將 OutputStreamWriter 包裝到 BufferedWriter 中,以避免頻繁調用轉換器。例如: 

Writer out = new BufferedWriter(new OutputStreamWriter(System.out));

爲了達到最高效率,可要考慮在 BufferedReader 內包裝 InputStreamReader。例如: 

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

RandomAccessFile 此類的實例支持對隨機訪問文件的讀取和寫入。
 

FileReader 用來讀取字符文件的便捷類。
 
FilterWriter 用來寫入字符文件的便捷類。

FileInputStream 從文件系統中的某個文件中獲得輸入字節。
 
FileOutputStream 文件輸出流是用於將數據寫入 File 或 FileDescriptor 的輸出流。

ObjectOutputStream 對象序列化
 
ObjectInputStream 對象序列化

 

----------------------------- IO部分 文本文件編碼------------------------------

 

讀取文本文件內容,並正確指定編碼

Java代碼  收藏代碼
  1. public static void main(String[] args) throws Exception {  
  2.     String path="d:\\計算.txt";  
  3.     File file=new File(path);  
  4.     FileInputStream in=new FileInputStream(file);  
  5.     //文本文件編碼是UTF-8,如果是其它,請修改下面  
  6.     InputStreamReader read = new InputStreamReader(in, "UTF-8");  
  7.     BufferedReader ra = new BufferedReader(read);  
  8.     String s=ra.readLine();  
  9.     while(s!=null){  
  10.         System.out.println(s);  
  11.         s=ra.readLine();  
  12.     }  
  13. }  

 

 

寫入文本文件,並正確指定編碼

Java代碼  收藏代碼
  1. final File file = new File("d:\\a.txt");  
  2. if (!file.exists())  
  3. {  
  4.     new File(file.getParent()).mkdirs();  
  5.     file.createNewFile(); //文件不存在,建立  
  6. }  
  7. final Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));       
  8. out.write("大量文字內容,比如HTML代碼");  
  9. out.flush();  
  10. out.close();  

 

 

問:用JAVA字符流向硬盤寫一個a.txt文件時,默認情況下a.txt會使用什麼字符集編碼?

答:"字符流"默認用JVM中所設置的字符集編碼, JVM是從系統變量file.encoding中讀取操作系統的默認編碼的字符集,來設置JVM的字符集編碼的。

要查看系統的file.encoding參數,可以用以下代碼:

 

Java代碼  收藏代碼
  1. public static void main(final String[] args)  
  2.  {  
  3.   final String encoding = System.getProperty("file.encoding");  
  4.   System.out.println(encoding);  
  5.  }  

 

 結果與操作系統(我用MS Windows)的區域語言有關係,如下表

 

標準和格式 JVM默認字符集
中文(中國) GBK
中文(新加坡) GBK
中文(香港特別行政區) MS950
中文(澳門特別行政區) MS950
中文(臺灣) MS950

 

 ---------------------------------Java 網絡編碼解碼-----------------------------------------

java.net.URLEncoder 
java.net.URLDecoder

Java代碼  收藏代碼
  1. try {     
  2.     String encodeStr = URLEncoder.encode("中國""utf-8");     
  3.     System.out.println("處理後:" + encodeStr);     
  4.     String decodeStr = URLDecoder.decode(encodeStr, "utf-8");     
  5.     System.out.println("解碼:" + decodeStr);     
  6. catch (UnsupportedEncodingException e) {     
  7.     // TODO Auto-generated catch block     
  8.     e.printStackTrace();     
  9. }   

處理後:%E4%B8%AD%E5%9B%BD   
解碼:中國 


      轉載自:http://elf8848.iteye.com/blog/1535003


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