亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

紀念我曾經的 JAVA 姿勢

2019-11-11 07:48:59
字體:
來源:轉載
供稿:網友

學習java的同學注意了?。。?nbsp;學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:183993990  我們一起學Java!

Java所有的流類位于java.io包中,都分別繼承字以下四種抽象流類型。

Type字節流字符流
輸入流InputStreamReader
輸出流OutputStreamWriter

繼承自InputStream/OutputStream的流都是用于向程序中輸入/輸出數據,且數據的單位都是字節(byte=8bit)。

繼承自Reader/Writer的流都是用于向程序中輸入/輸出數據,且數據的單位都是字符(2byte=16bit)。


異常

Java的異常(包括Exception和Error)分為:

可查的異常(checked exceptions)

除了RuntimeException及其子類以外,其他的Exception類及其子類都屬于可查異常。這種異常的特點是Java編譯器會檢查它,也就是說,當程序中可能出現這類異常,要么用try-catch語句捕獲它,要么用throws子句聲明拋出它,否則編譯不會通過。

不可查的異常(unchecked exceptions)

包括運行時異常(RuntimeException與其子類)和錯誤(Error)。

運行時異常和非運行時異常:

RuntimeException

NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。運行時異常的特點是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。

RuntimeException以外的Exception

從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。

返回目錄


注解

Java SE5內置了三種標準注解:

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface UseCase { public String id(); public String description() default "no description";}

使用注解:

public class PassWordUtils {     @UseCase(id = 47, description = "Passwords must contain at least one numeric")     public boolean validatePassword(String password) {         return (password.matches("//w*//d//w*"));     }      @UseCase(id = 48)     public String encryptPassword(String password) {         return new StringBuilder(password).reverse().toString();     } }

解析注解:

public static void main(String[] args) {     List<Integer> useCases = new ArrayList<Integer>();     Collections.addAll(useCases, 47, 48, 49, 50);     trackUseCases(useCases, PasswordUtils.class); }  public static void trackUseCases(List<Integer> useCases, Class<?> cl) {     for (Method m : cl.getDeclaredMethods()) {         UseCase uc = m.getAnnotation(UseCase.class);         if (uc != null) {             System.out.PRintln("Found Use Case:" + uc.id() + " "                         + uc.description());             useCases.remove(new Integer(uc.id()));         }     }     for (int i : useCases) {         System.out.println("Warning: Missing use case-" + i);     } } // Found Use Case:47 Passwords must contain at least one numeric // Found Use Case:48 no description // Warning: Missing use case-49 // Warning: Missing use case-50

返回目錄


安全性

嚴格遵循面向對象的規范。這樣封裝了數據細節,只提供接口給用戶。增加了數據級的安全性。

無指針運算。java中的操作,除了基本類型都是引用的操作。引用是不能進行增減運算,不能被直接賦予內存地址的,從而增加了內存級的安全性。

數組邊界檢查。這樣就不會出現C/C++中的緩存溢出等安全漏洞。

強制類型轉換。非同類型的對象之間不能進行轉換,否則會拋出ClassCastException

語言對線程安全的支持。java從語言級支持線程。從而從語法和語言本身做了很多對線程的控制和支持。

垃圾回收。

Exception。

返回目錄


類加載

原理

ClassLoader使用的是雙親委托模型來搜索類的,每個ClassLoader實例都有一個父類加載器的引用(不是繼承的關系,是一個包含的關系),虛擬機內置的類加載器(Bootstrap ClassLoader)本身沒有父類加載器,但可以用作其它ClassLoader實例的的父類加載器。

當一個ClassLoader實例需要加載某個類時,它會試圖親自搜索某個類之前,先把這個任務委托給它的父類加載器,這個過程是由上至下依次檢查的,首先由最頂層的類加載器Bootstrap ClassLoader試圖加載,如果沒加載到,則把任務轉交給Extension ClassLoader試圖加載,如果也沒加載到,則轉交給App ClassLoader 進行加載,如果它也沒有加載得到的話,則返回給委托的發起者,由它到指定的文件系統或網絡等URL中加載該類。

如果它們都沒有加載到這個類時,則拋出ClassNotFoundException異常。否則將這個找到的類生成一個類的定義,并將它加載到內存當中,最后返回這個類在內存中的Class實例對象。

JVM在判定兩個class是否相同時,不僅要判斷兩個類名是否相同,而且要判斷是否由同一個類加載器實例加載的。只有兩者同時滿足的情況下,JVM才認為這兩個class是相同的。

