笔记四:包装类和Lambda表达式


日期和时间

Date

  • Date类代表当前所在系统的日期时间信息

获取时间毫秒值

  • 无参构造器:public Date(),创建一个Data对象,代表的是系统当前时刻的日期时间

  • 调用方法:public long getTime(),返回从1970年1月1日00:00:00走到此刻的总的毫秒数

时间毫秒值到日期

  • 有参构造器:public Date(long time),把时间毫秒值转换成Date日期对象
  • 使用无参构造器对象的方法:public long setTime(),设置日期对象的时间为当前时间毫秒值对应的时间

SimpleDateFormat

  • 代表简单日期格式化,可以用来把日期时间格式化成为我们想要的形式,也可以把字符串的时间形式解析成Date日期对象

格式化

  • 构造器:public SimpleDateFormat(String pattern),创建简单日期格式化对象,并封装格式化的形式信息,对应设置pattern的格式如下

2020-11-11 13:27:06 $\Rightarrow$yyyy-MM-dd HH:mm:ss

2020年11月11日 13:27:06 $\Rightarrow$yyyy年MM月dd日 HH:mm:ss

  • 常用方法:①public final String format(Date date),将日期格式化成日期/时间字符串;②public final String format(Object time),将时间毫秒值格式化成日期/时间字符串

解析方法:public Date parse(String source),从给定字符串的开始解析文本以生成日期,字符串的格式要和定义的pattern相同,否则会报错

Calendar

定义:Calendar代表了系统此刻日期对应的日历对象。Calendar是一个抽象类,不能直接创建对象。Calendar是可变日期对象,一旦修改后其对象本身表示的时间将产生变化

创建日历对象的方法:public static Calendar getInstance()-->Calendar cal = Calendar.getInstance(),获取当前日历对象

常用方法:

方法名 说明
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() 拿到此刻时间毫秒值

JDK8新增日期类

Java 8开始,java.time包提供了新的日期和时间API,主要涉及的类型有以下几个,具体使用请查找Java API文档。

新增的API严格区分了时刻、本地日期、本地时间,并且,对日期和时间进行运算更加方便。其次,新API的类型几乎全部是不变类型(和String的使用类似),可以放心使用不必担心被修改。

包装类

定义:包装类其实就是8种基本数据类型对应的引用数据类型

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

提供包装类的原因:

  • Java为了实现一切皆对象,为8种基本类型提供了对应的引用类型

  • 后面的集合和泛型其实也只能支持包装类型,不支持基本数据类型

自动装箱:基本类型的数据和变量可以直接赋值给包装类型的变量

自动拆箱:包装类型的变量可以直接赋值给基本数据类型的变量

包装类特有功能:①包装类的变量的默认值可以是null,容错率更高。②可以把基本类型的数据转换成字符串类型(用处不大)。③可以把字符串类型的数值转换成真实的数据类型

  • 方法:调用toString()方法得到字符串结果,也调用Integer.toString(基本类型的数据);调用Integer.parseInt()得到“字符串类型的整数”;调用Double.parseDouble()得到“字符串类型的小数”。

正则表达式

作用:可以用一些规定的字符来制定规则,并用来校验数据格式的合法性

字符串对象提供了匹配正则表达式的方法:public boolean matches(String regex),判断是否匹配正则表达式,匹配返回true,不匹配返回false

语法:这里就列举一些常用的,具体可以查看API文档

字符 说明
[abc] 只能是a, b, 或c
[^abc] 除了a, b, c之外的任何字符
[a-zA-Z] a到z A到Z,包括(范围)
[a-d[m-p]] a到d,或m通过p:([a-dm-p]联合)
[a-z&&[def]] d, e, 或f(交集)
[a-z&&[^bc]] a到z,除了b和c
. 任何字符
\d 一个数字:[0-9]
\D 非数字:[^0-9]
\s 一个空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w [a-zA-Z_0-9] 英文、数字、下划线
\W [^\w] 一个非单词字符
X? X , 一次或根本不
X* X,零次或多次
X+ X , 一次或多次
X {n} X,正好n次
X {n, } X,至少n次
X {n,m} X,至少n但不超过m次

