Java基礎17-隨機數、正則表達式
阿新 • • 發佈:2018-05-13
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.0 和 1.0
之間均勻分布的 double 值。 |
float |
nextFloat()
返回下一個偽隨機數,它是取自此隨機數生成器序列的、在 0.0 和 1.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位為3、4、5、7、8中的一個,後面9位為0到9之間的任意數字。
結果為:true
再來一個替換的案例
把文字中的數字替換成*
Java基礎17-隨機數、正則表達式