加載器

BootStrap ClassLoader

啟動類加載器,是Java類加載層次中最頂層的類加載器,負責加載JDK中的核心類庫,如:rt.jar、resources.jar、charsets.jar等。

   URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();   for (int i = 0; i < urls.length; i++) {       System.out.println(urls[i].toExternalForm());     }   // 也可以通過sun.boot.class.path獲取   System.out.println(System.getProperty("sun.boot.class.path"))

Extension ClassLoader

擴展類加載器,負責加載Java的擴展類庫,默認加載JAVA_HOME/jre/lib/ext/目下的所有jar。

App ClassLoader

系統類加載器,負責加載應用程序classpath目錄下的所有jar和class文件

注意:

除了Java默認提供的三個ClassLoader之外,用戶還可以根據需要定義自已的ClassLoader,而這些自定義的ClassLoader都必須繼承自java.lang.ClassLoader類,也包括Java提供的另外二個ClassLoader(Extension ClassLoader和App ClassLoader)在內。Bootstrap ClassLoader不繼承自ClassLoader,因為它不是一個普通的Java類,底層由C++編寫,已嵌入到了JVM內核當中,當JVM啟動后,Bootstrap ClassLoader也隨著啟動,負責加載完核心類庫后,并構造Extension ClassLoader和App ClassLoader類加載器。

返回目錄


關鍵字

strictfp(strict float point)

strictfp 關鍵字可應用于類、接口或方法。使用strictfp關鍵字聲明一個方法時,該方法中所有的float和double表達式都嚴格遵守FP-strict的限制,符合IEEE-754規范。當對一個類或接口使用strictfp關鍵字時,該類中的所有代碼,包括嵌套類型中的初始設定值和代碼,都將嚴格地進行計算。嚴格約束意味著所有表達式的結果都必須是 IEEE 754算法對操作數預期的結果,以單精度和雙精度格式表示。

如果你想讓你的浮點運算更加精確,而且不會因為不同的硬件平臺所執行的結果不一致的話,可以用關鍵字strictfp。

transiant

變量修飾符,如果用transient聲明一個實例變量,當對象存儲時,它的值不需要維持。

volatile

作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,修飾變量,保證變量每次都是從內存中重新讀取。

final

修飾基礎數據成員(as const)

修飾類或對象的引用

修飾方法的final(cannot overwrite)

修飾類或者參數

返回目錄


初始化

父靜態->子靜態父變量->父初始化區->父構造子變量->子初始化區->子構造


多線程

JAVA多線程實現方式主要有三種:繼承Thread類、實現Runnable接口、使用ExecutorService、Callable、Future實現有返回結果的多線程。其中前兩種方式線程執行完后都沒有返回值,只有最后一種是帶返回值的。

返回目錄


線程池

concurrent下的線程池:

名稱功能
ExecutorService真正的線程池接口
ScheduledExecutorService能和Timer/TimerTask類似,解決那些需要任務重復執行的問題
ThreadPoolExecutorExecutorService的默認實現
ScheduledThreadPoolExecutor繼承ThreadPoolExecutor的ScheduledExecutorService接口實現,周期性任務調度的類實現

Executors

newSingleThreadExecutor

創建一個單線程的線程池。這個線程池只有一個線程在工作,也就是相當于單線程串行執行所有任務。如果這個唯一的線程因為異常結束,那么會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行。

newFixedThreadPool

創建固定大小的線程池。每次提交一個任務就創建一個線程,直到線程達到線程池的最大大小。線程池的大小一旦達到最大值就會保持不變,如果某個線程因為執行異常而結束,那么線程池會補充一個新線程。

newCachedThreadPool

創建一個可緩存的線程池。如果線程池的大小超過了處理任務所需要的線程,那么就會回收部分空閑(60秒不執行任務)的線程,當任務數增加時,此線程池又可以智能的添加新線程來處理任務。此線程池不會對線程池大小做限制,線程池大小完全依賴于操作系統(或者說JVM)能夠創建的最大線程大小。

newScheduledThreadPool

創建一個大小無限的線程池。此線程池支持定時以及周期性執行任務的需求。


線程安全

線程安全是一個很大的問題,Java 最常見的 HttpServlet 就是單實例多線程,解決這樣的問題,有多種方式:

ThreadLocal

ThreadLocal 看下一節的內存圖就很好理解,每個線程都有自己的工作內存,ThreadLocal 就是將變量存到線程自己的工作內存中,所以不會有并發問題。

