1. 程式人生 > >Java小白的幹貨鋪子(五)

Java小白的幹貨鋪子(五)

roc tab 輸出信息 聲明 操作日期 返回 space sdf 特定

一.常用類

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+?","#"));

	}

}

三.枚舉類型

  1. 枚舉類型使用一組常量值來表示特定的數據集合,該集合中數據的數目確定(通常較少),且這些數據只能取預先定義的值。

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小白的幹貨鋪子(五)