1. 程式人生 > >Java基礎17-隨機數、正則表達式

Java基礎17-隨機數、正則表達式

public top spa 線程並發 bsp cas 思想 protect 每次

一、隨機數Random

1.Math.Random

返回帶正號的 double 值,該值大於等於 0.0 且小於 1.0。不包含1.0。[0,1);

public static void main(String[] args) {
    //生成偽隨機數
    System.out.println(Math.random());
}

運行結果為:技術分享圖片

2.Random類

此類的實例用於生成隨機數流。

構造方法摘要
Random()
創建一個新的隨機數生成器。
Random(long seed)
使用單個 long
種子創建一個新的隨機數生成器。

什麽是偽隨機數呢?我們來看一個例子

技術分享圖片技術分享圖片

r1和r2生成的隨機數竟然是一樣的!這是為什麽呢?

這就是字的真諦,即通過相同的種子生成的隨機數是一樣的

方法摘要
protected int next(int bits)
生成下一個偽隨機數。
boolean nextBoolean()
返回下一個偽隨機數,它是取自此隨機數生成器序列的均勻分布的 boolean 值。
void nextBytes(byte[] bytes)
生成隨機字節並將其置於用戶提供的 byte 數組中。
double nextDouble()
返回下一個偽隨機數,它是取自此隨機數生成器序列的、在 0.01.0 之間均勻分布的 double 值。
float nextFloat()
返回下一個偽隨機數,它是取自此隨機數生成器序列的、在 0.01.0 之間均勻分布的 float 值。
double
nextGaussian()
返回下一個偽隨機數,它是取自此隨機數生成器序列的、呈高斯(“正態”)分布的 double 值,其平均值是 0.0,標準差是 1.0
int nextInt()
返回下一個偽隨機數,它是此隨機數生成器的序列中均勻分布的 int 值。
int nextInt(int n)
返回一個偽隨機數,它是取自此隨機數生成器序列的、在 0(包括)和指定值(不包括)之間均勻分布的 int 值。
long nextLong()
返回下一個偽隨機數,它是取自此隨機數生成器序列的均勻分布的 long 值。
void setSeed(long seed)
使用單個 long 種子設置此隨機數生成器的種子。

3.ThreadLocalRandom類

是java7新增類,random類的子類,在多線程並發情況下相對於random可以減少多線程資源競爭,保證了線程安全問題。

ThreadLocalRandom不是直接用new實例化,而是第一次使用其靜態方法current()。

技術分享圖片技術分享圖片

4.UUID類

通用唯一識別: 在一臺機器上生成的數字,它保證對在同一時空中 的所有機器都是唯一的。
* UUID是一個128位長的數字,一般用16進制表示。算法的核心思想是結合機器的網卡, 當地時間、一個隨機數來生成UUID。
技術分享圖片技術分享圖片

案例:生成驗證碼

import java.util.Random;
import java.util.UUID;

public class yanzhengma {
public static void main(String[] args) {
    //生成一個5位數的隨機數
//截取UUID生成字符串的前五位
    String Num=UUID.randomUUID().toString().substring(0, 5);
    System.out.println(Num);
//第二種方式
    String str="ABCDEFGHYJKLMNOPQISTUVWXYZ";
    str+=str.toLowerCase();
    str+="0123456789";
//將大小寫字母和數字拼接起來
    StringBuilder sb=new StringBuilder(5);
    for(int i=0;i<5;i++) {
//每次隨機在這個拼接好的字符串中隨機取出一個字符
        char ch=str.charAt(new Random().nextInt(str.length()));//index必須在[0,str.lenth()]之間
//用StringBuilder進行拼接
        sb.append(ch);
    }
    System.out.println(sb);


}
}

技術分享圖片

二、正則表達式

* 主要用於(匹配判斷,分割操作,替換操作),最多的是匹配判斷

技術分享圖片技術分享圖片

技術分享圖片技術分享圖片

來看一個案例:

判斷一個字符串全部由數字組成

public class Regex {
    public static void main(String[] args) {
        String input="1235sa65";
        boolean ok=isNumber(input);
        System.out.println(ok);
    }
    //判斷一個字符串全部由數字組成
    private static boolean isNumber(String str) {
        char[] arr=str.toCharArray();
        for(char c:arr) {
            if(c<‘0‘||c>‘9‘) {
                return false;
            }
        }
        return true;
    }
}

是不是有些麻煩?

下邊用正則表達式

public class Regex {
    public static void main(String[] args) {
        String input="1235sa65";
        System.out.println("123sa456".matches("\\d*"));
    }
}

技術分享圖片兩個的結果是一樣的,用正則表達式簡化了代碼,更優化了。

下邊我們看看Pattern類中的方法

方法摘要
static Pattern compile(String regex)
將給定的正則表達式編譯到模式中。
static Pattern compile(String regex, int flags)
將給定的正則表達式編譯到具有給定標誌的模式中。
int flags()
返回此模式的匹配標誌。
Matcher matcher(CharSequence input)
創建匹配給定輸入與此模式的匹配器。
static boolean matches(String regex, CharSequence input)
編譯給定正則表達式並嘗試將給定輸入與其匹配。
String pattern()
返回在其中編譯過此模式的正則表達式。
static String quote(String s)
返回指定 String 的字面值模式 String
String[] split(CharSequence input)
圍繞此模式的匹配拆分給定輸入序列。
String[] split(CharSequence input, int limit)
圍繞此模式的匹配拆分給定輸入序列。
String toString()
返回此模式的字符串表示形式。

常用matches和split還有toString還有一個replace和replaceAll

一個案例來搞懂,判斷手機號碼

1:要求為11位數字

2:第1位為1,第2位為34578中的一個,後面9位為09之間的任意數字。

技術分享圖片結果為:true

再來一個替換的案例

把文字中的數字替換成*

技術分享圖片


Java基礎17-隨機數、正則表達式