Random类

今日学习总结:

Random类

Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数seed,在种子数的基础上进行一定的变换,从而产生需要的随机数字创建对象

new Random()构造方法使用一个和当前系统时间对应的相对时间有关的数字作为种子数,然后使用这个种子数构造Random对象

new Random(long seed)构造方法可以通过制定一个种子数进行创建

Random类中的常用方法

boolean nextBoolean()方法的作用是生成一个随机的boolean值,生成true和false的值几率相等,也就 是都是50%的几率

double nextDouble()方法的作用是生成一个随机的double值,数值介于[0,1.0)之间

int nextInt()该方法的作用是生成一个随机的int值,该值介于int的区间,也就是2e9之间

int nextInt(int n)方法的作用是生成一个随机的int值,该值介于[0,n)的区间,也就是0到n之间的随机int值,包含0而不包含n**

void setSeed(long seed)方法的作用是重新设置Random对象中的种子数。设置完种子数以后的
Random对象和相同种子数使用new关键字创建出的Random对象相同

Random r = new Random();
int kk=r.nextInt();
System.out.println(kk);
生成随机的字符值
Random r = new Random();
int kk=r.nextInt(26);
System.out.println((char)('a'+kk));

摇号器

public static boolean exists(int[] arr,int num){
 boolean res=false;
 for(int i=0;i<arr.length;i++){
 if(num==arr[i]){
 res=true;
            break;
       }
 }
 return res;
 }
 //超级大乐透,取值1-36,不重复
public static void main(String[] args) {
 int[] res=new int[7];
 Random r=new Random();
 int i=0;
 while(i<=6){
 int temp=r.nextInt(36)+1;
 boolean rb=exists(res, temp);
 if(!rb) res[i++]=temp; }
 for(int temp:res)
 System.out.println(temp); } ?输出前需要排序

注意:一般开发中不使用随机种子值,因为系统默认使用的是系统的当前时间作为种子值。

生成长度在1-10个字符以内,内容为[a-zA-Z]的随机长度的随机字符串

public static String generateString() {
 String source = "abcdefghijkmnpqrstuvwxyzQWERTYUIOPASDFGHJKLZXCVBNM";
 Random r = new Random();
 int cc = r.nextInt(10) + 1;
 StringBuilder sb=new StringBuilder();
 for (int i = 0; i < cc; i++) {
 int randomIndex=r.nextInt(source.length());
 char temp=source.charAt(randomIndex);
 sb.append(temp); }
 return sb.toString(); }
public static void main(String[] args) {
 Scanner sc = new Scanner(System.in);
 while (true) {
     System.out.println("点q键退出,否则生成下一字符串");
 String str = sc.nextLine();
 if ("q".equals(str.trim())) break;
 else System.out.println(generateString()); } }

Math类中的数学函数

java.lang.Math 类包含的方法进行基本的数字操作,如基本的指数,对数,平方根和三角函数等

java.lang.Math类的字段

static double E – 这就是double值,该值是比任何其他更近到e,自然对数的基础

static doublePI – 这就是double值,该值是比任何其他更接近到pi

System.out.println(Math.PI);

java.lang.Math类方法

Math.abs 求绝对值,典型使用场景就是浮点数的等值判定问题

double k=0;
for(int i=0;i<10;i++)
 k+=0.1;
if(Math.abs(k-1)<1e-6)
 System.out.println("结果为1");

Math.ceil 得到不小于某数的最小整数
Math.floor 得到不大于某数的最大整数

double dd = 12.5;
System.out.println(Math.ceil(dd));
System.out.println(Math.floor(dd));
dd = -12.5;
System.out.println(Math.ceil(dd));
System.out.println(Math.floor(dd));

Math.max 求两数中最大
Math.min 求两数中最小

Math.round 四舍五入返回int型或者long型
Math.rint 求距离某数最近的整数(可能比某数大,也可能比它小),返回double
Math.random 返回0,1之间的一个随机数

Random r=new Random();
System.out.println(r.nextDouble());
 
System.out.println(Math.random());

三角函数

Math.sin 正弦函数Math.asin 反正弦函数
Math.cos 余弦函数Math.acos 反余弦函数
Math.tan 正切函数Math.atan 反正切函数
Math.toDegrees 弧度转化为角度 Math.toRadians 角度转化为弧度

指数计算

Math.sqrt求开方 Math.sqrt(4)
Math.pow 求某数的任意次方, 抛出ArithmeticException处理溢出异常

System.out.println(Math.sqrt(3));//1.7320508075688772
System.out.println(Math.pow(5, 3.2));//172.4662076826519

Math.exp 求e的任意次方
Math.log10 以10为底的对数
Math.log 自然对数

Date类型

Date now=new Date();取得系统的时间,也可以使用System.currentTimeMillis()方法。

Date dd=new Date(); 获取系统当前时,其中包含年月日时分秒
System.out.println(dd);

Date中并不是存放具体的年月日等数据,实际上存放的是从从1970年1月1日0时0分0秒开始,到程序执行取得系统时间为止所经过的毫秒数。进行输出时才进行显示格式的转换
自定义日期

Date dd=new Date(2000-1900,1-1月份,1日期); 这种用法不建议使用.年份差1900,月份
差1,时分秒为0
Date dd=new Date(2000-1900年份,1-1月份,1日期,23小时,35分钟,45);
Date dd=new Date(2019-1900,7-1,28,23,35,45);
Date now=new Date();
System.out.println(dd);
 
