【JavaSE】常用类库1

常用类库

1.对象清理

对象的清理:
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();
        }
    }

2.对称克隆

利用Object中的clone()方法;属于浅克隆,

浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
总之深浅克隆都会在堆中新分配一块区域,区别在于对象属性引用的对象是否需要进行克隆(递归性的)。

深克隆与浅克隆的区别:
是否克隆对象之中其他引用结构中的数据;

3.生成随机数

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 + "、");  
        }  
    }  
}

4.大数字处理

double基本数据最大可储存:1.7976931348623157E308
若超过此类数字,该怎么处理?
Module java.base
Package java.math
常用的十进制数和浮点数;
【JavaSE】常用类库1_第1张图片

实例化:public BigInteger(String val)
Translates the decimal String representation of a BigInteger into a BigInteger.

5.日期时间

5.1 获得当前日期时间

用Date实例的当前时间就是一个时间戳(毫秒数)
Module java.base
Package java.util Class Date
构造方法中没有被弃用两个构造方法:
实例化:
public Date()
public Date(long date)

5.2 日期时间和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()

6.日历操作

用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天

7.日期格式化

格式化:根据特定的格式进行处理
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

数据类型转换:
【JavaSE】常用类库1_第2张图片

多线程时间日期格式化处理

利用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对象,进行转换不会程序错误,而在,字符串转日期时候会出现错误。

8.正则表达式

字符串的应用,保存数据信息,可以向所有数据类型转换,还有一个主要支持,就是正则表达式。
正则:方便实现是v就的拆分,替换,验证等操作
JDK1.4提供正则开发包:java.util.regex,提供两个核心类:Matcher(匹配)、Pattern(表达式处理)

8.1常用正则标记

public static boolean matches(String regex, CharSequence input)
Compiles the given regular expression and attempts to match the given input against it.
1.单个字符:匹配单个个字符
【JavaSE】常用类库1_第3张图片

2.一组字符:匹配里面的一个字符
【JavaSE】常用类库1_第4张图片

[0-9]:表示0-9数字中的一个
3. 简化表达式 其他标记的简写
【JavaSE】常用类库1_第5张图片

  1. 边界匹配
    ^:匹配开始位置
    $:匹配结束位置
    5.数量表达式(其他表达式出现的的次数正确与否,n是正整数)
    【JavaSE】常用类库1_第6张图片

6.逻辑运算:与、或、非
【JavaSE】常用类库1_第7张图片

8.2String类对正则的支持

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

8.3java.util.regex下两个核心类

Pattern:

主要功能进行正则表达式的编译处理
实例化:调用内部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);  
        }  
    }  
}

Matcher:

功能,正则匹配
实例化,依靠Pattern类public Matcher matcher(CharSequence input)
得到对象实现,匹配即替换等功能
简单的应用正则,使用String足够,而如果进行更加烦琐的正则匹配,必须使用java.utli.rePattern类,Matcher类

你可能感兴趣的:(java,开发语言)