常用类之Random
Random类位于 java.util 包中,主要用于生成伪随机数
Random类将种子数作为随机算法的起源数字,计算生成伪随机数,其与生成的随机数字的区间无关
创建Random实例时,若没有指定种子数,则会以当前时间作为种子数,来计算生成伪随机数
拥有相同种子的Random实例,在相同次数下,生成的伪随机数完全相同
构造器
// 创建一个新的随机数生成器。
Random()
// 使用单个 long 种子创建一个新的随机数生成器。
Random(long seed)
// 相同种子生成的随机数是一样的
常用方法
// 返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值
int nextInt()
// 返回一个伪随机数,它是取自此随机数生成器序列的、在 [0,n) 之间均匀分布的 int 值。
int nextInt(int n)
// 返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布的 double 值
double nextDouble()
// 返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布的 float 值
float nextFloat()
// 返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 boolean 值
boolean nextBoolean()
// 生成随机字节并将其置于用户提供的 byte 数组中
void nextBytes(byte[] bytes)
// 返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值
long nextLong()
// 使用单个 long 种子设置此随机数生成器的种子
void setSeed(long seed)
例子1:
Random r = new Random();
System.out.println(r.nextDouble());
System.out.println(r.nextBoolean());
System.out.println("-> " + r.nextInt());
System.out.println("---------------");
// 相同的种子,生成的随机数是一样
Random r2 = new Random(10);
Random r3 = new Random(10);
System.out.println("-> " + r2.nextInt()); // -1157793070
System.out.println("-> " + r3.nextInt()); // -1157793070
// 生成34到179之间的随机数 : 34 + [0 145)
System.out.println(r.nextInt(145) + 34);
例子2:UUID
// UUID:通用唯一识别符
// 在一台机器 上生成 的数字
// 当前的时间,跟当前电脑网卡 生成一段字符
String uuid = UUID.randomUUID().toString();
System.out.println(uuid);
例子3:验证码
// 生成验证码
// 5位的随机数 UUID生成的是16进制
String res = UUID.randomUUID().toString();
System.out.println(res);
res = res.substring(0, 5);
System.out.println(res);
System.out.println("--------------------");
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
str = str + str.toLowerCase();
str += "0123456789";
System.out.println(str);
System.out.println(str.length());
// 从所有的字符当中随机生成5个出来
// 随机取5个出来
// 每取出一个结果,在原来的基础 上面进行拼接
StringBuilder sb = new StringBuilder(5);
for (int i = 0; i < 5; i++) {
// 角标要随机的值 (0 62:字符串的长度)
int index = new Random().nextInt(str.length());
char ch = str.charAt(index);
sb.append(ch);
}
System.out.println(sb);
常用类之Date
之前,我们定义员工年龄和入职日期是用 int 和 String 来定义的。
class Employee {
int age;
String hireDate;
}
这样每过一年,都要修改年龄;或者要计算员工的工龄不方便。java当中专门提供了日期类型。
构造器
// 使用当前日期和时间来初始化对象(精确到毫秒)。
Date()
// 第二个构造函数接收一个参数,该参数是从1970年1月1日 00:00:00 起的毫秒数。
Date(long date)
e.g. 获取当前日期时间
// 创建 一个日期对象
Date date = new Date();
System.out.println(date);
// 获取当前时间的毫秒数
long curTime = System.currentTimeMillis();
// 把一个毫秒值 转成日期类型
Date date2 = new Date(curTime);
System.out.println(date2);
以上两个两段代码其实是一样的,看下Data()的源码,本质就是用系统当前时间的毫秒数来创建Date对象
public Date() {
this(System.currentTimeMillis());
}
日期比较
// 测试此日期是否在指定日期之后
boolean after(Date when)
// 测试此日期是否在指定日期之前
boolean before(Date when)
// 比较两个日期的顺序
int compareTo(Date anotherDate)
// 比较两个日期的相等性
boolean equals(Object obj)
e.g.
// 创建 一个日期对象
Date date = new Date(1564387266239L); // 毫秒数大 时间迟
Date date2 = new Date(1564211606445L); // 毫秒数小 时间早
System.out.println(date); // Mon Jul 29 16:01:06 GMT+08:00 2019
System.out.println(date2); // Sat Jul 27 15:13:26 GMT+08:00 2019
System.out.println(date.before(date2)); // false
System.out.println(date.after(date2)); // true
System.out.println(date.compareTo(date2)); // 1
System.out.println(date.equals(date2)); // false
获取和设置时间毫秒值:date和毫秒值转化
long getTime()
void setTime(long time)
e.g.
// 创建 一个日期对象
Date date = new Date();
Date date2 = new Date();
long time = date.getTime();
System.out.println(time);
date2.setTime(1564387266239L);
// 输出的字符串不符合中文习惯
System.out.println(date2);
// toLocaleString 已经过时了,不建议使用,这里暂时使用
System.out.println(date2.toLocaleString());
日期格式化
创建日期格式化对象:
// 获取日期和时间使用 SHORT 风格的默认日期/时间格式器
static DateFormat getInstance()
// 获取日期和时间使用 默认(DEFAULT) 风格的日期/时间格式器
static DateFormat getDateTimeInstance()
// 获取日期和时间使用 给定日期和时间格式化风格的日期/时间格式器
static DateFormat getDateTimeInstance(int dateStyle, int timeStyle)
// 获取使用 默认(DEFAULT) 风格的日期格式器
static DateFormat getDateInstance()
// 获取使用 给定格式化风格的日期格式器
static DateFormat getDateInstance(int style)
// 获取使用 默认(DEFAULT) 风格的时间格式器
static DateFormat getTimeInstance()
// 获取使用 给定格式化风格的时间格式器
static DateFormat getTimeInstance(int style)
e.g.
Date date = new Date();
System.out.println(date);
System.out.println(date.toLocaleString());
System.out.println("------------日期格式化------------");
// 获取为日期和时间使用 SHORT 风格的默认日期/时间格式器
DateFormat df1 = DateFormat.getInstance();
// 相当于 : DateFormat df1 = DateFormat.getDateTimeInstance
// (DateFormat.SHORT, DateFormat.SHORT);
// 对指定的日期进行格式化: Date -> String
String time = df1.format(date);
System.out.println("SHORT 风格: " + time);
// 获取为日期和时间使用 默认(DEFAULT) 风格的日期/时间格式器
DateFormat df2 = DateFormat.getDateTimeInstance();
// 相当于 : DateFormat df2 = DateFormat.getDateTimeInstance
// (DateFormat.DEFAULT, DateFormat.DEFAULT);
System.out.println("DEFAULT 风格: " + df2.format(date));
DateFormat df3 = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
System.out.println("MEDIUM 风格: " + df3.format(date));
DateFormat df4 = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
System.out.println("LONG 风格: " + df4.format(date));
DateFormat df5 = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
System.out.println("FULL 风格: " + df5.format(date));
输出结果:
Mon Jul 29 17:16:05 GMT+08:00 2019
2019-7-29 17:16:05
------------日期格式化------------
SHORT 风格: 19-7-29 下午5:16
DEFAULT 风格: 2019-7-29 17:16:05
MEDIUM 风格: 2019-7-29 17:16:05
LONG 风格: 2019年7月29日 下午05时16分05秒
FULL 风格: 2019年7月29日 星期一 下午05时16分05秒 GMT+08:00
日期和String的转换
(1)Date -> String : format 格式化
Date date = new Date();
DateFormat df = DateFormat.getInstance();
String format = df.format(date);
System.out.println(format);
(2)String -> Date : parse 解析
DateFormat df = DateFormat.getInstance();
String source = "19-7-29 下午5:23";
try {
Date parse = df.parse(source);
System.out.println(parse);
} catch (ParseException e) {
System.out.println("日期字符串格式错误!");
e.printStackTrace();
}