Java小白的幹貨鋪子(五)
1.Math類
Math 類提供了一序列基本數學運算和幾何函數的方法。
Math類是final類,並且它的所有成員變量和成員方法都是靜態的。jiduanz
常用的一些靜態方法:
double pow (double a, double b) // 計算a的b次方 doublesqrt (double a) //計算給定值的平方根 int abs(int a) //計算int 類型值 a的絕對值,也接收 long、float 和 double 類型的參數 double ceil (double a)//返回大於等於a的最小整數的double值 double floor (double a) //返小於等於a的最小整數的double值 int max(int a, int b)//返回int 型值 a 和 b 中的較大值,也接收 long、float 和 double 類型的參數 int min(int a, int b)//返回a 和 b 中的較小值,也可接收 long、float 和 double 類型的參數 int round(float a);//四舍五入返回整數 double random()//返回帶正號的double值,該值大於等於0.0且小於1.0 如下例: public class MathDemo { public static void main(String[] args) { double powResult=Math.pow(2,3); System.out.println("2的3次方為:"+powResult); System.out.println("8的平方根:"+Math.sqrt(8)); System.out.println("-7.35的絕對值是:"+Math.abs(-7.35)); System.out.println("8.1向上取整:"+Math.ceil(8.1)); System.out.println("9.9向下取整:"+Math.floor(9.9)); System.out.println("8.499四舍五入的結果:"+Math.round(8.499)); System.out.println("8.5四舍五入的結果:"+Math.round(8.5)); System.out.println("隨機返回一個從0.0(包括)到1.0(不包括)值:"+Math.random()); int ran=(int)(Math.random()*16)+3; System.out.println("隨機返回3到18的數字:"+ran); System.out.println("圓周率是:"+Math.PI); } }
2.Random類
常用方法: public int nextInt(int bound)
返回從0(包含)到bound(不包含)的一個“偽隨機”整數值。
public class RandomDemo { public static void main(String[] args) { Random ran=new Random(); int result=ran.nextInt(16)+3; System.out.println("隨機返回3到18的數字:"+result); System.out.println("隨機返回boolean值:"+ran.nextBoolean()); } }
3.System類
成員變量
System類內部包含in、out和err三個成員變量,分別代表標準輸入流(鍵盤輸入),標準輸出流(顯示器)和標準錯誤輸出流(顯示器)。
public static void main(String[] args) { System.out.println("正常輸出信息..."); System.err.println("輸出標準錯誤信息..."); int[] a = {1,2,3,4}; int[] b = new int[5]; System.arraycopy(a,1,b,3,2); // 數組拷貝 for(int x:b){ System.out.print(x+" "); } System.exit(0); // 退出程序 }
exit()方法:
格式:
public static void exit(int status)
該方法的作用是退出程序。其中status的值為0代表正常退出,非零代表異常退出。使用該方法可以在圖形界面編程中實現程序的退出功能等。
gc()方法:
格式:
public static void gc()
該方法的作用是請求系統進行垃圾回收。至於系統是否立刻回收,則取決於系統中垃圾回收算法的實現以及系統執行時的情況。垃圾回收時,會先調用finalize()方法,釋放非java資源。
currentTimeMillis方法:
格式:
public static long currentTimeMillis()
以毫秒為單位返回從1970年1月1日午夜到當前時間的毫秒數。
4. Runtime類
作用:使應用程序與其運行的環境相關聯。
通過使用getRuntime()靜態方法獲得實例。exec(String command)在單獨的進程中執行指定的字符串命令,該方法返回Process對象,使用Process對象的destroy()方法可以殺掉進程。
public class RuntimeDemo { public static void main(String[] args) { Runtime rt= Runtime.getRuntime(); rt.gc(); // 顯式請求JVM進行垃圾回收gc System.out.println("當前JVM的內存總量是:"+rt.totalMemory()+"字節"); System.out.println("JVM試圖使用的最大內存量:"+rt.maxMemory()); System.out.println("當前JVM的空閑內存量:"+rt.freeMemory()); try { rt.exec("notepad"); rt.exec("calc"); Process qq=rt.exec("F:\\Program Files (x86)\\Tencent\\QQ\\Bin\\QQ.exe"); // 打開QQ進程 Scanner scan=new Scanner(System.in); System.out.print("要關閉QQ嗎?y/n"); String choice=scan.next(); if("y".equals(choice)){ qq.destroy(); // 銷毀進程 } } catch (IOException e) { e.printStackTrace(); } } }
5. Date類與SimpleDateFormat類
Date類:表示日期和時間。提供操作日期和時間各組成部分的方法。
SimpleDateFormat類
用於定制日期時間的格式。
Datedate= new Date(); //創建日期對象 SimpleDateFormatsdf=new SimpleDateFormat("yyyy-MM-ddHH:mm:ss");//定制日期格式 String now = sdf.format(date); System.out.println(now);
6. Calendar類
抽象類,用於設置和獲取日期/時間數據的特定部分。Calendar類提供一些方法和靜態字段來操作日歷。
方法或屬性 | 說明 |
int get(int field) | 返回給定日歷字段的值 |
MONTH | 指示月 |
DAY_OF_MONTH | 指示一個月中的某天 |
DAY_OF_WEEK | 指示一個星期中的某天 |
public class CalendarDemo { public static void main(String[] args) { Calendar cal=Calendar.getInstance(); System.out.println("第幾個月:"+(cal.get(Calendar.MONTH)+1)); System.out.println("當前月的第幾天:"+cal.get(Calendar.DAY_OF_MONTH)); System.out.println("星期幾:"+cal.get(Calendar.DAY_OF_WEEK)); System.out.println("今年的第幾天:"+cal.get(Calendar.DAY_OF_YEAR)); System.out.println("*******************************"); } }
二. 正則表達式
定義:正則表達式(regex)是使用字符串來描述、匹配一系列符合某個句法規則的字符串。
用途:匹配、切割、替換、獲取字符串。
組成:正則表達式由一些普通字符和一些元字符組成。
元字符 | 描述 |
^ | 匹配輸入字符串的開始位置 |
$ | 匹配輸入字符串的結束位置 |
\d | 匹配一個數字字符。等價於[0-9] |
\D | 匹配一個非數字字符。等價於[^0-9] |
\s | 匹配任何空白字符,包括空格、制表符、換頁符等等。等價於[ \n\r\t\f] |
\S | 匹配任何非空白字符。等價於[^\n\r\t\f] |
\w | 匹配包括下劃線的任何單個字符。等價於"[A-Za-z0-9_]" |
\W | 匹配任何非單個字符。等價於“[^A-Za-z0-9_]” |
. | 匹配除“\r\n”之外的任何單個字符 |
{n} | n是一個非負整數。匹配確定的n次 |
{n,} | n是一個非負整數。至少匹配n次 |
{n,m} | m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次 |
* | 匹配前面的子表達式零次或多次(大於等於0次) |
? | 匹配前面的子表達式零次或一次 |
+ | 匹配前面的子表達式一次或多次(大於等於1次) |
在Java中反斜線”\”有三種含義:
(1)反斜線後面可以加特定字符,組成所謂的“轉義字符”。eg: \n \t 。
(2)用於取消元字符的意義,使元字符變為普通字符。eg: “\\” 代表”\”。
(3)用於組成正則表達式中的元字符。eg: “\d” 在正則表達式中代表“匹配一個數字字符”。
1.Pattern類與Matcher類
(1)Pattern類與Matcher類都在java.util.regex包中定義。
(2)Pattern類的對象代表正則表達式編譯之後的對象;Matcher類主要用於執行驗證。
(3)Pattern類的主要方法:
public static Pattern compile(String regex); public Matcher matcher(CharSequence input)
Matcher類的主要方法:
public boolean matches();
public class RegexMatch { public static void main(String[] args) { String birthday="1994-02-25"; String regex="\\d{4}-\\d{2}-\\d{2}"; Pattern pat=Pattern.compile(regex); // 將正則表達式封裝到Pattern對象中 Matcher mat=pat.matcher(birthday); // 創建一個匹配器Matcher,該Matcher對象可以根據正則表達式判斷傳入的字符串是否符合要求 if(mat.matches()){ System.out.println("匹配成功!"); }else{ System.out.println("匹配失敗..."); } }
2.String類對正則表達式的支持
public boolean matches(String regex) //判斷字符串是否與給定的正則表達式匹配。
public String replaceAll(String regex,String replacement) //字符串替換
public String[] split(String regex) //字符串拆分
public class StringRegex { public static void main(String[] args) { String str="hello1java22regex333python4444C55555"; if(str.matches("\\w+")){ System.out.println("匹配成功!"); } System.out.println("替換後的字符串為:"+str.replaceAll("\\d+","#")); String country="中國|美國|俄羅斯|德國"; String[] array=country.split("\\|"); for(String c:array){ System.out.print(c+" "); } }
補充:
正則表達式中的問號?有兩種作用:第一種作用:重復前面表達式0次或1次。第二種作用:在表示次數的元字符後加上?代表取消默認的貪婪匹配模式,變為“非貪婪匹配模式”。
public class GreedyRegex { public static void main(String[] args) { String str="abbbbbbb"; System.out.println("貪婪模式匹配: "+str.replaceAll("ab+","#")); // "貪婪匹配" System.out.println("非貪婪模式匹配: "+str.replaceAll("ab+?","#")); } }
三.枚舉類型
枚舉類型使用一組常量值來表示特定的數據集合,該集合中數據的數目確定(通常較少),且這些數據只能取預先定義的值。
2. Java枚舉類型均自動繼承java.lang.Enum類(該類繼承了Object類)。
聲明枚舉類型:
[public] enum 枚舉類型名稱{ 枚舉對象1,枚舉對象2,…,枚舉對象n ; }
獲取枚舉對象的兩種方法:
方法一:取得單個枚舉對象
枚舉.對象名
方法二:取得全部枚舉對象
枚舉.values()
註意:枚舉.values()返回的是一個對象數組,可以通過遍歷該對象數組獲取所有枚舉對象。
package enumdemo; public enum ColorEnum { RED,GREEN,BLUE; } public class TestColor { public static void main(String[] args) { ColorEnum r=ColorEnum.RED; System.out.println(r); System.out.println("遍歷所有枚舉對象:"); for(ColorEnum c:ColorEnum.values()){ System.out.print(c+" "); } } }
四.集合
1.定義:Java API所提供的一系列類的實例,可以用於動態存放多個對象。
Java集合框架提供了一套性能優良、使用方便的接口和類,它們位於java.util包中 。
特點:長度不固定,只能存儲引用類型對象。
首先了解一下JAVA集合的框架:
(1)主接口有collection和Map接口;
(2)Collection有兩個子接口,List和Set接口。
(3)ArrayList和LinkedList為兩個實現類,繼承list接口。HashSet和TreeSet為Set的兩個實現類。
Collection 接口定義了存取對象的方法。兩個常用的子接口。
註意:List 接口存儲一組不唯一(可重復),有序(插入順序)的對象 。Set 接口存儲一組唯一(不可重復)的對象 。
Collection接口中定義了一些集合常用方法:
方法 | 說明 |
int size(); | 返回此collection中的元素數 |
boolean isEmpty(); | 判斷此collection中是否包含元素。 |
boolean contains(Object obj); | 判斷此collection是否包含指定的元素。 |
boolean add(Object element); | 向此collection中添加元素。 |
boolean remove(Object element); | 從此collection中移除指定的元素。 |
void clear(); | 移除些collection中所有的元素。 |
Iterator iterator(); | 返回在此collection的元素上進行叠代的叠代器 |
Object[] toArray(); | 把此collection轉成數組。 |
public class CollectionsDemo { public static void main(String[] args) { List<String> list=new ArrayList<String>(); Collections.addAll(list,"Apple","Banana","Orange","Apple","Watermelon"); showList(list); Collections.shuffle(list); // 打亂List集合中的元素 System.out.println("打亂之後:"); showList(list); Collections.reverse(list); // 反轉List集合 System.out.println("反轉之後:"); showList(list); } public static void showList(List<String> list){ for(String str:list){ System.out.print(str+" "); } System.out.println(); } }
實現類——ArrayList
ArrayList是使用數組結構實現的List集合。
優點: 對於使用索引取出元素有較好的效率 。它使用索引來快速定位對象。
缺點: 元素做刪除或插入速度較慢 因為使用了數組,需要移動後面的元素以調整索引順序。
public class ArrayListDemo { public static void main(String[] args) { ArrayList<String> list=new ArrayList<String>(); list.add("apple"); list.add("banana"); list.add("orange"); list.add("apple"); // List可以添加重復元素 list.add("apple"); // List可以添加重復元素 for(int i=0;i<list.size();i++){ System.out.print(list.get(i)+" "); // get(int index)方法是List接口擴展的方法 } System.out.println(); System.out.println("**********增強for循環遍歷**********"); for(String str:list){ System.out.print(str+" "); } System.out.println(); System.out.println("包含apple嗎?"+list.contains("apple")); System.out.println("刪除之前的元素個數:"+list.size()); list.remove("apple"); System.out.println("刪除之後的元素個數:"+list.size()); for(int i=0;i<list.size();i++){ System.out.print(list.get(i)+" "); // get(int index)方法是List接口擴展的方法 } } }
實現類——LinkedList
LinkedList是使用雙向鏈表實現的集合。
優點:對頻繁的插入或刪除元素有較好的效率。
缺點:查詢元素時,效率低,因為要從第一個元素查找。
public class LinkedListDemo { public static void main(String[] args) { System.out.println("模擬棧數據結構(先進後出FILO):"); LinkedList<String> list=new LinkedList<String>(); list.push("A"); list.push("B"); list.push("C"); System.out.println(list.pop()); System.out.println(list.pop()); System.out.println(list.pop()); System.out.println("模擬隊列數據結構(先進先出FIFO):"); list.add("A"); list.add("B"); list.add("C"); System.out.println(list.removeFirst()); System.out.println(list.removeFirst()); System.out.println(list.removeFirst()); } }
提問:ArrayList和LinkedList分別在何時使用?
回答:ArrayList遍歷元素和隨機訪問元素的效率比較高插入、刪除等操作頻繁時性能低下;LinkedList插入、刪除元素時效率較高查找、遍歷效率較低。
五.叠代器
定義:Iterator是專門的叠代輸出接口。所謂的叠代輸出就是將元素進行判斷,判斷是否有內容,如果有內容則把內容取出。
Iterator對象稱作叠代器,用以方便的實現對集合內元素的遍歷操作。
所有實現了Collection接口的集合類都有一個iterator()方法用以返回一個實現了Iterator接口的對象。
Iterator it = coll.iterator(); while(it.hasNext()){ it.next(); }
package iterator; import java.util.*; public class IteratorDemo { public static void main(String[] args) { ArrayList<String> list=new ArrayList<>(); Collections.addAll(list,"China","America","Japan","China","France"); Iterator<String> iter=list.iterator(); // 返回List集合的叠代器 // 通過叠代器遍歷集合 while(iter.hasNext()){ System.out.print(iter.next()+" "); } } }
六. 泛型
定義:是對 Java 語言的類型系統的一種擴展,以支持創建可以按類型進行參數化的類。可以把類型參數看作是使用參數化類型時指定的類型的一個占位符,
就像方法的形式參數是運行時傳遞的值的占位符一樣。
泛型的好處:解決了類型安全的問題(運行期出現“java.lang.ClassCastException”異常)。
泛型類:
class Gen<T> { private T ob; // 定義泛型成員變量 public Gen(T ob) { this.ob = ob; } public T getOb() { return ob; } public void setOb(T ob) { this.ob = ob; } public void showType() { System.out.println("T的實際類型是: " + ob.getClass().getName()); } }
受限泛型:
1. 設置上限
類名稱<? extends 上限類>
只能接收上限類對象或其子類對象
2. 設置下限
類名稱<? super 下限類>
接收下限類對象或其父類對象
註意:若定義泛型類,可以將?設置為泛型標識。
七.Set接口的實現類
Set接口沒有提供Collection接口額外的方法,但實現Set接口的集合類中的元素是不可重復的。
1.HashSet的存儲原理:
根據每個對象的哈希碼值(調用hashCode()獲得)用固定的算法算出它的存儲索引,把對象存放在一個叫散列表的相應位置(表元)中。
(1)如果對應的位置沒有其它元素,就只需要直接存入。
(2)如果該位置有元素了,會將新對象跟該位置的所有對象進行比較(調用equals()),以查看是否已經存在了:還不存在就存放,已經存在就不存儲。
HashSet集合的特點及使用技巧:
(1)HashSet不保存元素的加入順序。
(2)HashSet接口存、取、刪對象都有很高的效率。
(3)對於要存放到HashSet集合中的對象,對應的類可以重寫hashCode(Object obj)方法和equals()以實現對象相等規則的編寫。
package set.hashset; import java.util.HashSet; public class HashSetDemo { public static void main(String[] args) { HashSet<String> set=new HashSet<String>(); set.add("apple"); set.add("banana"); set.add("orange"); set.add("apple"); set.add("apple"); for(String str:set){ System.out.print(str+" "); } }
2.Treeset集合的特點:可以對加入其中的元素進行排序。但前 提是,必須指定排序規則。
構造方法: public TreeSet()
如果使用TreeSet的無參構造實例化TreeSet集合,則加入到TreeSet集合中的元素所對應的類必須實現java.lang. Comparable<T>接口,
復寫其中的int compareTo(T o)方法,並在方法中編寫排序規則。
在Comparable<T>接口的compareTo(T o)方法中,指定排序規則(以升序為例):
public int compareTo(Girl girl){ if(this.xxx>girl.xxx){ return 1; }else if(this.xxx<girl.xxx){ return -1; }else{ return 0; } }
TreeSet比較排序的過程,已經對重復元素去重了。
Java小白的幹貨鋪子(五)