- 推荐书籍
- Java编程思想:要有一定的基础。
- 疯狂Java讲义:零基础的
知识回顾
- 异常的概念
- 在程序运行过程中或编译过程中出现的问题。
- 错误的概念
- 在程序运行过程中出现的问题。
- 一般不会处理,只能修改错误行的代码。
- 异常的继承体系
- Throwable:错误和异常的父类
- Error:错误
- Exception:异常
- 运行时异常概述
- 只要是RuntimeException或其子类都属于运行时异常
- 运行时异常的特点
- 如果方法体中抛出的异常是运行时异常,则可以处理,可以不处理。
- 如果方法声明上声明的异常是运行时异常,则调用者可以处理,也可以不处理。
- 编译时异常概述
- 除了运行时异常以为的所有异常都属于编译时异常。
- 编译时异常的特点
- 如果方法体中抛出的异常是编译时异常,则必须要处理。
- 如果方法声明上声明的异常是编译时异常,则要求调用者一定要处理。
- 捕获处理
try{ // 可能出现异常的代码 }catch(异常类名 变量名){ // 异常出现后要执行的代码 }... catch(异常类名 变量名) { // 异常出现后要执行的代码 } finally{ // 一定要执行的代码 }
- 抛出处理
throw:使用在方法体中,用来抛出一个异常对象,将异常对象抛给方法调用者,并结束当前方法的运行。 throws:使用方法声明上,用来告诉方法调用者当前方法可能会出现的异常。 throw new 异常类名(异常信息); throws 异常类名,异常类名..
- 自定义异常
异常类名:XxxxException
继承关系:
Exception:要求一定要处理的
RuntimeException:不要求调用者一定要处理的
构造方法
无参和有参
学习目标
- 能够使用日期类输出当前的日期
- 能够说出将日期格式化成 字符串 的方法
- 说出将字符串转换成日期的方法
- 写出基本数据类型对应的八种包装类
- 能够说出拆箱装箱概念
- 能够System类常见方法
- 能够使用Math类进行数学运算
- 能够 正则表达式 验证11位手机号码
- 能够说出字符串的split方法作用
今天内容
- Date,DataFormat,Calendar,System,Math
- 包装类和正则表达式
1. Date类概述
Date类的概述 * java.util.Date:时间日期类 * 用来获得日期时间。 Date类的构造方法 * Date():获得当前系统时间 * Date(long date) 根据指定的毫秒值获得日期对象 Date类的成员方法 * long getTime():获得当前时间的毫秒值 时间零点的概念 * 时间零点:1970.1.1 00:00:00 毫秒值的概念 * 1秒 = 1000毫秒
- 示例代码
public class DateDemo01 { public static void main(String[] args) { // 创建日期对象 Date d = new Date(); // Thu Apr 12 09:09:23 CST 2018 // 2018-04-12 09:09:23 // 2018/04/12 09:09:23 // 2018年04月12日 09:09:23 System.out.println(d.getTime()); // 1523495535467 // 创建日期对象 Date d2 = new Date(1000); // Thu Jan 01 00:00:01 CST 1970 System.out.println(d2); } }
2. 日期对象转换字符串
DateFormat类概述 是一个抽象类,不能直接创建该类的对象,只能创建子类对象。 DateFormat的子类 * SimpleDateFormat SimpleDateFormat类常见操作 * 将日期对象转换为字符串 * 将字符串转换为日期对象 SimpleDateFormat类常用构造方法 * SimpleDateFormat(String pattern) :使用指定的日期格式创建格式化对象 * SimpleDateFormat():使用默认的日期格式创建格式化对象 SimpleDateFormat类常用成员方法 * String format(Date d);将日期对象格式化为字符串 * Date parse(String dateStr);将字符串解析为日期对象 * void applyPattern(String pattern);修改日期模式 日期模式 * yyyy 年 * MM 月 * dd 日 * HH 时 HH:24小时制 hh:12小时制 * mm 分 * ss 秒
- SimpleDateFormat类将日期对象转换为字符串的步骤
- 获得日期对象
- 创建日期格式化对象SimpleDateFormat并指定日期模式。
- 调用日期格式化对象的format方法将日期对象转换为字符串。
public class DateFormatDemo01 { public static void main(String[] args) { // 创建日期对象 Date d = new Date(); // 2018-04-12 09:09:23 // 2018/04/12 09:09:23 // 2018年04月12日 09:09:23 // 创建日期格式化对象:使用默认的日期默认 // SimpleDateFormat sdf = new SimpleDateFormat(); // 创建日期格式化对象:指定日期模式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); // 格式化日期为字符串 String str = sdf.format(d); System.out.println(str); } }
3. 字符串转成日期对象
- SimpleDateFormat类将字符串转换为日期对象
- 创建日期格式化对象并指定日期模式
- 调用日期格式化对象的parse方法传入时间字符串得到日期对象。
- Date parse(String dateStr); 将字符串解析为日期对象
/** 注意事项 * 日期模式要和时间字符串格式要一致,否则无法转换。 */public class DateFormatDemo02 { public static void main(String[] args) throws ParseException { // 日期字符串 String dateStr = "2018/10/10 10:10:10"; // 创建日期格式化对象并指定日期模式 // SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); /* SimpleDateFormat sdf = new SimpleDateFormat(); // 修改默认的日期模式 sdf.applyPattern("yyyy/MM/dd HH:mm:ss"); */ // 使用DateFormat的静态方法获得日期格式化对象 SimpleDateFormat sdf = (SimpleDateFormat)DateFormat.getDateInstance(); // SimpleDateFormat // 修改默认的日期模式 sdf.applyPattern("yyyy/MM/dd HH:mm:ss"); System.out.println(sdf); // 将字符串转换为日期对象 Date d = sdf.parse(dateStr); System.out.println(d); } }
4. Calendar类的使用
Calendar类概述 * 是一个抽象类,不能直接创建对象的。 如何创建日历对象 * 通过Calender类的静态方法创建日历对象 * static Calendar getInstance() Calendar类的常用方法 * int get(int field); * 根据日历字段获得对应的值 * void add(int field,int value) * 将指定日历字段的值在原值的基础上偏移一个值 * 负数,则向前偏移 * 正式,则向后偏移 * void set(int field, int value) * 设置指定日历字段的值为指定的值 * void set(int year,int month, int date) * 设置日历时间为指定的年月日 * Date getTime(); 获得日期对象 * long getTimeInMillis(); 获得时间的毫秒值。 注意事项 * 获得月份需要加一才是我们正确的月份,因为月份默认是0到11
- 示例代码
public class CalendarDemo01 { public static void main(String[] args) { // 获得日历对象 Calendar c = Calendar.getInstance(); // 获得日期对象 Date d = c.getTime(); // 直接通过日历对象获得毫秒值 long time = c.getTimeInMillis(); System.out.println(time); System.out.println(d.getTime()); // 修改年月份 c.set(2000, 12, 20); // 修改年份 // c.add(Calendar.YEAR, -1); // 修改月份 // c.add(Calendar.MONTH, 10); // 修改日 // c.add(Calendar.DATE, 20); // c.set(Calendar.YEAR, 2020); // 根据日历字段获得对应的值 System.out.println(c.get(Calendar.YEAR)); System.out.println(c.get(Calendar.MONTH) + 1); System.out.println(c.get(Calendar.DATE)); System.out.println(c.get(Calendar.HOUR)); System.out.println(c.get(Calendar.MINUTE)); System.out.println(c.get(Calendar.SECOND)); } }
5. Calendar练习
- 求出今天距离2020年1月1日还有多少天
public class CalendarDemo02 { public static void main(String[] args) { // 创建日历对象 Calendar c = Calendar.getInstance(); // 获得当前时间的毫秒值 long today = c.getTimeInMillis(); // 修改日历时间 c.set(2020, 0, 1); // 获得2020年1月1日的毫秒值 long future = c.getTimeInMillis(); // 两个毫秒值相减 long distance = future - today; System.out.println("还有"+(distance/1000/3600/24)+"天"); } }
6. Math类概述
6.1 常用方法
static double sqrt(double d):返回参数的平方根的值 static double pow(double a, double b):返回a的b次方的值 static double floor(double d):返回小于等于参数d的最大整数 static double ceil(double d): 返回大于等于参数d的最小整数 static int abs(int i): 返回参数i的绝对值 Math.random():返回0到1的随机数: [0,1),本质还是使用Random类产生随机数 Math.round(double d):四舍五入
6.2 演示代码
public class MathDemo { public static void main(String[] args) { /*System.out.println(Math.sqrt(9)); System.out.println(Math.sqrt(4)); System.out.println(Math.abs(-4)); System.out.println(Math.abs(4)); System.out.println(Math.pow(2, 4));*/ System.out.println(Math.floor(2.0)); System.out.println(Math.floor(2.4)); System.out.println(Math.floor(2.9)); System.out.println("---------------"); System.out.println(Math.ceil(2.0000)); System.out.println(Math.ceil(2.4)); System.out.println(Math.ceil(2.9)); System.out.println(Math.random()); System.out.println(Math.round(4.45)); System.out.println(Math.round(4.5)); } }
7. System类概述
7.1 常用方法
* static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) * 数组复制 * src:源数组 * srcPos:源数组的起始索引 * dest:目标数组 * destPos:目标数组的起始索引 * length:复制几个元素 * static Properties getProperties() * 获得操作系统的属性:比如操作系统名称 * static long currentTimeMillis() * 获得当前时间的毫秒值 * static void exit(int status) * 退出JVM,终止程序运行。 * static void gc(): garbage collect * 通知垃圾回收器回收垃圾对象,仅仅是通知,未必会真正执行回收操作。
7.2 演示代码
public class SystemDemo {
public static void main(String[] args) {
// 获得操作系统的属性
Properties pro = System.getProperties();
System.out.println(pro.getProperty("os.name"));
}
/**
* 数组拷贝方法:arraycopy
*/ public static void test03() {
// 源数组
int[] src = {1,2,3,4,5,6};
// 目标数组
int[] dest = new int[6];
System.out.println(Arrays. toString (dest));
// 数组复制
// System.arraycopy(src, 0, dest, 0, 6);
// 复制前三个
// System.arraycopy(src, 0, dest, 0, 3);
// System.arraycopy(src, 2, dest, 0, 3);
// System.arraycopy(src,3, dest, 4, 3);
System.out.println(Arrays.toString(dest));
}
/**
static void gc(): garbage collect
* 通知垃圾回收器回收垃圾对象,仅仅是通知,未必会真正执行回收操作。
*/ public static void test02() {
for (int index = 0; index < 100; index++) {
// 创建学生对象
new Student();
// 通过垃圾回收器回收垃圾
System.gc();
}
}
/**
static long currentTimeMillis()
* 获得当前时间的毫秒值
*/ public static void test01() {
long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
System.out.println(i);
}
System.out.println(System.currentTimeMillis() - start);
}
}
8. 基本数据类型包装类
- 场景
- 通过文本框获得用户输入的数字数据,因为文本框里面是书写文本数据的,所以后台得到的都是字符串。如果想要对字符串中的数字进行运算,必须将字符串转换成数字。
- 怎么解决上述出现的问题?
- Java为每一种基本类型提供了类,这些类称为基本数据类型包装类。
- 每种包装类都提供相关的方法操作基本类型数据。
- 包装类常见操作有
- 将字符串转换为对应的基本数据类型。
- 将基本数据类型转换为字符串类型。
- 八种基本类型对应的包装类
char Character
int Integer
byte Byte
short Short
long Long
float Float
double Double
boolean Boolean
9. Integer包装类的概述
- 构造方法
- Integer(int value);将一个整数value转换成整型包装类对象。
- Integer(String s);将一个字符串数值转换成整型包装类对象。
- 成员方法
- int intValue();将构造方法中的字符串转换成基本类型。
- static int parseInt();把字符串转换为int值。
- static String toString(int i);将整数i转换成字符串
- 静态成员变量
- Integer.MAX_VALUE:整数最大值
- Integer.MIN_VALUE:整数最小值
- 演示代码
public class IntegerDemo { public static void main(String[] args) { // 创建整型包装类对象 Integer in = new Integer("100"); // 获得基本数据类型 int price = in.intValue(); System.out.println(price); // 直接将字符串数字转换整数 System.out.println(Integer.parseInt("200")); System.out.println(Integer.toString(100)+1); System.out.println(100+""); Double dd = new Double("0.9"); dd.doubleValue(); double d = Double.parseDouble("0.9"); System.out.println(d+1); String f = "true"; boolean ff = Boolean.parseBoolean(f); if(ff) { System.out.println("条件成立"); } System.out.println(Long.MAX_VALUE); System.out.println(Long.MIN_VALUE); } }
10. 自动装箱和自动拆箱
自动装箱和自动拆箱的概述 * JDK1.5的新特性。 自动装箱的概念 * 自动将基本数据类型转换为对应的包装类类型的过程。 自动拆箱的概念 * 自动将包装类类型转换为对应基本数据类型的过程。 注意事项 * 自动装箱和自动拆箱是编译器自动完成的,在编译期会根据语法决定是否需要进行装箱和拆箱。
- 示例代码
public class Demo01 { public static void main(String[] args) { int a = 100; // 基本数据类型 Integer b = new Integer(200);// 包装类类型 // 在JDK1.5之前 // int result1 = a + b.intValue(); // 在JDK1.5之后 int result = a + b; // 100 + b.intValue(); 自动拆箱 // Integer sum = Integer.valueOf(a + b.intValue()) 自动拆箱和自动装箱 Integer sum = a + b; System.out.println(result); // 创建集合:添加元素时,设计到自动装箱 ArrayList<Integer> list= new ArrayList<>(); list.add(111); // list.add(Integer.valueOf(111)); list.add(222); list.add(new Integer(111)); list.add(Integer.valueOf(111)); int num = list.get(0); // 自动拆箱 } }
11. 正则表达式的概念和作用
11.1 什么是正则表达式
- 一个用来定义规则的字符串
11.2 正则表达式的作用
- 用来校验某一个字符串是否符合规则。
11.3正则表达式语法规则
- 字符
x 匹配字符x \t 匹配制表符 \n 匹配换行 \r 匹配回车
- 字符类[记忆]
[abc] 匹配abc中任意一个字符 [^abc] 匹配除abc以为的任意一个字符 [a-zA-Z] 匹配任意一个字母 [0-9] 匹配任意一个数字 [a-zA-Z_0-9] 匹配所有字母,数字,下划线中任意一个。 * 中括号中可以放n个字符,但匹配时只能匹配其中任意一个。
- 预定义字符类[记忆]
. 通配符,可以匹配任意一个字符(除\n和\r) \d 等价[0-9] 匹配任意一个数字 \w 等价[a-zA-Z_0-9] 匹配所有字母,数字,下划线中任意一个。 \s 空白字符 空格,制表符
- 数量词[记忆]
X? X 可以出现0或1次 X* X 可以出现任意次 X+ X 至少要出现1次 X{n} X 刚好出现n次 X{n,} X 至少要出现n次 X{n,m} X 至少出现n次,至多出现m次 [n,m]
12. 正则表达式练习
12.1 匹配练习
- 检查手机号码是否合法
- 规则:1开头,第二位可以是34578 后面9位数0-9
- 正则表达式:
- 检查QQ是否合法
- 规则:0不能开头,全是数字,位数5到10位
- 正则表达式:
public class RegexDemo03 { public static void main(String[] args) { // 手机号码 String phone = "18434287735"; // 正则规则 String regex = "1[34578][0-9]{9}"; System.out.println(phone.matches(regex)); System.out.println("13456423451".matches("[1-9]\\d{4,9}")); } }
12.2 切割练习
- 2016-10-24 按照-切割字符串
- 18 22 44 66 按照空格切割字符串
- 192.168.1.204 按照点切割字符串
public class RegexDemo02 { public static void main(String[] args) { System.out.println(Arrays.toString("2016-10-24".split("-"))); System.out.println(Arrays.toString("18 22 44 66".split("\\s"))); System.out.println(Arrays.toString("192.168.1.204".split("\\."))); } }
12.3 替换练习
- 例子:
- “Hello12345World6789012” 将所有数字替换为 “#”
public class RegexDemo04 { public static void main(String[] args) { String str = "Hello12345World6789012"; // 将字符串str中符合正则规则的子串替换为 # // String result = str.replaceAll("\\d", "#"); String result = str.replaceAll("\\d+", "#"); System.out.println(str); System.out.println(result); } }
13. String类与正则相关的三个方法
boolean matches(String 正则的规则) 验证字符串是否符合正则规则 String[] split(String 正则的规则) 使用正则规则切割字符串 String replaceAll(String 正则规则,String 字符串) 将字符串中符合正则规则的子串替换为后面的字符串