Java基础17-随机数、正则表达式

 

一、随机数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

再来一个替换的案例

把文字中的数字替换成*

 

 

 


 

 

posted @ 2018-05-13 11:25  LuckyGJX  阅读(1785)  评论(0编辑  收藏  举报