Java学习-面向对象进阶二
目录
1 日期与时间
1.1 Date类
1.2 Date类
1.3 练习--秒杀活动
1.4 Calender
1.5 JDK8新增API
1.5.1 概述
1.5.2 LocalDate、LocalTime、 LocalDateTime
2 包装类
3 正则表达式
3.1 概述
3.2 案例
3.3 爬取信息
4 Arrays类
4.1 Arrays类概述
4.2 排序
5 常见算法
5.1 选择排序
5.2 二分查找
6 Lambda表达式枚举
6.1 Lambda概述
6.2 Lambda表达式的省略规则
1 日期与时间
1.1 Date类
Date类概述
- Date类的对 象在Java中代表的是当前所在系统的此刻日期时间。
Date的构造器
public Date() 创建一个Date对象,代表的是系统当前此刻日期时间。Date的常用方法
public long getTime() 获取时间对象的毫秒值
//获取当前时刻Date date = new Date();System.out.println(date);//Tue Jul 19 18:10:07 CST 2022//获取时间毫秒 和之前学的System.currentTimeMillis()一样long time = date.getTime();System.out.println(time);long time1 = System.currentTimeMillis();System.out.println(time1);System.out.println("=====================");//等于加了一小时一分time += (60 * 60 + 60)*1000;Date d = new Date(time);System.out.println(d);
1.2 Date类
SimpleDateFormat类作用
- 可以对Date对象 或时间毫秒值格式化成我们喜欢的时间形式。
- 也可以把字符串的时间形式解析成日期对象。
SimpleDateFormat的构造器
public simpleDateFormat() 构造一个SimpleDateFormat,使用默认格式
public simpleDateFormat(String pattern) 构造一个SimpleDateFormat,使用指定的格式
SimpleDateFormat的格式化方法
public final String format(Date date) 将日期格式化成日期/时间字符串
public final String format(Object time) 将时间毫秒值式化成日期/时间字符串
格式化的时间形式的常用的模式对应关系如下:
2020-11-11 13:27:06 yyyy-MM-dd HH:mm:ss
2020年11月11日13:27:06 yyyy年MM月dd日HH:mm:ss
package com.itzw.d2_simpledateformat;import java.text.SimpleDateFormat;
import java.util.Date;public class Test01 {public static void main(String[] args) {//获取当前日期Date date = new Date();System.out.println(date);//格式化日期对象--最终的格式 EEE表示星期几 a表示上午还是下午SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");String rs = sdf.format(date);System.out.println(rs);System.out.println("===============================");long time = System.currentTimeMillis();//不仅可以接对象,还可以接时间毫秒值String rs2 = sdf.format(time);System.out.println(rs2);}
}
SimpleDateFormat解析字符串时间成为8期对象
public Date parse(String source) 从给定字符串的开始解析文本以生成日期
package com.itzw.d2_simpledateformat;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class Test02 {public static void main(String[] args) throws ParseException {String timeStr = "2022年7月1日 13:30:20";//目的:在此时间基础上往后加2天6小时5分SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");//将字符串日期转换为日期类型的对象Date d = sdf.parse(timeStr);System.out.println(sdf.format(d));//往后加2天6小时5分long time = d.getTime() + (2 * 24 * 60 * 60 + 6 * 60 * 60 + 5 * 60) * 1000;System.out.println(sdf.format(time));}
}
1.3 练习--秒杀活动
需求
- 小贾下单并付 款的时间为: 2020年11月11日0:03:47
- 小皮下单并付款的时间为: 2020年11月11日0:10:11
- 用代码说明这 两位同学有没有参加上秒杀活动?
分析
- 判断下单时间是否在开始到结束的范围内。
- 把字符串形 式的时间变成毫秒值。
package com.itzw.d2_simpledateformat;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class Test03 {public static void main(String[] args) throws ParseException {String startTime = "2022-7-19 19:00:00";String endTime = "2022-7-19 19:10:00";String xiaoJia = "2022-7-19 19:06:20";String xiaoPi = "2022-7-19 19:10:21";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date d1 = sdf.parse(startTime);Date d2 = sdf.parse(endTime);Date d3 = sdf.parse(xiaoJia);Date d4 = sdf.parse(xiaoPi);if (d3.before(d2)&&d3.after(d1)){System.out.println("小贾秒杀成功!!!");}else{System.out.println("小贾秒杀失败。。。。");}if (d4.before(d2)&&d4.after(d1)){System.out.println("小皮秒杀成功!!!");}else{System.out.println("小皮秒杀失败。。。。");}}
}
1.4 Calender
Calender是一个抽象类
Calendar常用方法
方法名 说明
public int get(int field) 取日期中的某个字段信息。
public void set(int field, int value) 修改日历的某个字段信息。
public void add(int field, int amount) 为某个字段增加/减少指定的值
public final Date getTime() 拿到此刻日期对象。
public long getTimeInMillis( ) 拿到此刻时间毫秒值
//拿到系统此时的日历对象Calendar cal = Calendar.getInstance();System.out.println(cal);int year = cal.get(Calendar.YEAR);System.out.println(year);System.out.println(cal.get(Calendar.MONTH) + 1);System.out.println(cal.get(Calendar.DAY_OF_MONTH));System.out.println(cal.get(Calendar.DAY_OF_YEAR));
1.5 JDK8新增API
1.5.1 概述
- 从ava 8开始,java.time包提供了新的日期和时间API,主要涉及的类型有:
LocalDate:不包含具体时间的日期。
LocalTime:不含日期的时间。
LocalDateTime:包含了日期及时间。
Instant:代表的是时间戳。
DateTimeFormatter用于做时间的格式化和解析的
Duration:用于计算两个“时间”间隔
Period:用于计算两个“日期”间隔
- 新增的API严格区分了时刻、本地日期、本地时间,并且,对日期和时间进行运算更加方便。
- 其次,新API的类型几乎全部是不变类型( 和String的使用类似),可以放心使用不必担心被修改。
1.5.2 LocalDate、LocalTime、 LocalDateTime
- 他们分别表示日期,时间,日期时间对象,他们的类的实例是不可变的对象。
- 他们三者构建对象和API都是通用的
//1.获取本地日期对象LocalDate nowDate = LocalDate.now();System.out.println("今天的日期是:" + nowDate);System.out.println(nowDate.getYear());System.out.println(nowDate.getMonth());System.out.println(nowDate.getDayOfMonth());System.out.println(nowDate.getDayOfWeek());
关于时间的使用不想看了,用到再说吧。。。
2 包装类
包装类
- 其实就是8种基本数据类型对应的引用类型。
基本数据类型 引用数据类型
byte Byte
short Short
int Integer E
long Long
char Character
float Float
double Double
boolean Boolean
为什么提供包装类?
- Java为了实现一切皆对象,为8种基本类型提供了对应的引用类型。
- 后面的集合和泛型其实也只能支持包装类型,不支持基本数据类型。
自动装箱:基本类型的数据和变量可以直接赋值给包装类型的变量。
自动拆箱:包装类型的变量可以直接赋值给基本数据类型的变量。
包装类的特有功能
- 包装类的变量的默认值可以是null,容错率更高。
- 可以把基本类型的数据转换成字符串类型(用处不大)
调用toString()方法得到字符 串结果。
调用Integer.toString(基本类型的数据)。
- 可以把字符串类型的数值转换成真实的数据类型(真的很有用)
Integer.parselnt( “字符串类型的整数”)
Double.parseDouble( “字符串类型的小数”)。
package com.itzw.d5_integer;public class Test01 {public static void main(String[] args) {int a = 1;Integer a1 = 1;System.out.println(a);System.out.println(a1);//int b = null;Integer b1 = null;//可以赋空值//可以将字符串转为数值String c = "123";int c1 = Integer.parseInt(c);//用valueof也可以,而且是通用的Integer c2 = Integer.valueOf(c);System.out.println(c1+1);System.out.println(c2+1);String d = "99.9";double d1 = Double.parseDouble(d);double d2 = Double.valueOf(d);System.out.println(d1+1);System.out.println(d2+1);}
}
3 正则表达式
3.1 概述
- 正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。
正则表达式初体验
- 需求:假如现在要求校验一个qq号码是否正确,6位及20位之内,必须全部是数字。
- 先使用目前所学知识完成校验需求;然后体验一下正则表达式检验。
package com.itzw.d6_regex;public class Test01 {public static void main(String[] args) {String qq1 = "36597589263";String qq2 = "365975a9263";String qq3 = null;String qq4 = "3659";System.out.println(checkQQ(qq1));System.out.println(checkQQ(qq2));System.out.println(checkQQ(qq3));System.out.println(checkQQ(qq4));System.out.println(checkQQ2(qq1));System.out.println(checkQQ2(qq2));System.out.println(checkQQ2(qq3));System.out.println(checkQQ2(qq4));}//正则表达式public static boolean checkQQ2(String qq){return qq != null && qq.matches("\\d{6,20}");}//传统方法public static boolean checkQQ(String qq){//如果是空直接返回false,判断个数if (qq == null || qq.length() > 20 || qq.length() < 6)return false;//判断是否全部是数字for (int i = 0; i < qq.length(); i++) {char c = qq.charAt(i);if (c < '0' || c > '9')return false;}return true;}
}
3.2 案例
检测手机号、座机号和邮箱
package com.itzw.d6_regex;import java.util.Scanner;public class Test02 {public static void main(String[] args) {//目标: 检验手机号 邮箱 座机号//checkPhone();//checkEmail();checkTel();}//座机号public static void checkTel(){Scanner sc = new Scanner(System.in);while (true) {System.out.println("请输入座机号:");String tel = sc.next();//X?表示X有或没有//021784327 021-784327if (tel.matches("0\\d{2,6}-?\\d{5,20}")){System.out.println("座机号注册成功!");}else {System.out.println("座机号册失败。。。");}}}//邮箱public static void checkEmail(){Scanner sc = new Scanner(System.in);while (true) {System.out.println("请输入邮箱:");String email = sc.next();//\\d表示数字,{9}表示九位,\\w表示数字字母下划线_//124231@qq.com e4144@123.com 31314@14.com.cnif (email.matches("\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2}")){System.out.println("邮箱注册成功!");}else {System.out.println("邮箱注册失败。。。");}}}//手机号public static void checkPhone(){Scanner sc = new Scanner(System.in);while (true) {System.out.println("请输入手机号:");String phone = sc.next();//\\d表示数字,{9}表示九位if (phone.matches("1[3,9]\\d{9}")){System.out.println("手机号注册成功!");}else {System.out.println("手机号注册失败。。。");}}}
}
3.3 爬取信息
package com.itzw.d6_regex;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Test03 {public static void main(String[] args) {String rs = "来黑马程序学习Java,电话020-43422424, 或者联系邮箱" +"itcast@itcast.cn,电话18762832633,0203232323" +"邮箱bozai@itcast.cn, 400-100-3233 ,4001003232";//1.定义爬虫规则,字符串形式String regex = "(1[3,9]\\d{9})|(\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2})" +"|(0\\d{2,6}-?\\d{5,20})|(400-?\\d{3,9})";//2.把爬虫规则编译成匹配对象Pattern pattern = Pattern.compile(regex);//3.得到内容匹配器对象Matcher matcher = pattern.matcher(rs);//4.开始找while (matcher.find()){String group = matcher.group();System.out.println(group);}}
}
4 Arrays类
4.1 Arrays类概述
- 数组操作工具类,专门用于操作数组元素的。
Arrays类的常用API
方法名 说明
String toString(类型[] a) 返回数组内容
void sort(类型[] a) 对数组进行默认升序排序
<T> void sort() 使用比较器对象自定义排序
int binarySearch(int[] a, int key) 二分搜索数组中的数据,存在返回索引,不存在返回-1
演示:
package com.itzw.d7_arrays;import java.util.ArrayList;
import java.util.Arrays;public class Test01 {public static void main(String[] args) {int[] arr = {6,18,2,99,3,1,34};//返回数组内容System.out.println(Arrays.toString(arr));//排序,默认升序Arrays.sort(arr);System.out.println(Arrays.toString(arr));//二分查找,必须在排序后查找,返回对应值的下标,找不到返回应该在的位置+1的相反数System.out.println(Arrays.binarySearch(arr, 18));System.out.println(Arrays.binarySearch(arr,10000));}
}
4.2 排序
Arrays类的排序方法
- public static void sort(类型[] a) 对数组进行默认升序排序
- public static <T> void sort(类型[] a, Comparator<? super T> c) 使用比较器对象自定义排序
自定义排序规则
- 设置Comparator接 口对应的比较器对象,来定制比较规则。
如果认为左边数据大于右边数据返回正整数
如果认为左边数据小于右边数据返回负整数
如果认为左边数据等于右边数据返回0
package com.itzw.d7_arrays;import java.util.Arrays;
import java.util.Comparator;public class Test02 {public static void main(String[] args) {int[] arr = {6,18,2,99,3,1,34};Arrays.sort(arr);//默认升序System.out.println(Arrays.toString(arr));//但我想降序//首先数组是引用类型数组Integer[] arr2 = {6,18,2,99,3,1,34};//第二个参数是一个比较器,修改比较规则就可以了Arrays.sort(arr2, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});System.out.println(Arrays.toString(arr2));//对自己床架的对象进行排序Student[] s = new Student[3];s[0] = new Student("张麻子",44,180.8);s[1] = new Student("马邦德",46,182.8);s[2] = new Student("张牧之",45,179.8);Arrays.sort(s, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {//return o1.getAge() - o2.getAge();//double类型的要换个方法return Double.compare(o2.getHeighe(),o1.getHeighe());//降序}});System.out.println(Arrays.toString(s));}
}class Student{private String name;private int age;private double heighe;public Student(){}public Student(String name, int age, double heighe) {this.name = name;this.age = age;this.heighe = heighe;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getHeighe() {return heighe;}public void setHeighe(double heighe) {this.heighe = heighe;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", heighe=" + heighe +'}';}
}
5 常见算法
5.1 选择排序
选择排序的思想
- 每轮选择当前位置,开始找出后面的较小值与该位置交换
选择排序的关键
- 确定总共需要选择几轮:数组的长度-1.
- 控制每轮从以前位置为基准,与后面元素选择几次。
package com.itzw.d8_sort;import java.util.Arrays;public class SelectSort {public static void main(String[] args) {//选择排序int[] arr = {5,1,3,2};for (int i = 0; i < arr.length - 1; i++) {for (int j = i + 1; j < arr.length; j++) {int temp;if (arr[i] > arr[j]){temp = arr[i];arr[i] = arr[j];arr[j] = temp;//1532}}}System.out.println(Arrays.toString(arr));}
}
5.2 二分查找
数组的二分查找的实现步骤是什么样的?
- 定义变量记录左边和右边位置。
- 使用while循环控制查询 (条件是左边位置<: =右边位置)
- 循环内部获取中间元素索引
- 判断当前要 找的元素如果大于中间元素,左边位置=中间索引+1
- 判断当前要 找的元素如果小于中间元素,右边位置=中间索引-1
- 判断当前要找的元素如果等 于中间元素,返回当前中间元素索引。
package com.itzw.d8_sort_search;public class BinarySearch {public static void main(String[] args) {int[] arr = {10,14,17,21,34,56,78};System.out.println(binarySearch(arr, 100));System.out.println(binarySearch(arr, 56));System.out.println(binarySearch(arr, 14));}/*** 二分查找的实现* @param arr 数组* @param data 要查找的值* @return 索引,若元素不存在返回-1*/public static int binarySearch(int[] arr,int data){int left = 0;int right = arr.length - 1;int midIndex;while (left <= right){midIndex = (left + right) / 2;if (arr[midIndex] > data){//中间数大于我想找的数,中间索引减一赋给右索引right = midIndex - 1;}else if(arr[midIndex] < data){//中间的数小于想找的数,中间索引加一赋给左索引left = midIndex + 1;}else {return midIndex;}}return -1;//找不到}
}
6 Lambda表达式枚举
6.1 Lambda概述
- Lambda表达式是JDK 8开始后的一种新语法形式。
- 作用:简化匿名内部类的代码写法。
Lambda表达式的简化格式
(匿名内部类被重写方法的形参列表) -> {
被重写方法的方法体代码。
}
注: -> 是语法形式,无实际含义
注意: Lambda表达式只能简化函数式接口的匿名内部类的写法形式
什么是函数式接口?
- 首先必须是接口、其次接口中有且仅有-一个抽象方法的形式
- 通常我们会在接口,上加上一个@FunctionalInterface注解,标记该接口必须是满足函数式接口。
package com.itzw.lambda;public class Test01 {public static void main(String[] args) {//lambda只能用于接口中只有一个方法的匿名内部类Swimming s = new Swimming() {@Overridepublic void swim() {System.out.println("学生游泳很开心。。。");}};go(s);System.out.println("===========================");//简化Swimming s1 = () -> {System.out.println("老师游泳贼快。。。");};go(s1);System.out.println("==============================");//再简化go(() -> {System.out.println("运动员游泳飞快。。。");});}public static void go(Swimming swimming){System.out.println("开始。。。。");swimming.swim();System.out.println("结束。。。。");}
}@FunctionalInterface
interface Swimming{void swim();
}
6.2 Lambda表达式的省略规则
- Lambda表达式的省略写法(进- -步在Lambda表达式的基础.上继续简化)
- 参数类型可以省略不写。
- 如果只有一个参数,参数类型可以省略,同时()也可以省略。
- 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!
- 如果Lambda表达式的方法体代码只有一-行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写
Arrays.sort(arr2, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});//化简Arrays.sort(arr2, (Integer o1, Integer o2) -> {return o2 - o1;});//再化简Arrays.sort(arr2, ( o1,o2) -> o2 - o1);System.out.println(Arrays.toString(arr2));
Java学习-面向对象进阶二相关推荐
- Java学习-面向对象进阶
目录 1 static 1.1 static修饰成员变量 1.2 static修饰成员方法 1.3 static注意事项 1.4 工具类 1.5 工具类的应用练习 1.6 代码块 1.6.1 代码块概 ...
- Java入门123:一个老鸟的Java学习心得(二维码版)
Java入门123:一个老鸟的Java学习心得(二维码版)清华大学出版社 Java入门123--一个老鸟的Java学习心得(二维码版)充分考虑了初学Java的种种困难,讲解细致入微,抽丝剥茧,层层推进 ...
- python内置函数面向对象_Pyhton——面向对象进阶二:类的内置函数补充、描述符...
Pyhton--面向对象进阶二: 一.类的内置函数补充 1.isinstance(obj,cls)--检查obj是否是该类的对象 class Hoo: def __init__(self,name,t ...
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- java学习笔记(二十八)——开发一个小项目(VMeeting3.0)
上篇文章按照较规范的产品需求文档梳理了项目的逻辑,感觉开发起来明晰了很多:挂上一篇文章java学习笔记(二十七)--开发一个小项目(VMeeting2.0)_Biangbangbing的博客-CSDN ...
- 动力节点『lol版』Java学习路线图(二)JavaSE基础阶段
先上干货,再讲故事.召唤师,准备好你的键盘了吗?开战吧! 二.北地禁魔 Java零基础需要掌握的技术 背景故事: 世界被同化之后,符文之地有些地区发生了变化.首当其中的便是德邦与北地.两地边界渐融, ...
- Java学习路线·进阶
Java学习路线是CSDN面向开发者提供系统化「学+练」产品,帮助每一位学习者成为一名优秀的Java工程师. 学习路线系统的涵盖了Java领域内容从初级到进阶所需要学习的一系列「知识点」,内容覆盖Ja ...
- Java学习笔记(二):Java程序基础
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://mp.csdn.net/mdeditor/100619398 目录 ...
- java学习-zxing生成二维码矩阵的简单例子
这个例子需要使用google的开源项目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下载jar文件,也可使用maven添加依赖 <dependency><gro ...
最新文章
- 服务器创建和附加虚拟磁盘,Windows 7 虚拟硬盘中的新增功能
- 在使用Reference Source调试.Net 源代码时如何取消optimizations(代码优化)-翻译
- android 控件随手指移动_液体流动控件,隔壁产品都馋哭了
- SpringBatch批处理框架入门(二)
- 【Linux系统编程】进程间通信--共享内存
- [社会趣闻]储户召集7名亲友占满银行窗口 每次存一元
- Java面试题 20在面向对象编程里,经常使用is-a来说明对象之间的继承关系
- bp神经网络预测模型_【2020顶会KDD】AutoST:面向时空预测的高效神经网络学习模型...
- life of a NPTL pthread
- 苹果付费app共享公众号_娄底共享云店铺公众号
- for循环使用后contains方法失去效果
- android 单手模式开发,单手操作毫无压力 安卓单指缩放技巧
- java多线程join()方法原理详解
- 在VS2017(VC15)上配置opencv4.0.1环境
- 2017java考证_Sun认证Java程序员考试试题
- 安川服务器显示run电机没电,安川变频器上电无显示,无法设定参数是什么原因...
- 2021-02-01 25 个常用 Matplotlib 图的 Python 代码
- amd的服务器cpu型号大全,AMD CPU型号大全
- python ffmpeg剪辑视频_FFmpeg精准时间切割视频文件
- 2022-10-24 ClickHouse 源码解析-查询引擎经典理论
热门文章
- Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsEx
- 什么是报表工具?和 EXCEL 有什么区别?
- PC - 电脑应该多久清洁一次?
- 奉劝那些想涨工资的程序员,这些 IT 大神们都在用的网站,你越早知道越好(建议收藏)!!...
- 全球2018OpenStack用户调查报告亮点一览
- pmw.php,加速调光频率 PWM实现精准LED调光
- 计算机正确的录入指法教案,《文字录入教案》word版.doc
- Vue Cannot read property ‘xxx‘ of undefined
- 个性化智能推荐(协同过滤算法)技术研究
- 一个XSS靶场练习记录