第八章、常用类
本章要学会查看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
- 添加空字符串实现 = 常用
String str = 3 + "";
- toString 方法
String toString()
返回一个表示该 Ingeter 值的String 对象
- 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。
案例:设置时间为当前时间。
把当前日期打印格式为: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