System.out.println(dd.getYear()+1900);//获取年份需要+1900
System.out.println(dd.getMonth()+1);//获取月份
System.out.println(dd.getDate());//获取日期
System.out.println(dd.getDay());//获取星期,返回整数0-6对应星期天到星期六
System.out.println(dd.getHours());//获取小时
System.out.println(dd.getMinutes());//获取分钟
System.out.println(dd.getSeconds());//获取秒
System.out.println(dd.getTime());//获取毫秒值,表从1970-1-1 0:0:0到当前new对象时
的毫秒时
// date同时允许通过setxxx的方法进行修改年月日时分秒的操作
 
System.out.println(dd.after(now));//用于判断dd是否在now之后
System.out.println(now.before(dd));//用于判断now是否在dd之前

特殊情况

Date dd=new Date(2019-1900,13-1,280);语法正确,系统会自动进行推算
System.out.println(dd);默认输出格式为Tue/星期 Oct/月份 06/日期 00/小时:00分钟:00
秒 CST时区 2020年份
dd.toLocaleString()输出格式为2019-7-26 0:00:00 使用系统默认的语言设置输出日期

对日期时间作格式设定,则可以使用java.text.DateFormat来作格式化
将日期类型按照指定格式转换为字串类型

//字串参数用于设置对应的日期格式yyyy表示4位年号,MM表示2位月份,dd表示2位日期;E表示星期
HH24小时计时制的小时,mm2位的分钟,ss2位的秒
DateFormat df=new SimpleDateFormat("yyyy-MM-ddE HH:mm:ss");
Date now=new Date();
String str=df.format(now);//按照df中指定的格式对日期变量now进行格式化
System.out.println(str);

将字串类型的日期按照指定格式转换为日期类型数据

public class DateTest {
public static void main(String[] args) throws ParseException {
 String str = "1989-2-3 12:30";
 // 这里的格式必须对应字串中的日期
 DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
 //注意这里可能会出现转换失败问题,所以需要进行错误处理
 Date dd = df.parse(str);
 System.out.println(dd); }
}
典型错误:ParseException
导致的原因是具体的字符串内容和指定的格式不对应,一般注意中文符号问题或者额外的空格问题

JDK1.8引入的日期类型 joda时间

  • 原来所有的日期类都是可变且线程不安全的,在JDK1.8中java.time包中的类是不可变且线程安全的
  • Instant——它代表的是时间戳
    时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。 它的提出主要是为用户提供一份电子证据, 以证明用户的某些数据的产生时间。 在实际应用上, 它可以使用在包括电子商务、 金融活动的各个方面,尤其可以用来支撑公开密钥基础设施的 “不可否认” 服务【目标和理想,不能作为法庭证据】
    事实上Instant就是java8以前的Date,可以使用这个两个类中的方法在这两个类型之间进行转换,比如Date.from(Instant)就是用来把Instant转换成java.util.date的,而Date.toInstant()就是将Date转换成Instant的
Date dd = df.parse(str);
Instant in1=dd.toInstant();
System.out.println(in1);//1989-02-03T04:30:00Z

LocalDate——不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。一般需要记忆4的方法now()/of()/parse/until

// 1. 获取当前日期(年月日) -----打印输出-----2018-01-29
LocalDate localDate = LocalDate.now();
System.out.println(localDate.toString());
// 2. 根据年月日构建Date ----打印输出-----2018-01-30
LocalDate localDate1 = LocalDate.of(2018, 01, 30);
// 3. 字符串转换日期,默认按照yyyy-MM-dd格式,也可以自定义格式 -----打印输出----
-2018-01-30
LocalDate localDate2 = LocalDate.parse("2018-01-30");
// 4. 获取本月第一天 -----打印输出-----2018-01-01
LocalDate firstDayOfMonth =
localDate.with(TemporalAdjusters.firstDayOfMonth());
// 5. 获取本月第二天 -----打印输出-----2018-01-02
LocalDate secondDayOfMonth = localDate.withDayOfMonth(2);
// 6. 获取本月最后一天 -----打印输出-----2018-01-31
LocalDate lastDayOfMonth =
localDate.with(TemporalAdjusters.lastDayOfMonth());
// 7. 明天 -----打印输出----- 2018-01-30
LocalDate tomorrowDay = localDate.plusDays(1L);
// 8. 昨天 -----打印输出----- 2018-01-28
LocalDate yesterday = localDate.minusDays(1L);
// 9. 获取本年第120天 -----打印输出----- 2018-04-30
LocalDate day = localDate.withDayOfYear(120);
// 10. 计算两个日期间的天数
long days = localDate2.until(localDate1, ChronoUnit.DAYS);
System.out.println(days);
// 11. 计算两个日期间的周数
long weeks = localDate2.until(localDate1, ChronoUnit.WEEKS);
System.out.println(weeks);
  • LocalTime——它代表的是不含日期的时间
  • LocalDateTime——它包含了日期及时间,不过还是没有偏移信息或者说时区
LocalDateTime.now():获取系统当前时间。
LocalDateTime.of(int year,int month,int dayOfMonth,int hour,int minute,int
second)按指定日期和时间创建LocalDateTime对象。
getYear():返回日期中的年份。
getMonth():返回日期中的月份。
getDayOfMonth():返回月份中的日。
getHour():返回小时。
getMinute():返回分钟。
getSecond():返回秒。
  • ZonedDateTime——这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的
LocalTime now1 = LocalTime.now();
long hoursBetween = ChronoUnit.HOURS.between(now1, now2);
LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS);
LocalDate yesterday = tomorrow.minusDays(2);
LocalDate date1 = LocalDate.parse("2015-12-01");
DateTimeFormatter formatter=DateTimeFormatter.ofPattern("yyyy-MM-dd")
LocalDate h=LocalDate.parse("2018-7-24",formatter);
String str=localDate.format(formatter);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值