如:

System.out.println("a".matches("[abc]"));    // true
System.out.println("z".matches("[abc]"));    // false
System.out.println("ab".matches("[abc]"));   // false
System.out.println("ab".matches("[abc]+"));  // true

正则表达式在字符串方法中的使用:

方法名 说明
public String replaceAll(String regex,String newStr) 按照正则表达式匹配的内容进行替换
public String[] split(String regex): 按照正则表达式匹配的内容进行分割字符串,反回一个字符串数组

Arrays类

定义:数组操作工具类,专门用于操作数组元素的

Arrays类的常用API:

方法名 说明
public static String toString(类型[] a) 返回数组的内容(字符串形式)
public static void sort(类型[] a) 对数组进行默认升序排序
public static <T> void sort(类型[] a, Comparator<? super T> c) 使用比较器对象自定义排序
public static int binarySearch(int[] a, int key) 二分搜索数组中的数据,存在返回索引,不存在返回-1,使用该方法数组需先排好序

自定义排序规则:设置Comparator接口对应的比较器对象,来定制比较规则

  • 如果认为左边数据 大于 右边数据 返回正整数

  • 如果认为左边数据 小于 右边数据 返回负整数

  • 如果认为左边数据 等于 右边数据 返回0

常见算法

冒泡排序

思想:每次依次从数组第一个位置开始比较,若当前位置大于后一个位置则交换数据,依次进行到后面,这样每次结束后都将最大值放到数组的后面去。

规则:假定数组长度为n

  • 总共需要做多少轮:n-1
  • 比较的总次数:$(n-1)+(n-2)+…+1=\frac{n(n-1)}{2}$

选择排序

思想:每轮选择当前位置,开始找出后面的更小值与该位置交换

规则:假定数组长度为n

  • 总共需要做多少轮:n-1
  • 控制每轮从以前位置为基准,与后面元素选择几次

二分查找

需求:用于数组元素的基本查询,查询数组中的元素在哪个索引

规则:

  • 二分查找性能好,二分查找的前提是必须是排好序的数据
  • 二分查找相当于每次去掉一半的查找范围

实现步骤:

  • 定义变量记录左边和右边位置。

  • 使用while循环控制查询(条件是左边位置<=右边位置)

  • 循环内部获取中间元素索引

  • 判断当前要找的元素如果大于中间元素,左边位置=中间索引+1

  • 判断当前要找的元素如果小于中间元素,右边位置=中间索引-1

  • 判断当前要找的元素如果等于中间元素,返回当前中间元素索引

Lambda表达式

定义:Lambda表达式是JDK 8开始后的一种新语法形式

作用:简化匿名内部类的代码写法

简化格式:

(匿名内部类被重写方法的形参列表) -> {
    被重写方法的方法体代码;
}
// 注:-> 是语法形式,无实际含义

注意:Lambda表达式只能简化函数式接口的匿名内部类的写法形式

函数式接口:首先必须是接口,其次接口中有且仅有一个抽象方法的形式

public class LambdaDemo1 {
    public static void main(String[] args) {
        
        goSwimming( new Swimming() {
            @Override
            public void swim() {
                System.out.println("铁汁, 我们去游泳吧~");
            }
        } );
    }
    public static void goSwimming(Swimming swimming) {
        swimming.swim();
    }
}

// 使用Lambda表达式之后,可以看出代码更少,关注点更加明确了
public class LambdaDemo1 {
    public static void main(String[] args) {
        
        goSwimming( () -> {
		System.out.println("铁汁, 我们去游泳吧~") 
        } );
        
    }
    public static void goSwimming(Swimming swimming) {
        swimming.swim();
    }
}

进一步在Lambda表达式的基础上继续简化:

  • 参数类型可以省略不写。

  • 如果只有一个参数,参数类型可以省略,同时()也可以省略。

  • 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!

  • 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略”;”不写


文章作者: 不才叶某
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 不才叶某 !
评论
  目录