Java 常用类之包装类,Math,Random,Date类


第八章、常用类

本章要学会查看API,多翻看API。如有需要可以在百度网盘里自己拿,两个版本差不多的。

链接:https://pan.baidu.com/s/1eVwiJdEy1BVkvQYK8DD5Sg 
提取码:K9gh

8.1、包装类

8.1.1 包装类的分类

针对八种基本数据类型相应的引用类型,包装类

java 基本数据类型:byte short char int long float double boolean

基本数据类型,保存在栈内存中,不能方法调用

需求:想让基本数据类型,也能够像对象一样使用,能够调用方法

包装类:把基本数据类型,进行封装,形成对象,也可以调用方法等

xxx类将基本类型xxx的值包装在一个对象中

包装类型判断是否为空 :!= null

基本类型判断:!= 0

基本数据类型 包装类型
byte Byte
char Character
short Short
int Integer
long Long
float Float
double Double
boolean Boolean

8.1.2、装箱和拆箱

装箱:把基本数据类型转换为包装类型

拆箱:把包装类型转换为基本数据类型

在JDK1.5之后,实现了自动化的装箱和拆箱

手动装箱

1)通过构造方法

Integer(int value)
构造一个新分配的 Integer 对象,它表示指定的 int 值
public void test01(){
        Integer integer1 = new Integer(127);
        Integer integer2 = new Integer(127);
        System.out.println(integer1 == integer2); //false
}

2)通过valueOf方法

static Integer valueOf(itn i)
返回一个表示指定的 int 值的  Integer 实例
public void test02(){ //Integer 享园设计模式
    // -128~127之间共享一个地址值
    Integer integer1 = Integer.valueOf(127);
    Integer integer2 = Integer.valueOf(127);
    System.out.println(integer1 == integer2); //true
    Integer integer3 = Integer.valueOf(128);
    Integer integer4 = Integer.valueOf(128);
    System.out.println(integer3 == integer4); //false
}

自动装箱:

语法:包装类型 对象名 = 基本类型的值

public void test03(){ //Integer 享园设计模式
    Integer integer1 = 127;
    Integer integer2 = 127;
    System.out.println(integer1 == integer2); //true
}

手动拆箱:

1)调用 xxxValue 方法

int xxxValue()
以 基本数据类型 返回该 包装类型 的值

自动拆箱:

语法:基本数据类型 变量名 = 包装类对象名

public void test02(){
        Integer integer = 10;
        //手动拆箱
        int i = integer.intValue();
        //自动拆箱
        int num = integer;
}

细节问题:

Integer 的 valueOf() 使用一个设计模式:享元设计模式

所以 valueOf 的参数值在-128~127 范围内,始终使用的共享的元素,地址都是一样的

范围以外都是构造方法创建,new 一次就是一个新地址 ,== 结果始终 false

由于自动装箱底层也是使用的 valueOf(),所以自动装箱也满足该规则

8.1.3、基本数据类型和 String 的转换

应用场景:表单把数据提交到后端,这些数据都是String 类型的,那么有些数据,比如 int/Iteger 类型数据,需要从String转换成int/Integer类型

1)基本数据类型转换为String

  1. 添加空字符串实现 = 常用
String str = 3 + "";
  1. toString 方法
String toString()
返回一个表示该 Ingeter 值的String 对象
  1. toString 的重载方法
static string toString(int i)
返回一个表示指定整数的 String 对象

2)String 转换为基本数据类型

static int parseInt(String s)
将字符串参数作为有符号的十进制整数进行解析

3)String 转换为包装类型

static Integer valueOf(String s)
返回保存指定的 String 的值的 Integer 对象

案例:

public void demo01(){
        //int -> String
        String str = Integer.toString(10); //调用Integer类的toString(int i)方法
        String str2 = 10 + "";
        String str3 = String.valueOf(19); //调用String类的valueOf(int i)方法
        //Integer -> String
        // 创建 Integer 对象,调用对象的toString()方法
        Integer integer = 10;
        String str4 = integer.toString();

        //String -> int
        int i = Integer.parseInt("190"); //调用 Integer.parseInt(String s) 方法将字符串转为int型整数
        //String -> Integer
        Integer integer1 = Integer.valueOf("180"); //调用 Integer.valueOf(String s) 方法创建 Integer类的对象
}

8.2、Math

Math类:表示数学计算:绝对值,比较大小,多少次幂

注意:Math类中所有方法都是静态的,所以不需要创建对象

常用 Math 类的方法:

1)求绝对值

static double abs(double a)
返回 double 值的绝对值

2)向上取整,求比当前数大的最小整数

如 11.3 -> 12 ,15. 6 -> 16

static double ceil(double a)
返回最小的(最接近负无穷大)double 值,该值大于等于参数,并等于某个整数

3)向下取整,求比当前数小的最大整数

11.3 -> 11

static double floor(double a)
返回最大的(最接近正无穷)double 值,该值小于等于参数,并等于某个整数

4)比较大小

static double max(double a, double b)
返回两个 double 值中较大的一个

5)随机数:表示 [0,1) 之间的随机小数,包含0,不包含1

static double random()
返回带正号的 double 值,该值大于等于0.0,且小于1.0

[0,N) 区间对应的获取随机数的公式:(int)(Math.random()*N)

[M,N) 区间对应的获取随机数的公式:(int)(Math.random()*(N-M) + M)

[M,N] 区间对应的获取随机数的公式:(int)(Math.ceil(Math.random()*(N-M) + M))

public void test05(){
    System.out.println((int)(Math.random()*10)); //[0,10)
    System.out.println((int)(Math.random()*(10-2)+2)); //[2,12)
    System.out.println((int)Math.ceil(Math.random()*(10-2)+2)); //[2,12]
}

练习

随机点名系统实现: 
    1.数组保存一组名单--[小组] 2.随机数生成随机下标。生成范围[0,数组长度)的整数 3. 下标取出对应学生名单。 
    分析: 1) String str = {'xx','xx'}; 2) 获取随机数下标 3)通过下标取出学生
public static void main(String[] args) {
        String [] names = {"张三","李四","王五","赵六","小黄","大黄"};
        int num = (int)(Math.random()*7);
        System.out.println(names[num]);
}

6)求某数的几次幂

pow(2,3) 2的3次幂

static double pow(double a, double b)
返回第一个参数的第二个参数次幂的值

7)四舍五入

static long round(double a) 返回最接近 long的参数,其中 long四舍五入为正无穷大。 
static int round(float a) 返回最接近的参数 int ,其中 int四舍五入为正无穷大。 

案例:

public void test04(){
    System.out.println(Math.random()); //随机数
    System.out.println(Math.max(2,4)); //最大值
    System.out.println(Math.abs(-100)); //绝对值
    System.out.println(Math.pow(2,3)); // a 的 b 次方
    System.out.println(Math.ceil(10.23)); //向上取整,0.0还是0.0
    System.out.println(Math.floor(10.23)); //向下取整
    System.out.println(Math.round(10.23)); //四舍五入
    System.out.println(Math.round(10.56));
}

8.3、Random

import java.util.Random;

Random 类专门表示随机数的类,需要创建对象使用

int nextInt(int n)
返回一个伪随机数,它是取自此随机数生成器序列的、在 0 (包括0) 和指定值(不包括)之间均匀分布的 int 值

案例:

public void test06(){
    //调用 Random类的方法要创建一个新的对象才能调用
    Random random = new Random();
    System.out.println(random.nextInt(10)); // [0~10)
    System.out.println(random.nextInt(10-1) + 1); //[1,10)
    System.out.println(random.nextInt(567-123) + 123); //[123,567)
    System.out.println(Math.ceil(random.nextInt(567-123) + 123)); //[123,567]
}

练习:

