單例模式詳解及java常用類
阿新 • • 發佈:2018-04-15
ont 獲得 設計 保持 BE RR instance tro 函數 【單例模式】
確保某一個類,只能產生一個實例。
設計思路:
====將構造函數私有化,確保類外部,不能使用new關鍵字自行創建對象。
====在類內部實例化一個對象,並通過靜態方法返回。
(1)餓漢式單例模式
優點:線程安全
缺點:在類加載的時候,就實例化對象,提前占用系統資源
1 class Dog{ 2 3 private Dog(){ 4 5 System.out.println("小蠢狗"); 6 } 7 8 private static Dog cutedog=new Dog();(2.)懶漢式單例模式: 優點:解決了餓漢式單例,一加載就提前占用資源的問題。 缺點:線程不安全9 10 public static Dog getInstanca(){ 11 return cutedog; 12 } 13 14 }
1 class Dog{ 2 3 private Dog(){ 4 5 System.out.println("小蠢狗"); 6 } 7 8 private static Dog cutedog=null; 9(3.)線程鎖懶漢式模式 通俗來說,就是在懶漢式單例模式的方法上加鎖 synchronized:將一個方法或者代碼塊進行加鎖,同一時間只允許一個線程訪問 使用同步塊對方法進行加鎖,確保懶漢式單例,可以線程安全 缺點:效率低下10 public static Dog getInstanca(){ 11 if (cutedog==null) { 12 cutedog=new Dog(); 13 } 14 return cutedog; 15 } 16 17 }
1 class Dog{2 3 private Dog(){ 4 5 System.out.println("小蠢狗"); 6 } 7 8 private static Dog cutedog=null; 9 10 public static synchronized Dog getInstanca(){ 11 if (cutedog==null) { 12 cutedog=new Dog(); 13 } 14 return cutedog; 15 } 16 17 }
(4.)雙重加鎖懶漢模式:
只有第一次Dog為null時,才進行線程鎖,當後續Dog不為null時,說明第一次已經賦值了,·產生了一個實例,就無需線程鎖,可以允許多個線程同時拿走dogclass Dog{ private Dog(){ System.out.println("小蠢狗"); } private static Dog cutedog=null; public static synchronized Dog getInstanca(){ if (cutedog==null) { synchronized (Dog.class) { if (cutedog==null) { cutedog=new Dog(); } } } return cutedog; } }(5.)靜態內部類實現單例 優點:解決了餓漢式提前占用資源的問題,解決了懶漢式線程不安全的問題,靜態內部類只有當被調用的時候才開始首次被加載。
1 class Dog{ 2 3 private Dog(){ 4 5 System.out.println("小蠢狗"); 6 } 7 8 private static class KIttyDod{ 9 private static Dog cutedog=new Dog(); 10 } 11 public static Dog getInstance(){ 12 return KIttyDod.cutedog; 13 } 14 15 }【Math】 ;?Math位於Java.lang包中 (1.)Math.abs(); 求絕對值 (2.)Math.cbrt(); 求立方根 (3.)Math..sprt();求平方根 (4.)Math.max/min(double1,double2); 返回兩個值中最大最小值 (5.)Math.pow(a,b); 求a的b次方 (6.)Math.floor();返回小於指定浮點數的一個整數,返回的是double類型,例如10.0 Math.ceil();------大於--------- (6.)Math.round();四舍五入,返回一個整數類型,如果傳入double,返回long,傳入float,返回int (7.)Math.rint();返回最接近參數的整數,如果10.5與10和11同時接近,返回偶數 (8.)Math.random();返回[0.1,1.0)之間的double隨機值 【求一個數保留幾位小數】 double a=23.22122222; double b=Math.round(a*Math.pow(10, 3))/Math.pow(10, 3); System.out.println(b); 【Date】 /**實例化 * 空參構造,默認取到當前時間 */ Date date=new Date(); Date d=new Date(); /** * 傳入一個long類型的時間戳,取到指定時間。 * date.getTime(); 取到一個時間的時間戳,從0時區,1970年1月1日0:0:0到當前時間毫秒數。 */ System.out.println(d); (1.)equals();比對兩個時間是否相等 (2.)a.before(b); 檢測一個時間是不是在制定時間之前 after(): --------------------------------------之後 (3.)a.compare to(b); 前面>參數 返回1 前面<小於參數,返回-1 相等,返回0 (4.)setTime();傳入一個長整型(時間戳),重新設置時間 (5.)toString();格式化日期轉義格式yyyy-mm-dd。 【SimpleDateFormat】 對日期格式進行實例化。 實例化對象時,傳入格式化參數,用字母代表對應部分。 * 字母 日期或時間元素 表示 示例 * y 年 Year 1996; 96 * M 年中的月份 Month July; Jul; 07 * d 月份中的天數 Number 10 * E 星期中的天數 Text Tuesday; Tue * H 一天中的小時數(0-23) Number 0 * h am/pm 中的小時數(1-12) Number 12 * m 小時中的分鐘數 Number 30 * s 分鐘中的秒數 Number 55 (1.)format();用於傳人一個Date類型的參數,並返回格式化之後的字符串 Date date=new Date(); SimpleDateFormat sf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E" ); String s=sf.format(date); System.out.println(s); (2.)sf.parse("2018年04月13日 14:08:15 星期五");將字符串格式的時間,轉成Date類型,要求傳入的字符串格式,必須與實例化時的模式,保持一致。 (3.)toPattern();返回當前格式化的模式字符串。 【Calendar日歷類】 Calendar ca=Calendar.getInstance(); (1.)Calendar日歷類是一個抽象類,不能直接通過new拿到對象,必須使用Calendar.getInstance();拿到一個Calendar日歷類對象 (2.)ca.getTime(); 返回一個日期對象 (3.)ca.add(int field, int amount) ; 根據日歷的規則,將指定的時間量添加或減去給定的日歷字段。 【Random隨機數類】 取隨機數,有兩種構造: --------------空參構造------------ Random ran=new Random(); --------------傳入一個種子數--------只要種子數相同,那麽在相同次數取到的隨機數肯定相同,這是偽隨機數。 Random ran=new Random(100); Random ran=new Random(System.currentTimeMillis()); System.currentTimeMillis();拿到當前時間戳,這樣就是取隨機數了。 (1.)nextInt(); 隨機獲得一個整數 (2.)nextInt(n); 隨機獲得從0到n隨機數,含0不含n 隨機生成兩位隨機數: System.out.println(ran.nextInt(90)+10);
單例模式詳解及java常用類