Synchronizedsynchronized鎖住的是括號里的對象,而不是代碼。對于非 static 的 synchronized 方法,鎖的就是對象本身也就是 this。該關鍵字可以加到:

實例方法

靜態方法

實例方法中的同步塊

靜態方法中的同步塊

ReentrantLock / Conditionsynchronized 不夠靈活,例如讀寫文件,讀和讀之間不應該互斥,這個時候就可以使用 ReentrantLock 增加并發能力。Condition 是綁定到 Lock 上的,可以用于線程間通信,例如這個面試題,就可以使用 Condition 喚起線程寫自己的name 。

有四個線程1、2、3、4。線程1的功能就是輸出1,線程2的功能就是輸出2,以此類推.........現在有四個文件ABCD。初始都為空?,F要讓四個文件呈如下格式:A:1 2 3 4 1 2.... B:2 3 4 1 2 3.... C:3 4 1 2 3 4.... D:4 1 2 3 4 1....

并發容器常見的 ConcurrentHashMap CopyOnWriteArrayList 用于多線程下存放數據,Queue BlockingQueue 用于排隊消費。

Atomic 包在 Atomic 包里一共有 12 個類,四種原子更新方式,分別是原子更新基本類型,原子更新數組,原子更新引用和原子更新字段。某些并發問題,需要無鎖解決時,就可以考慮使用原子方法。

返回目錄


內存模型

Java內存模型規定,對于多個線程共享的變量,存儲在主內存當中,每個線程都有自己獨立的工作內存,線程只能訪問自己的工作內存,不可以訪問其它線程的 工作內存。工作內存中保存了主內存共享變量的副本,線程要操作這些共享變量,只能通過操作工作內存中的副本來實現,操作完畢之后再同步回到主內存當中。

如何保證多個線程操作主內存的數據完整性是一個難題,Java內存模型也規定了工作內存與主內存之間交互的協議,首先是定義了8種原子操作:

lock:將主內存中的變量鎖定,為一個線程所獨占

unclock:將lock加的鎖定解除,此時其它的線程可以有機會訪問此變量

read:將主內存中的變量值讀到工作內存當中

load:將read讀取的值保存到工作內存中的變量副本中。

use:將值傳遞給線程的代碼執行引擎

assign:將執行引擎處理返回的值重新賦值給變量副本

store:將變量副本的值存儲到主內存中。

write:將store存儲的值寫入到主內存的共享變量當中。

內存組成

堆(Heap)

運行時數據區域,所有類實例和數組的內存均從此處分配。Java虛擬機啟動時創建。對象的堆內存由稱為垃圾回收器 的自動內存管理系統回收。

News Generation(Young Generation即圖中的Eden + From Space + To Space)

Eden 存放新生的對象

Survivor Space 兩個 存放每次垃圾回收后存活的對象

Old Generation(Tenured Generation 即圖中的Old Space) 主要存放應用程序中生命周期長的存活對象

非堆內存

JVM具有一個由所有線程共享的方法區。方法區屬于非堆內存。它存儲每個類結構,如運行時常數池、字段和方法數據,以及方法和構造方法的代碼。它是在Java虛擬機啟動時創建的。除了方法區外,Java虛擬機實現可能需要用于內部處理或優化的內存,這種內存也是非堆內存。例如,JIT編譯器需要內存來存儲從Java虛擬機代碼轉換而來的本機代碼,從而獲得高性能。

Permanent Generation  (圖中的Permanent Space)存放JVM自己的反射對象,比如類對象和方法對象

native heap