双色球:前面六个为红色球,选号范围01-33,最后一位是蓝色球,选号范围01-16

public void demo01(){
        String [] nums = new String[7];
        Random random = new Random();
        int num;
        for (int i = 0; i < nums.length; i++) {
            if (i == 6){
                num = random.nextInt(16-1)+1;
            }else {
                num = random.nextInt(33-1)+1;
            }
            String str = String.valueOf(num);
            if (num < 10){
                nums[i] = 0 + str;
            }else {
                nums[i] = str;
            }
            System.out.println(nums[i] + ",");
        }
    }

8.4、日期处理

8.4.1、Date

import java.util.Date;

日期处理类:Date 类,对 java 中的日期进行处理

date表示特定的瞬间,精确到毫秒。

注意:日期处理类在java.util.Date包下面!!!

构造方法:

Date() 分配一个 Date对象并对其进行初始化,以便它表示分配的时间,以最接近的毫秒为单位。  
Date(long date) 分配一个 Date对象,并将其初始化为表示从标准基准时间(称为“时代”)即1970年1月1日00:00:00 GMT起的指定毫秒数。 

Date 日期类操作

案例:

public void test07(){
        Date date = new Date();
        System.out.println(date); //Sat Jul 23 15:39:34 CST 2022
        System.out.println(date.toLocaleString()); // 打印成字符串的形式,便于理解,2022-7-23 15:39:34
        //getTime() :得到1970.01.01 00:00 到此时的毫秒数
        System.out.println(date.getTime()); //1658561974539
    }

8.4.2、格式化日期:SimpleDateFormat

import java.text.SimpleDateFormat;

SimpleDateFormat类:日期格式化类,让日期更人性化的显示出来,还能实现日期和字符串的转换

1)把日期类型转换为String

SimpleDateFormat(String pattern) 
          用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。

image

案例:设置时间为当前时间。

​ 把当前日期打印格式为:xxxx年xx月xx日 xx:xx:xx 星期xx

public void test08(){
        //创建日期对象
        Date date =new Date();
        //创建日期格式化对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E"); //会按照这个格式打印
        //format:日期格式化方法
        String format = sdf.format(date);
        System.out.println(format); //2022年07月23日 15时37分58秒 星期六
    }

2)把 String 转换为日期类型

需求:把前端传递过来的日期字符串,转换为日期对象,保存到数据库中

Date parse(String source) 
    从给定字符串的开始解析文本,以生成一个日期。

注意:转换的时候,要保证日期字符串的格式要和模板的格式保持一致

