對於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部分 文本文件編碼------------------------------
讀取文本文件內容,並正確指定編碼
- public static void main(String[] args) throws Exception {
- String path="d:\\計算.txt";
- File file=new File(path);
- FileInputStream in=new FileInputStream(file);
- //文本文件編碼是UTF-8,如果是其它,請修改下面
- InputStreamReader read = new InputStreamReader(in, "UTF-8");
- BufferedReader ra = new BufferedReader(read);
- String s=ra.readLine();
- while(s!=null){
- System.out.println(s);
- s=ra.readLine();
- }
- }
寫入文本文件,並正確指定編碼
- final File file = new File("d:\\a.txt");
- if (!file.exists())
- {
- new File(file.getParent()).mkdirs();
- file.createNewFile(); //文件不存在,建立
- }
- final Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
- out.write("大量文字內容,比如HTML代碼");
- out.flush();
- out.close();
問:用JAVA字符流向硬盤寫一個a.txt文件時,默認情況下a.txt會使用什麼字符集編碼?
答:"字符流"默認用JVM中所設置的字符集編碼, JVM是從系統變量file.encoding中讀取操作系統的默認編碼的字符集,來設置JVM的字符集編碼的。
要查看系統的file.encoding參數,可以用以下代碼:
- public static void main(final String[] args)
- {
- final String encoding = System.getProperty("file.encoding");
- System.out.println(encoding);
- }
結果與操作系統(我用MS Windows)的區域語言有關係,如下表
標準和格式 JVM默認字符集
中文(中國) | GBK |
中文(新加坡) | GBK |
中文(香港特別行政區) | MS950 |
中文(澳門特別行政區) | MS950 |
中文(臺灣) | MS950 |
---------------------------------Java 網絡編碼解碼-----------------------------------------
java.net.URLEncoder
java.net.URLDecoder
- try {
- String encodeStr = URLEncoder.encode("中國", "utf-8");
- System.out.println("處理後:" + encodeStr);
- String decodeStr = URLDecoder.decode(encodeStr, "utf-8");
- System.out.println("解碼:" + decodeStr);
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
處理後:%E4%B8%AD%E5%9B%BD
解碼:中國
轉載自:http://elf8848.iteye.com/blog/1535003