本章要学会查看API,多翻看API。如有需要可以在百度网盘里自己拿,两个版本差不多的。
链接:https://pan.baidu.com/s/1eVwiJdEy1BVkvQYK8DD5Sg 提取码:K9gh
针对八种基本数据类型相应的引用类型,包装类
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 |
装箱:把基本数据类型转换为包装类型
拆箱:把包装类型转换为基本数据类型
在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(),所以自动装箱也满足该规则
应用场景:表单把数据提交到后端,这些数据都是String 类型的,那么有些数据,比如 int/Iteger 类型数据,需要从String转换成int/Integer类型
String str = 3 + "";
String toString() 返回一个表示该 Ingeter 值的String 对象
static string toString(int i) 返回一个表示指定整数的 String 对象
static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行解析
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类的对象 }
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)); }
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] + ","); } }
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 }
import java.text.SimpleDateFormat;
SimpleDateFormat类:日期格式化类,让日期更人性化的显示出来,还能实现日期和字符串的转换
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())); }
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("很遗憾,您没有中奖~"); } }