String dateStr = "2019/10/1"
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd")
public void test09(){
        //把日期字符串转换成日期类型
        String dateStr = "2019-10-1";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //转换规则要和字符串的格式匹配
        Date date = null;
        try {
            date = sdf.parse(dateStr);
            System.out.println(date);   //Tue Oct 01 00:00:00 CST 2019
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println(date.toLocaleString());  //2019-10-1 0:00:00
}

案例:

计算给定日期到当前系统时间经过了多少天?

public void test10(){
        String dateStr = "2021-10-1";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date lastDate = null;
        try {
            lastDate = sdf.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Date nowDate = new Date();
        long TimeBetween = nowDate.getTime() - lastDate.getTime();
        System.out.println((int)(TimeBetween / 8.64e7));

}
import java.time.LocalDate; //要导类包

public void test11(){
        String dateStr = "2021-10-01"; //注意 日 为单数要加个0,01、02、03
        //LocalDate 类:日期处理的类
        //parse() :把日期字符串转换成 LocalDate 对象
        LocalDate oldLocalDate = LocalDate.parse(dateStr);
        //now() :得到当前日期的 LocalDate 对象
        LocalDate nowLocalDate = LocalDate.now();
        //toEpochDay() :计算当前日期到1970.1.1 的天数
        System.out.println("days: " + (nowLocalDate.toEpochDay() - oldLocalDate.toEpochDay()));
    }

8.4.3、Calendar:日历类的操作

import java.util.Calendar;

一点相关方法(请查API):

static Calendar     getInstance()  使用默认时区和区域设置获取日历。 
public static Calendar getInstance()
使用默认时区和区域设置获取日历。 返回的Calendar是基于默认时区的当前时间,默认为FORMAT区域设置。 
abstract void   add(int field, int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量。 
int      		get(int field) 			返回给定日历字段的值。 

Calendar的一些静态属性:
static int 		DAY_OF_MONTH 			get字段编号和 set表示本月的日期。 
static int 		DAY_OF_WEEK 			get字段编号和 set表示星期几。  
static int 		DAY_OF_WEEK_IN_MONTH 	get和 set字段编号,表示当月的星期几的序数。 
static int 		DAY_OF_YEAR 			get字段编号和 set表示 set的日数。
    
Date 			getTime() 				返回表示 Calendar的时间值(与 Epoch的毫秒偏移量)的 Date对象。  

案例:

日历类的操作

1、想显示3天之后的日期、想显示3天之前的日期

2、今天是那一年?今天是几月份、今天是一周的第几天?、今天是这个月的第几周

3、设置年:2029年

4、设置日期:到 2030-8-10 23:40:59

5、获取当前时间的毫秒数

public void test12(){
        //1.创建Calendar的对象
        Calendar cal = Calendar.getInstance();
        //1、想显示3天之后的日期
        cal.add(Calendar.DAY_OF_MONTH,3);
        int day = cal.get(Calendar.DAY_OF_MONTH);
        int year = cal.get(Calendar.YEAR);
        //如果是月,+1
        int month = cal.get(Calendar.MONTH) + 1;
        //如果是星期,-1
        int week = cal.get(Calendar.DAY_OF_WEEK) -1;
        System.out.println("day = " + day);
        System.out.println("year = " + year);
        System.out.println("month = " + month);
        System.out.println("week = " + week);
        Date date = cal.getTime();
        System.out.println(date.toLocaleString());

        //3、设置年:2029年
        cal.set(Calendar.YEAR,2029);
        int year2 = cal.get(Calendar.YEAR);
        System.out.println("year2 = " + year2);

        //4、设置日期:到 2030-8-10 23:40:59
        cal.set(2030,7,10,23,40,59);
        System.out.println(cal.getTime().toLocaleString());
}

案例:

计算2012年春节距离今天有多少天,是星期几

public void topic01(){
        String dateStr = "2012-01-23";
        LocalDate oldLocalDate = LocalDate.parse(dateStr);
        LocalDate nowLocalDate = LocalDate.now();
        System.out.println(nowLocalDate.toEpochDay() - oldLocalDate.toEpochDay());
        System.out.println(oldLocalDate.getDayOfWeek());
}

幸运抽奖:使用Math类中方法实现幸运抽奖,中奖规则为会员号的百位数与系统生成的随机数相同时几位中奖

public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("我行我素购物管理系统->幸运抽奖/n");
        int num = (int)(Math.random()*10);
        String numStr = num + "";
        System.out.print("请输入4位会员卡号:");
        String userNumStr = input.next();
        for (int i = 0; i < userNumStr.length(); i++) {
            char ch = userNumStr.charAt(i);
            if (ch < '0' || ch > '9'){
                System.out.println("卡号必须是数字哦!");
                return;
            }
        }
        if (userNumStr.length() != 4){
            System.out.println("必须是四位卡号哦!");
            return;
        }
        if (numStr.charAt(0) == userNumStr.charAt(1)){
            System.out.println(userNumStr + "是幸运用户,获得精美MP3一个。");
        }else {
            System.out.println("很遗憾,您没有中奖~");
        }
}

原创文章,作者:Carrie001128,如若转载,请注明出处:https://blog.ytso.com/277666.html

(0)
上一篇 2022年7月29日
下一篇 2022年7月29日

相关推荐

发表回复

登录后才能评论