对象的清理:
JDK1.9以前,使用Object中的finalize()方法;
JDK1.9后,java.lang.ref.Cleaner类(基于AutoCloseable接口资源释放,对象释放前,启动对象清理线程)
public class CleaningExample implements AutoCloseable {
// A cleaner, preferably one shared within a library
private static final Cleaner cleaner = ;
static class State implements Runnable {
State(...) {
// initialize State needed for cleaning action
}
public void run() {
// cleanup action accessing State, executed at most once
}
}
private final State state;
private final Cleaner.Cleanable cleanable;
public CleaningExample() {
this.state = new State(...);
this.cleanable = cleaner.register(this, state);
}
public void close() {
cleanable.clean();
}
}
利用Object中的clone()方法;属于浅克隆,
浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
总之深浅克隆都会在堆中新分配一块区域,区别在于对象属性引用的对象是否需要进行克隆(递归性的)。
深克隆与浅克隆的区别:
是否克隆对象之中其他引用结构中的数据;
Module java.base
Package java.util.random
实例化:
Random()
Creates a new random number generator.`
public int nextInt(int bound)
Returns a pseudorandom, uniformly distributed int
value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator’s sequence.
40选8
package Review;
import java.util.Arrays;
import java.util.Random;
/*要求:
* 从40里面选8个数,
* 且8个数字不能为0,也不能重复*/
class LotteryTicket {
private int index ; //操作data脚标
private int data[]; //保存最终数据
Random rand = new Random() ;
public LotteryTicket() {
this.data = new int[8] ; //动态初始化
}
public void random() { //生成随机数
while (this.index < this.data.length) {
int code = this.rand.nextInt(40) ;
if (this.isExists(code)) {
this.data[this.index++] = code; //保存生成的随机数
}
}
}
private boolean isExists(int code) {
if (code == 0){
return false ;
}
for ( int temp : this.data) {
if (temp == code) {
return false;
}
}
return true ;
}
public int[] getData() {
Arrays.sort(this.data);
return data;
}
}
public class RandonTest111 {
public static void main(String[] args) throws Exception{
LotteryTicket lotteryTicket = new LotteryTicket() ;
lotteryTicket.random(); //生成随机数
for (int temp : lotteryTicket.getData()) {
System.out.print(temp + "、");
}
}
}
double基本数据最大可储存:1.7976931348623157E308
若超过此类数字,该怎么处理?
Module java.base
Package java.math
常用的十进制数和浮点数;
实例化:public BigInteger(String val)
Translates the decimal String representation of a BigInteger into a BigInteger.
用Date实例的当前时间就是一个时间戳(毫秒数)
Module java.base
Package java.util Class Date
构造方法中没有被弃用两个构造方法:
实例化:
public Date()
public Date(long date)
public long getTime();
Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT represented by this Date
object.
public Date(long date)
Allocates a Date
object and initializes it to represent the specified number of milliseconds since the standard base time known as “the epoch”, namely January 1, 1970, 00:00:00 GMT.
将long型时间戳的数据转为 “the epoch”, namely January 1, 1970, 00:00:00 GMT.
JDK1.8以后提供方便日期操作,提供java.time包
获取当前日期时间数据,日期的累加操作都可以从Claa LocalDateTime中
public static LocalDateTime now()
用date类计算日期时,是用毫秒数,而如果想直接增加天数、月数、年数一系列日期计算,还可以用于获取某月的最后一天等操作,就可以用:
java.util.Calemdar
JDK1.8后,追加新的日期时间处理包java.time,使得日期操作更简便
Module java.base
Package java.time
Class LocalDate
提供3个方法:=LocalDate(最重要的功能操作类)、LocalTime、LocalDATeTime
更简单进行日期、时间或日期时间的处理。
public class GlobalDemo {
public static void main(String[] args) throws Exception{
LocalDate localDate = LocalDate.now() ;
LocalTime localTime = LocalTime.now() ;
LocalDateTime localDateTime = LocalDateTime.now() ;
System.out.println(localDate);
System.out.println(localTime);
System.out.println(localDateTime);
}
}
输出:
2022-04-30
20:59:30.476184300
2022-04-30T20:59:30.476184300
较为重要的LocalDate类:除了利用toString()可以获取时间,还可以针对年、月、日分开获取;还可以判断是否为闰年
public boolean isLeapYear()
最大的功能:可以直接进行日期的计算处理,例如:获取所在月的第几天、最后一天,多少个月或年之后的日期,
package Review;
import java.time.LocalDate;
import java.time.temporal.ChronoField;
public class GlobalDemo {
public static void main(String[] args) throws Exception{
LocalDate today = LocalDate.now() ; //获取当前日期
System.out.println(String.format("【当前日期】 %s-%s-%s",
today.getYear(),
today.getMonthValue(),
today.getDayOfMonth()));
System.out.println("今日为本周的第" + today.getDayOfWeek().getValue() + "天");
System.out.println("今日为本月的第" + today.get(ChronoField.ALIGNED_WEEK_OF_MONTH) + "周");
System.out.println("今日为本年的第" + today.get(ChronoField.ALIGNED_WEEK_OF_YEAR) + "周");
System.out.println("今日为本年的第" + today.getDayOfYear() + "天");
}
}
【当前日期】 2022-4-30
今日为本周的第6天
今日为本月的第5周
今日为本年的第18周
今日为本年的第120天
格式化:根据特定的格式进行处理
Date中获取的日期格式(the epoch", namely January 1, 1970, 00:00:00 GMT)不适宜所有地区的人观看
此时可以希望格式化日期格式
Module java.base
Package java.text
Class SimpleDateFormat
java.lang.Object
java.text.Format
java.text.DateFormat
java.text.SimpleDateFormat
DataFormat中的方法:
方法 | 描述 |
---|---|
SimpleDateFormat pattern) | 实例化且传入格式化模式 |
public final String format(Date date) | Formats a Date into a date-time string.将日期格式化为字符串 |
public Date parse(String) throws ParseException | 将字符串格式化为日期 |
格式化模式,即日期时间的匹配表达式,最重要的几个:年(yyyy)、月(MM)、日(dd)、时(HH)、分(mm)、秒(ss)、毫秒(SSS)
//日期砖字符串
package Review;
import java.text.SimpleDateFormat;
import java.util.Date;
public class GlobalDemo {
public static void main(String[] args) throws Exception{
Date date = new Date() ;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:m:ss") ;
String str = sdf.format(date) ; //将日期转为为字符串
System.out.println(str);
}
}
更常用的时将数据输入的字符串转换成日期:
package Review;
import java.text.SimpleDateFormat;
import java.util.Date;
public class GlobalDemo {
public static void main(String[] args) throws Exception{
String str = "2022-4-30 20:43:40" ;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:m:ss") ;
Date date = sdf.parse(str) ; //字符串转为日期
System.out.println(date);
}
}
输出:Sat Apr 30 20:43:40 CST 2022
利用LocalDateTime类实现日期时间格式化转换处理:
新时期要替换掉SimpleDateFomat
package Review;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class GlobalDemo {
public static void main(String[] args) throws Exception{
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") ;
ZoneId zoneId = ZoneId.systemDefault() ; //获取当前时区ID
for (int x = 0; x < 10; x++) {
new Thread(() -> {
LocalDateTime localDateTime = LocalDateTime.parse("2000-05-12 20:11:11", formatter) ;
Instant instant = localDateTime.atZone(zoneId).toInstant() ; //获得当前时区的实例
Date date = Date.from(instant) ; //字符串转为日期
System.out.println("【" +Thread.currentThread().getName() + "】"+ date);
},"SDF转换线程-" + x).start();
}
}
}
实际上也利用LocalDate类实现日期时间格式化转换处理,类似;
提示:多线程下使用SimpleDateformat类将日期转为字符串,此时共享SimpleDateFormat对象,进行转换不会程序错误,而在,字符串转日期时候会出现错误。
字符串的应用,保存数据信息,可以向所有数据类型转换,还有一个主要支持,就是正则表达式。
正则:方便实现是v就的拆分,替换,验证等操作
JDK1.4提供正则开发包:java.util.regex,提供两个核心类:Matcher(匹配)、Pattern(表达式处理)
public static boolean matches(String regex, CharSequence input)
Compiles the given regular expression and attempts to match the given input against it.
1.单个字符:匹配单个个字符
[0-9]:表示0-9数字中的一个
3. 简化表达式 其他标记的简写
JDK1.4修改了String类的定义(可以通过字符串类直接进行正则的处理操作)
正则表达式主要进行字符串的分析
正则的匹配处理:如果要进行正确的数据转换,则一定进行验证,因为这样才可以保证转换过程不出现错误。
package Review;
public class GlobalDemo {
public static void main(String[] args) throws Exception{
String str = "9393959" ;
String regex = "\\d+" ;
if (str.matches(regex)) {
System.out.println("字符串转为数字:" + Integer.parseInt(str));
}else {
System.out.println("字符串不符合正则规则,无法转换");
}
}
}
判断电话号码格式是否正确:
package Review;
public class GlobalDemo {
public static void main(String[] args) throws Exception{
String str = "+8615677495253" ;
/*号码形式三种:
* 15677495253、区号15677495253、 +区号15677495253 */
String regex ="((\\+|00)\\d{2})?\\d{11}" ;
System.out.println(str.matches(regex));
}
}
输出:true
判断Email组成结构:
email组成原则:用户名可以由字母,数字,下划线,中划线,“ . " 组成,
域名只能使用字母,数字, “-”, 所组成,结尾后缀必须是 “.com”, “.com.cn”, “.net”, ".edu"等组成
package Review;
public class GlobalDemo {
public static void main(String[] args) throws Exception{
String str = "[email protected]" ;
//首字母只能是字母或下划线
String regex =
"[a-zA-Z][a-zA-Z\\-_\\.]+@[a-zA-Z0-9\\-]+\\.(com|net\\.cn|edu)" ;
System.out.println(str.matches(regex));
}
}
输出:true
主要功能进行正则表达式的编译处理
实例化:调用内部public static Pattern compile(String regex)
package Review;
import java.util.regex.Pattern;
public class GlobalDemo {
public static void main(String[] args) throws Exception{
String str = "ww243w.b43432aidu.co2436m" ;
//首字母只能是字母或下划线
String regex = "\\d+";
// 利用字符串split就是省略了下面内容
Pattern pattern = Pattern.compile(regex) ; //编译正则
String result[] = pattern.split(str) ; //拆分字符串
for (String temp : result) {
System.out.print(temp);
}
}
}
功能,正则匹配
实例化,依靠Pattern类public Matcher matcher(CharSequence input)
得到对象实现,匹配即替换等功能
简单的应用正则,使用String足够,而如果进行更加烦琐的正则匹配,必须使用java.utli.rePattern类,Matcher类