學習Java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:183993990  我們一起學Java!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品一区二区亚洲| 欧美另类极品videosbest最新版本| 日韩成人高清在线| 亚洲毛片在线观看| 成人xvideos免费视频| 久久这里有精品视频| 成人精品网站在线观看| 97精品国产97久久久久久春色| 91午夜在线播放| 日韩欧美在线免费| 亚洲一区av在线播放| 国产精品久久久久久久久久新婚| 久久精品在线视频| 日韩欧美精品免费在线| 欧美丰满少妇xxxx| 国产精品欧美日韩一区二区| 亚洲精品二三区| 亚洲欧美激情另类校园| 精品偷拍一区二区三区在线看| 亚洲综合小说区| 美日韩精品视频免费看| 精品国模在线视频| 国产视频欧美视频| 最近中文字幕2019免费| 亚洲国产成人精品电影| 成人性生交大片免费看小说| 国产69精品久久久| www.日韩不卡电影av| 欧美性xxxx极品hd欧美风情| 97人人爽人人喊人人模波多| 午夜美女久久久久爽久久| 成人精品视频久久久久| 国产精品狼人色视频一区| 久久综合伊人77777| 国产精品自拍偷拍视频| 一区二区三区回区在观看免费视频| 日韩av影视综合网| 国外成人在线播放| 欧美多人乱p欧美4p久久| www.久久色.com| 国产精品久久久久久一区二区| 成人久久一区二区三区| 亚洲最大的网站| 亚洲www永久成人夜色| 国产精品欧美亚洲777777| 亚洲视频网站在线观看| 亚洲一区二区三| 色综合天天狠天天透天天伊人| 欧美美女18p| 青草青草久热精品视频在线网站| 日本成人黄色片| 青青草成人在线| 欧美视频在线免费| 热久久这里只有精品| 最新国产精品拍自在线播放| 91视频国产高清| 日本sm极度另类视频| 亚洲欧美激情一区| 日韩av高清不卡| 日本精品免费观看| 国产精品天天狠天天看| 97国产成人精品视频| 亚洲一区亚洲二区亚洲三区| 在线激情影院一区| 中文字幕亚洲欧美在线| 色黄久久久久久| 国产日韩欧美夫妻视频在线观看| 国产一区二区三区高清在线观看| 国产精品欧美激情| 亚洲欧美中文日韩v在线观看| 日韩av电影手机在线观看| 91麻豆国产语对白在线观看| 2019中文字幕免费视频| 91精品视频在线| 日韩hd视频在线观看| 久久综合88中文色鬼| 亚洲第一视频网站| 国产成人精品久久二区二区| 国产精品国产福利国产秒拍| 日韩欧美在线第一页| 97国产一区二区精品久久呦| 欧洲美女免费图片一区| 日韩在线观看免费av| 亚洲欧美日韩直播| 日韩中文字幕精品视频| 中文字幕一精品亚洲无线一区| 亚洲免费av片| 欧美裸体视频网站| 国产精品视频公开费视频| 久久久亚洲国产| 亚洲欧美日韩国产精品| 久久久精品2019中文字幕神马| 韩国19禁主播vip福利视频| 亚洲天堂开心观看| 亚洲免费视频在线观看| 久久伊人精品天天| 久久国产精品偷| 亚洲欧美国产精品| 日韩国产在线播放| 全亚洲最色的网站在线观看| 国产精品一区二区三| 青青久久av北条麻妃黑人| 97免费在线视频| 亚洲老板91色精品久久| 亚洲电影第1页| 欧美黄色片视频| 国产精品久久久久久久久久99| 欧美激情免费看| 成人黄色片在线| 亚洲三级 欧美三级| 欧美性猛交视频| 亚洲人成在线观看网站高清| 亚洲高清久久久久久| 成人激情视频在线观看| 清纯唯美亚洲综合| 亚洲国产日韩欧美在线图片| 国产97在线观看| 精品国产一区二区三区四区在线观看| 日韩最新免费不卡| 大桥未久av一区二区三区| 亚洲一区二区三区四区在线播放| 欧美—级高清免费播放| 亚洲成人激情在线| 日韩中文字幕视频在线| 欧美激情欧美激情在线五月| 日韩美女av在线| 欧美电影免费观看大全| 亚洲女人被黑人巨大进入al| 亚洲国产精久久久久久| 97国产精品视频人人做人人爱| 中文字幕欧美精品日韩中文字幕| 精品国产成人av| 欧美日韩精品在线| 久久影院资源网| 伊人久久大香线蕉av一区二区| 国产精品网站大全| 亚洲第一视频网| 欧美另类69精品久久久久9999| 欧美一级片在线播放| 国产免费一区二区三区香蕉精| 亚洲一区二区久久久| 亚洲永久在线观看| 久久成人精品视频| 久久精品成人欧美大片| 久热精品视频在线| 不卡在线观看电视剧完整版| 美女精品视频一区| 亚洲图中文字幕| 亚洲国产成人久久| 久久99亚洲精品| 欧美大片大片在线播放| 成人av在线网址| 亚洲第一区在线| 亚洲第一精品久久忘忧草社区| 97视频在线看| 国产视频精品va久久久久久| 91大神福利视频在线| 亚洲专区中文字幕| 久久亚洲精品国产亚洲老地址| 57pao成人国产永久免费| 亚洲人成人99网站| 亚洲欧美在线一区二区| 亚洲欧美日本伦理| 色噜噜狠狠色综合网图区|